SSM学习7:SpringMVC简介、SpringMVC入门案例、SpringMVC bean加载控制

avatar
作者
猴君
阅读量:0

SpringMVC简介

Spring MVCSpring 框架的一部分,它是一个用于构建 Web 应用程序的模型-视图-控制器(Model-View-Controller,MVC)框架。Spring MVC 提供了一种清晰的方式来分离业务逻辑、用户界面和控制流程,使得应用程序更加模块化、易于维护和扩展。

SpringMVC入门案例

注意点

  • 导入依赖
 <dependencies>    <dependency>      <groupId>javax.servlet</groupId>      <artifactId>javax.servlet-api</artifactId>      <version>3.1.0</version>      <scope>provided</scope>    </dependency>    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-webmvc</artifactId>      <version>5.2.10.RELEASE</version>    </dependency>  </dependencies>    <build>     <plugins>       <plugin>         <groupId>org.apache.tomcat.maven</groupId>         <artifactId>tomcat7-maven-plugin</artifactId>         <version>2.1</version>         <configuration>           <port>80</port>           <path>/</path>         </configuration>       </plugin>     </plugins>   </build> 
  • 创建SpringMVC控制器类
//定义表现层控制器bean @Controller public class UserController {      //设置映射路径为/save,即外部访问路径     @RequestMapping("/save")     //设置当前操作返回结果为指定json数据(本质上是一个字符串信息)     @ResponseBody     public String save(){         System.out.println("user save ...");         return "{'info':'springmvc'}";     }      //设置映射路径为/delete,即外部访问路径     @RequestMapping("/delete")     @ResponseBody     public String delete(){         System.out.println("user save ...");         return "{'info':'springmvc'}";     } } 
  • 初始化SpringMVC环境(同Spring环境),设置SpringMVC加载对应的bean

config/SpringMvcConfig .class

//springmvc配置类,本质上还是一个spring配置类 @Configuration @ComponentScan("com.itheima.controller") public class SpringMvcConfig { } 
  • 初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理的请求
    config/ServletContainersInitConfig.class
//web容器配置类 public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {     //加载springmvc配置类,产生springmvc容器(本质还是spring容器)     protected WebApplicationContext createServletApplicationContext() {         //初始化WebApplicationContext对象         AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();         //加载指定配置类         ctx.register(SpringMvcConfig.class);         return ctx;     }      //设置由springmvc控制器处理的请求映射路径     protected String[] getServletMappings() {         return new String[]{"/"};     }      //加载spring配置类     protected WebApplicationContext createRootApplicationContext() {         return null;     } } 

注解

  • 名称:@Controller
  • 类型:类注解
  • 位置:SpringMVC控制器类定义上方
  • 作用:设定SpringMVC的核心控制器bean
  • 示例
@Controller public class UserController { } 
  • 名称:@RequestMapping
  • 类型:方法注解
  • 位置:SpringMVC控制器方法定义上方
  • 作用:设置当前控制器方法请求访问路径
  • 示例
 //设置映射路径为/save,即外部访问路径  @RequestMapping("/save")  public String save(){      System.out.println("user save ...");      return "{'info':'springmvc'}";  } 
  • 名称:@ResponseBody
  • 类型:方法注解
  • 位置:SpringMVC控制器方法定义上方
  • 作用:设置当前控制器方法响应内容为当前返回值,无需解析
  • 示例
  //设置映射路径为/save,即外部访问路径   @RequestMapping("/save")   //设置当前操作返回结果为指定json数据(本质上是一个字符串信息)   @ResponseBody   public String save(){       System.out.println("user save ...");       return "{'info':'springmvc'}";   } 

工作流程

  • 启动服务器初始化过程

    • 服务器启动,执行ServletContainersInitConfig类,初始化web容器
    • 执行createServletApplicationContext方法,创建了WebApplicationContext对象
    • 加载SpringMvcConfig
    • 执行@ComponentScan加载对应的bean
    • 加载UserController,每个@RequestMapping的名称对应一个具体的方法
    • 执行getServletMappings方法,定义所有的请求都通过SpringMVC
  • 单次请求过程

    • 发送请求localhost/save
    • web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理
    • 解析请求路径/save
    • /save匹配执行对应的方法save()
    • 执行save()
    • 检测到有@ResponseBody直接将save()方法的返回值作为响应体返回给请求方

SpringMVC bean加载控制

Controller加载控制与业务bean加载控制

  • SpringMVC相关bean(表现层bean
  • Spring控制的bean
    • 业务bean (Service)
    • 功能bean (DataSource等)

因为功能不同,如何避免Spring错误的加载到SpringMVCbean
SpringMVC加载的bean对应的包均包含在controller包内,Spring加载的bean设定扫描范围为精准范围,例如service包、dao

config/SpringConfig.class

@Configuration @ComponentScan({"com.itheima.service","com.itheima.dao"}) public class SpringConfig { } 

config/SpringMvcConfig.class

@Configuration @ComponentScan("com.itheima.controller") public class SpringMvcConfig { }  

config/ServletContainersInitConfig.class

//web配置类简化开发,仅设置配置类类名即可 public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {      protected Class<?>[] getRootConfigClasses() {         return new Class[]{SpringConfig.class};     }      protected Class<?>[] getServletConfigClasses() {         return new Class[]{SpringMvcConfig.class};     }      protected String[] getServletMappings() {         return new String[]{"/"};     } } 

或者

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {     protected WebApplicationContext createServletApplicationContext() {         AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();         ctx.register(SpringMvcConfig.class);         return ctx;     }     protected WebApplicationContext createRootApplicationContext() {         AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();         ctx.register(SpringConfig.class);         return ctx;     }     protected String[] getServletMappings() {         return new String[]{"/"};     }  } 

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!