Spring MVC 请求流程
Spring 将请求在调度 Servlet、处理器映射、控制器以及视图解析器之间移动。
请求从离开浏览器到获取响应返回会经历好多站点,如下图展示了使用 Spring MVC 时经历的所有站点。
Image_112.png
-
DsipatcherServlet
Spring MVC 的所有请求都会通过一个前端请求控制器 Servlet 来映射需要交给 Spring MVC 进行处理的请求,并处理整个请求并获得响应。 -
控制器、处理器映射
前端控制器会将请求发送给 Spring MVC 控制器(Controller),DispatcherServlet 会通过查询一个或多个处理器映射(handler mapping)来确定具体的控制器及处理器。 -
处理器进行逻辑处理(业务)
处理器进行业务逻辑处理,通常会产生模型(model),通常还需要将模型对应到一个视图(view),控制器所做的最后一件事就是将模型数据打包,将模型和视图信息发送回 DispatcherServlet,这样,控制器就不会与具体的视图耦合。 -
视图解析器解析和渲染 ModelAndView
DispatcherServlet 已经知道应该由哪个视图(view)来渲染数据(model),不过还需要通过视图解析器(view resolver)来找到具体的视图实现。
两个应用上下文
搭建 Spring MVC 有两种方式,在 web.xml 中进行配置,或 Java 中继承 AbstractAnnotationConfigDispatcherServletInitializer。
- 当 DsipatcherServlet 启动时,它会创建 Spring 应用上下文,并加载配置文件或配置类中声明的 bean。
- 但在 Spring 中通常还有另外一个上下文,该上下文由 ContextLoaderListener 创建。
我们期望 DispatcherServlet 加载包含 web 组件的 bean,如控制器、视图解析器以及处理器映射,而 ContextLoaderListener 加载其他的 bean,这些 bean 通常是驱动后端的中间层和数据层组件。
使用 AbstractAnnotationConfigDispatcherServletInitializer(Servlet 3.0) 使用 Spring MVC 时,会同时创建两个上下文。
image.png
启用 Spring MVC
- 使用 xml 进行配置时可通过 <mvc:annotation-driven> 启用注解驱动的 Spring MVC
- 基于 java 进行配置时使用 @EnableWebMvc 注解进行启用,通过继承 WebMvcConfigurerAdapter 来进行一些初始配置(否则将使用默认的配置),如视图解析器、静态资源处理
@Configuration // 定义 DispatcherServlet 应用上下文中的 bean
@EnableWebMvc // 启用 spring mvc
@ComponentScan("com.duan.springmvcdemo") // 启用组件扫描
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable(); // 静态资源处理
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
}
}
使用 Thymeleaf
使用 Thymeleaf 前需要做的配置:
- ThymeleafViewResolver 将逻辑视图名转为 Thymeleaf 模板视图名
- SpringTemplateEngine 处理模板并渲染结果
- TemplateResolver 加载 Thymeleaf 模板
使用 xml 中声明 bean 的方式也可完成。
Thymeleaf 便签对应到标准的 HTML 属性(th:xxx),并且能够直接加载到浏览器中进行查看(区别于 JSP)。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>HOME</title>
<link rel="stylesheet"
type="text/css"
th:href="@{/resources/style.css}">
</head>
<body>
<!--Not allowed to load local resource chrome 安全考虑,安装插件可解决-->
<img th:src="${spitterAvatar}">
<form method="post" enctype="multipart/form-data" action="/spitter/doRegister">
<label>
Profile Picture
</label>
<input type="file" name="profilePicture" accept="image/jpeg,image/png,image/gif"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
网友评论