01:导坐标
SpringMVC、Servlet
provided:该包只在编译和测试的时候用,运行的时候无需直接使用tomcat中的,可避免冲突。
<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>
02:创建Controller
用来处理请求,等同于Servlet的功能。
@Controller【类注解】
@RequestMapping("/test")【方法注解】:设置访问路径
@ResponseBody:把返回值作为响应内容(ResponseBody)反馈给发送方(浏览器)
注解改成@RestController,注解就不用每个方法加@ResponseBody注解了
//com.android.controller.UserController
@RestController
public class UserController {
@RequestMapping("/test")
//@ResponseBody
public String test() {
System.out.println("user test");
return "{'module':'springmvc'}";
}
}
03:(一次性工作)SpringMVC 配置类
因为说到底,SpringMVC还是Spring技术,所以需要加载对应的bean
//com.android.config.SpringMvcConfig
@Configuration
@ComponentScan("com.controller")
public class SpringMvcConfig {
}
04:(一次性工作)初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理的请求
当启动tomcat时,SpringMVC的配置得确保能加载成功。
所以,这里定义一个Servlet容器启动配置类,用来加载Spring配置
ServletContainersInitConfig.java,名字无所谓,关键是得继承extends AbstractDispatcherServletInitializer,并重写里面的方法。
- create_Servlet_ApplicationContext:加载springMVC容器配置:
- AnnotationConfig_WebApplicationContext ctx;
- ctx.register(SpringMvcConfig.class);
- getServletMappings:设置哪些请求归springMVC处理
- create_Root_ApplicationContext:加载spring容器配置
//com.android.config.ServletContainersInitConfig
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
流程分析
服务器启动:
- 执行ServletContainersInitConfig类,初始化Web容器;
- 执行createServletApplicationContext方法,创建了WebApplicationContext对象
- 加载SpringMvcConfig
- 执行@ComsponentScan加载对应的bean(UserController)
- 加载UserController,其中每个@RequestMapping的路径对应一个具体的方法
- 执行getServletMappings,让所有请求都通过SpringMVC
单次请求:
- 发送localhost/save
- (Web容器发现所有请求都通过SpringMVC)将请求交给SpringMVC处理
- 解析请求路径/save
- /save 匹配到 save()
- 执行save()
- (检测到@ResponseBody)直接将save()方法返回值作为响应体返回给请求方