2.5、SpringMVC流程
Spring MVC 框架主要由 DispatcherServlet、处理器映射、控制器、视图解析器、视图等组成,它和其他的MVC框架一样,以请求为驱动,围绕Servlet分派请求和提供功能,DispatcherServlet就是一个实际的Servlet(底层继承HttpServlet)。
根据 DispatcherServlet 内部方法及其各组件总结SpringMVC的流程:
-
客户端发送一个请求到前端控制器DispatcherServlet。
-
前端控制器DispatcherServlet 会对请求URL进行解析,得到请求资源标识符(URI),然后进行判断
-
若映射不存在
- 再判断是否配置了 mvc:default-servlet-handler 静态资源处理,没有配置就出现 404错误
- 如果配置了 mvc:default-servlet-handler 静态资源处理,则进行访问静态资源,如果还没有找到,出现404
-
映射存在,会调用映射器HandlerMapping来进行映射处理,根据请求路径查找相应的Handler对象(处理器)。
-
-
映射器HandlerMapping找到对应的Handler之后,返回该Handler配置的所有相关的对象,即处理器+拦截器组成的 执行链,最后以 HandlerExecutionChain 执行链对象返回给DispatcherServlet
-
DispatcherServlet 接收到执行链之后,调用HandlerAdapter适配器去执行相应的Handler,适配器准备参数和环境后,调用Handler,开始处理业务逻辑。此时将开始执行拦截器的 preHandler(…)方法【正向顺序执行】
-
先开始提取Request中的模型数据,然后 执行Controller 方法内的业务逻辑,开始处理请求,这期间会根据消息转换机制中的顺序对传递的数据进行校验
- 数据类型转换:对请求消息进行数据转换。将请求中的参数转换为控制器方法指定的数据类型,然后再将转换后的参数值传递给控制器方法的形参。
- 数据格式化:对请求消息进行数据格式化,将数据转换成指定的格式(如:金钱¥100000、日期yyyy-MM-dd 等)
- 数据验证:主要验证数据是否合法,验证结果存储到BindingResult或Error中
-
Handler 执行完成后会得到一个ModelAndView,并将其返回给DispatcherServlet。此时将开始执行拦截器的postHandle(…)方法【逆向顺序执行】。
-
DispatcherServlet 接收到ModelAndView之后,调用视图解析器ViewResoler进行视图解析。视图解析器根据逻辑视图名找到真正的View视图,解析后返回给DispatcherServlet。
-
DispatcherServlet 接收到视图之后,会根据ModelAndView中的model(数据)进行视图渲染。此时执行拦截器的afterCompletion(…)方法【逆向顺序执行】。
-
最后将渲染完成的最终的HTML页面,响应给客户端用户。