SpringMVC

发布时间 2023-07-25 20:41:44作者: 溯鸣

SpringMVC简介

SpringMVC是一种基于Java实现MVC模型的轻量级Web框架。
优点:
  使用简单,开发便捷(相比于Servlet)
  灵活性强

入门案例

【第一步】创建web工程(Maven结构);在pom.xml设置tomcat服务器,加载web工程(tomcat插件)

 1 <build>
 2     <plugins>
 3         <plugin>
 4             <groupId>org.apache.tomcat.maven</groupId>
 5             <artifactId>tomcat7-maven-plugin</artifactId>
 6             <version>2.1</version>
 7             <configuration>
 8                 <port>80</port>
 9                 <path>/</path>
10             </configuration>
11         </plugin>
12     </plugins>
13 </build>

【第二步】在pom.xml导入坐标(SpringMVC+Servlet)

 1 <dependencies>
 2     <dependency>
 3         <groupId>javax.servlet</groupId>
 4         <artifactId>javax.servlet-api</artifactId>
 5         <version>3.1.0</version>
 6         <scope>provided</scope>
 7     </dependency>
 8     <dependency>
 9         <groupId>org.springframework</groupId>
10         <artifactId>spring-webmvc</artifactId>
11         <version>5.2.10.RELEASE</version>
12     </dependency>
13 </dependencies>

【第三步】定义处理请求的功能类(UserController)

 1 //定义表现层控制器bean
 2 @Controller
 3 public class UserController {
 4     //设置映射路径为/save,即外部访问路径
 5     @RequestMapping("/save")
 6     //设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
 7     @ResponseBody
 8     public String save(){
 9         System.out.println("user save ...");
10         return "{'info':'springmvc'}";
11     }
12 }

@RequestMapping注解:
  位置:SpringMVC控制器方法定义上方。
  作用:设置当前控制器方法请求访问路径。

注:对于SpringMVC而言,Controller方法返回值默认表示要跳转的页面,没有对应的页面就会报错。如果不想跳转页面而是响应数据,那么就需要在方法上使用@ResponseBody注解。
@ResponseBody注解:
  位置:SpringMVC控制器方法定义上方。
  作用:设置当前控制器方法响应内容为当前返回值,无需解析。

【第四步】编写SpringMVC配置类,加载处理请求的Bean。

1 //springmvc配置类,本质上还是一个spring配置类
2 @Configuration
3 @ComponentScan("com.itheima.controller")
4 public class SpringMvcConfig {
5 }

【第五步】加载SpringMVC配置,并设置SpringMVC请求拦截的路径

 1 //web容器配置类
 2 public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
 3     //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
 4     protected WebApplicationContext createServletApplicationContext() {
 5         //初始化WebApplicationContext对象
 6         AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
 7         //加载指定配置类
 8         ctx.register(SpringMvcConfig.class);
 9         return ctx;
10     }
11 
12     //设置由springmvc控制器处理的请求映射路径
13     protected String[] getServletMappings() {
14         return new String[]{"/"};
15     }
16 
17     //加载spring配置类
18     protected WebApplicationContext createRootApplicationContext() {
19         return null;
20     }
21 }

AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化Web3.0容器的抽象类。
AbstractDispatcherServletInitializer提供三个接口方法供用户实现:
  createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中,而WebApplicationContext的作用范围为ServletContext范围,即整个web容器范围。
  getServletMappings()方法,设定SpringMVC对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理。
  createRootApplicationContext()方法,如果创建Servlet容器时需要加载非SpringMVC对应的bean,使用当前方法进行,使用方式同createServletApplicationContext()。

入门案例工作流程分析

启动服务器初始化过程

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

单次请求过程

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