0%

面试准备系列之Spring MVC

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 的工作流程

  1. 发送请求:用户向服务器发送 HTTP 请求,请求被 Spring MVC 的调度控制器 DispatcherServlet 捕获。
  2. 映射处理器:DispatcherServlet 根据请求 URL ,调用 HandlerMapping 获得该 Handler 配置的所有相关的对象(包括 Handler 对象以及 Handler 对象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回。
  3. 处理器适配:DispatcherServlet 根据获得的 Handler,选择一个合适的HandlerAdapter 。(附注:如果成功获得 HandlerAdapter 后,此时将开始执行拦截器的 #preHandler(…) 方法)。Handler(Controller) 执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象
  4. 解析视图:根据返回的 ModelAndView ,选择一个适合的 ViewResolver(必须是已经注册到 Spring 容器中的 ViewResolver),解析出 View 对象,然后返回给 DispatcherServlet。
  5. 渲染视图 + 响应请求

介绍一下 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 方法返回结果之后执行。
iisheng wechat
微信扫码关注 Coder阿胜