Spring mvc的理解
1. DispatcherServlet(前端核心控制器)理解
dispatcherServilet 可以理解为一个转发器不负责处理只负责转发给其它工具进行处理,处理好之后在给它,最后由dispatcherServlet给客服端。
2. HandlerMapping(处理器映射器)的理解
handlerMapping 可以理解成一个spring初始化形成的一个handlerMap ,map的key是 请求的地址url value是 handler,请求的逻辑说白了就是controller的里面的方法,value里面不只有controller 还有多个 interceptor,这里的interceptor可以理解成aop (包含preHandle(请求前)、postHandle(请求提交)、afterCompletion(请求完成后拦截))
preHandle
调用时间:Controller方法处理之前
执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行
若返回false,则中断执行,注意:不会进入afterCompletion
postHandle
调用前提:preHandle返回true
调用时间:Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作
执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序倒着执行。
备注:postHandle虽然post打头,但post、get方法都能处理
afterCompletion
调用前提:preHandle返回true
调用时间:DispatcherServlet进行视图的渲染之后
多用于清理资源
官方叫法:执行链(HandlerExecutionChain) ,找到具体的执行链返回给dispatcherServlet 。
为什么要返回给dispatcherServlet那 因为handlerMapping只是一个map没有方法去执行只能返回给dispatcherServlet让它把执行链交给能处理的工具。这个能处理的工具叫handlerAdapter(处理器适配器)
3. HandlerAdapter(处理器适配器)的理解
handlerAdapter 那个执行链 可以寻找要使用那个Adapter处理 ,
mvc有三个adapter
- 实现 Controller接口
- 实现 httpRequestHandler接口
- 使用 @Controller注解
通过 supports方法判断要使用那个方式的 adapter
如何adapter发现不是数据类型的而是页面类型的进行封装成一个modeAndView(模型数据和视图信息)给dispacherServlet
(为什么有要给 dispacherServlet 因为所有工具只能通过dispacherServlet 进行通信,handlerAdaper 是没有办法和客户端进行交互的 能和客户端进行交互并可以联系其他工具的只有dispacherServlet)
如果是数据类型ResponseBody 直接方法给dispacherServlet,dispacherServlet返回给客户端就行如何是页面的话那就有请我们的试图解析器(viewResolver)
4. ViewResolver
dispacherServlet发现不是数据类而是modeAndView(模型数据和视图信息) 就开始调用ViewResolver(视图解析器) viewResolver进行试图解析,把对应的试图解析出来,返回给dispatcherServlet ,dispatcherServlet进行最后渲染返回给客户端