介绍下 Spring MVC 的核心组件?
有很多,主要以下三个常用
HandlerMapping
HandlerAdapter
HandlerExceptionResolver
Spring MVC容器初始化过程(Spring和Servlet集成)
当我们启动一个WEB项目容器时,容器包括(JBoss,Tomcat等)。首先会去读取web.xml配置文件里的配置。
http://svip.iocoder.cn/Spring-MVC/context-init-Root-WebApplicationContext/
web.xml中会配置两个关键项:listen : ContextLoaderListener 和 servlet : DispatcherServlet
- ContextLoaderListener 会监听tomcat启动创建的servletContext,并根据application.xml创建一个ROOT WebApplicationContext 容器(1).同时,会将这个容器注入到servletContext容器中。
- DispatcherServlet 创建一个Servlet WebApplicationContext 容器 (2),但(2)容器是(1)容器的子容器
ROOT WebApplicationContext
上面的ContextLoaderListener类继承关系如下,这是它能监听tomcat启动,并创建spring业务容器的原因。
这个过程创建的是业务层的容器,比如service, dao等
Servlet WebApplicationContext
创建的是web层的容器,比如Controller、HandlerMapping、ViewResolver等
DispatchServlet的类层次如下
整个过程如下:
描述一下 DispatcherServlet 的工作流程?
大致流程
(1)发送请求:被DispatcherServlet的servlet-mapping捕获
(2)映射处理器:DispatcherServlet根据URL,调用HandlerMapping返回配置的handler
(3)处理适配器:DispatcherServlet根据返回的handler,选择一个合适的HandlerAdapter,进行拦截(prehandler),业务处理handler(即controler中的逻辑),结果加工(数据校验,参数转换,数据格式化,返回结果实例化等)
(4)handlerAdapter处理完handler之后DispatcherServlet将返回ModelAndView 对象(也可能是JSON,用 HttpMessageConverter 转换)
(5)根据返回的ModelAndView,DispatchServlet选择合适的ViewResolver,解析出view对象,再返回给DispatchServlet
(6)DispatchServlet调用ViewResolver 解析Modle和View生成页面返回给客户端
注意,如果第(4)步返回的是JSON,那么就没有第(5)和第(6)步了,也就是前后端分离的场景。
整个过程流程如下
Spring MVC 的异常处理?
Spring mvc提供了异常解析器 Handler,它可以将handler处理期间发生的异常,装换成对应的ModelAndView结果。
具体方法:
- 就是用controller去继承基类,基类中用@ExceptionHandler去注解用来处理异常的方法,最终解析成ModelAndView
- 与上面类似的方法是去实现一个接口(JDK8),接口中用@ExceptionHandler去注解default方法。
- 最优雅的方法,定义全局异常处理器,用@ControllerAdvice注解全局异常处理类,相当于给每个controller类都做了增强代理。
详细介绍下 Spring MVC 拦截器?Spring MVC 的拦截器可以做哪些事情?
接口 org.springframework.web.servlet.HandlerInterceptor
方法:
preHandle(), 在HandlerAdapter.handle之前执行。多个preHandle执行只要一个返回false,controller就不再调用
postHandle() , 在handle之后执行
afterCompletion() ,处理完hanle(即controller)返回结果后执行(可修改结果?)
拦截器作用:
- 记录访问日志。
- 记录异常日志。
- 需要登陆的请求操作,拦截未登陆的用户。
- 。。。。。
HttpMessageConverter 在 Spring REST 中代表什么?
HttpMessageConverter是一个策略接口,Spring REST(根据HTTP头的accept类型)使用对应的接口返回HTTP 请求的格式的数据