学习Spring MVC时间有点长了,但是最近打算找工作,需要重新了解下,所以又去温故知新了。Spring MVC就是用来写web的框架,简化你写web的一些不必要的流程,让程序员能专注于业务逻辑也就是controller的代码编写。这篇文章是比较详细的描述Spring MVC的流程Spring MVC 流程图 ,下面我在此基础上做一些补充说明。
首先讲一下SpringMVC处理请求的流程。如下图所示:
Spring工作流程描述:
1. 用户向服务器发送URL请求,请求被Spring前端控制的DispatcherServlet捕获进行处理;
2. DispatcherServlet对请求URL进行解析,去HandlerMapping中获取对应的Handler处理器(也就是Controller类中相应的处理方法),
然后返回一个HandlerExcutionChain执行链给DispatcherServlet,执行链中包括对应的Handler处理器以及若干个拦截器;
3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法);
补充一点:为什么需要先调用HandlerAdapter呢?
答:Handler的书写方式可以是不一样的,可能是注解,也可能是你自己写的handle,就是继承某个类,实现某一个接口的。此时就需要HandlerAdapter根据你传过来的HandlerExcutionChain中的Handler找到你真正需要的Handler;
重点说一下HandlerAdaper:
(1)DispatcherServlte会根据配置文件信息注册HandlerAdapter,如果在配置文件中没有配置,那么DispatcherServlte会获取HandlerAdapter的默认配置,如果是读取默认配置的话,DispatcherServlte会读取DispatcherServlte.properties文件,该文件中配置了三种HandlerAdapter:HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter和AnnotationMethodHandlerAdapter(3.1以后已经过时,使用RequestMappingHandlerAdapter)。
DispatcherServlte会将这三个HandlerAdapter对象存储到它的handlerAdapters这个集合属性中,这样就完成了HandlerAdapter的注册。
(2)DispatcherServlte会根据handlerMapping传过来的controller与已经注册好了的HandlerAdapter一一匹配,看哪一种HandlerAdapter是支持该controller类型的,
如果找到了其中一种HandlerAdapter是支持传过来的controller类型,那么该HandlerAdapter会调用自己的handle方法,handle方法运用java的反射机制执行controller的具体方法来获得ModelAndView,
例如SimpleControllerHandlerAdapter是支持实现了controller接口的控制器,如果自己写的控制器实现了controller接口,那么SimpleControllerHandlerAdapter就会去执行自己写控制器中的具体方法来完成请求。
4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息:
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
5. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象,
其中,model是数据模型,就是处理后传回来的数据;view就是视图名称,你需要将model数据放进去的视图的名称;
6. 根据返回的ModelAndView,去ViewResolver查询视图(必须是已经注册到Spring容器中的ViewResolver),然后返回一个真正的视图,返回给DispatcherServlet ;
7. DispatcherServlet 根据获得的真正视图以及model数据,渲染视图
8. 将渲染结果返回给客户端。
参考文献:
spring MVC处理请求过程及配置详解