SpringMVC框架是一个基于请求驱动的Web框架,并且使用了前端控制器模型来进行设计,再根据请求映射规则分发给相应的页面控制器进行处理。
(一)整体流程
具体步骤:
1、 首先用户发送请求到前端控制器,前端控制器根据请求信息(如 URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;图中的 1、2 步骤;
2、 页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在 Spring Web MVC 中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个 ModelAndView(模型数据和逻辑视图名);图中的 3、4、5 步骤;
3、 前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;图中的步骤 6、7;
4、 前端控制器再次收回控制权,将响应返回给用户,图中的步骤 8;至此整个结束。
(二)Spring MVC 的核心组件
大致步骤:
- ① DispatcherServlet是Spring MVC中的前端控制器( Front Controller),负责接收Request并将Request转发给对应的处理组件。
- ② HanlerMapping是Spring MVC中完成URL到Controller映射的组件。DispatcherServlet 接收Request,然后从HandlerMapping查找处理Request的Controller.
- ③ Controller处理Request,并返回ModelAndView对象。Controller 是Spring MVC中负责处理Request的组件(类似于Struts 2中的Action),ModelAndView 是封装结果视图的组件。
- ④、⑤、⑥是视图解析器解析ModelAndView对象并返回对应的视图给客户端的过程。
Spring MVC 处理流程
容器初始化时会建立所有URL和Controller中方法的对应关系,保存到Handler Mapping中。
用户请求时根据请求的URL快速定位到Controller 中的某个方法。
- 在Spring 中先将URL和Controller的对应关系保存到Map<url,Controller>中。Web容器启动时会通知Spring初始化容器(加载Bean的定义信息和初始化所有单例Bean),然后Spring MVC会遍历容器中的Bean,获取每一个Controller中的所有方法访问的URL,将URL和Controller保存到一个Map中。
- 这样就可以根据URL请求快速定位到Controller。
- 因为最终处理请求的是Controller中的方法,Map中只保留了URL和Controller的对应关系,所以要根据请求的URL进一 步确认Controller中的方法。其原理就是拼接Controller 的URL ( Controller @RequestMapping的值)和方法的URL ( Method上@RequestMapping的值),与请求的URL进行匹配,找到匹配的方法。
- 确定处理请求的方法后,接下来的任务就是参数绑定,把请求中的参数绑定到方法的形式参数上,这是整个请求处理过程中最复杂的一步。
(三)核心流程
具体步骤:
第一步:发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找)
第三步:处理器映射器HandlerMapping向前端控制器返回Handler,HandlerMapping会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象,多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易添加新的映射策略
第四步:前端控制器调用处理器适配器去执行Handler
第五步:处理器适配器HandlerAdapter将会根据适配的结果去执行Handler
第六步:Handler执行完成给适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView (ModelAndView是springmvc框架的一个底层对象,包括 Model和view)
第八步:前端控制器请求视图解析器去进行视图解析 (根据逻辑视图名解析成真正的视图(jsp)),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可
第九步:视图解析器向前端控制器返回View
第十步:前端控制器进行视图渲染 (视图渲染将模型数据(在ModelAndView对象中)填充到request域)
第十一步:前端控制器向用户响应结果