Spring MVC 各组件以及功能
- MultipartResolver:内容类型( Content-Type )为
multipart/*
的请求的解析器接口 - LocaleResolver:本地化( 国际化 )解析器接口
- ThemeResolver:主题解析器接口(例如,从请求头 User-Agent ,判断使用 PC 端,还是移动端的主题)
- HandlerMapping:处理器匹配接口,根据请求( handler )获得其的处理器( handler )和拦截器们( HandlerInterceptor 数组 )
- HandlerAdapter:处理器适配器接口
- HandlerExceptionResolver:处理器异常解析器接口,将处理器( handler )执行时发生的异常,解析( 转换 )成对应的 ModelAndView 结果
- RequestToViewNameTranslator:请求到视图名的转换器接口
- ViewResolver:实体解析器接口,根据视图名和国际化,获得最终的视图 View 对象
- FlashMapManager:FlashMap 管理器接口,负责重定向时,保存参数到临时存储中
DispatcherServlet 的工作流程
- 发送请求:用户向服务器发送 HTTP 请求,请求被 Spring MVC 的调度控制器 DispatcherServlet 捕获。
- 映射处理器:DispatcherServlet 根据请求 URL ,调用 HandlerMapping 获得该 Handler 配置的所有相关的对象(包括 Handler 对象以及 Handler 对象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回。
- 处理器适配:DispatcherServlet 根据获得的 Handler,选择一个合适的HandlerAdapter 。(附注:如果成功获得 HandlerAdapter 后,此时将开始执行拦截器的 #preHandler(…) 方法)。Handler(Controller) 执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象
- 解析视图:根据返回的 ModelAndView ,选择一个适合的 ViewResolver(必须是已经注册到 Spring 容器中的 ViewResolver),解析出 View 对象,然后返回给 DispatcherServlet。
- 渲染视图 + 响应请求
介绍一下 WebApplicationContext ?
WebApplicationContext 是实现ApplicationContext接口的子类,专门为 WEB 应用准备的。
- 它允许从相对于 Web 根目录的路径中加载配置文件,完成初始化 Spring MVC 组件的工作。
- 从 WebApplicationContext 中,可以获取 ServletContext 引用,整个 Web 应用上下文对象将作为属性放置在 ServletContext 中,以便 Web 应用环境可以访问 Spring 上下文。
Spring MVC 运行流程图
Spring MVC拦截器
org.springframework.web.servlet.HandlerInterceptor
,拦截器接口。代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25// HandlerInterceptor.java
/**
* 拦截处理器,在 {@link HandlerAdapter#handle(HttpServletRequest, HttpServletResponse, Object)} 执行之前
*/
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
/**
* 拦截处理器,在 {@link HandlerAdapter#handle(HttpServletRequest, HttpServletResponse, Object)} 执行成功之后
*/
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
/**
* 拦截处理器,在 {@link HandlerAdapter#handle(HttpServletRequest, HttpServletResponse, Object)} 执行完之后,无论成功还是失败
*
* 并且,只有该处理器 {@link #preHandle(HttpServletRequest, HttpServletResponse, Object)} 执行成功之后,才会被执行
*/
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
- 一共有三个方法,分别为:
#preHandle(...)
方法,调用 Controller 方法之前执行。#postHandle(...)
方法,调用 Controller 方法之后执行。#afterCompletion(...)
方法,处理完 Controller 方法返回结果之后执行。