SpringMVC框架是一个基于请求驱动的Web框架,并且使用了前端控制器模型来进行设计,再根据请求映射规则分发给相应的页面控制器进行处理。

(一)整体流程

java springmvc后台校验 springmvc怎么处理请求_MVC

具体步骤:

1、 首先用户发送请求到前端控制器,前端控制器根据请求信息(如 URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;图中的 1、2 步骤;

2、 页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在 Spring Web MVC 中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个 ModelAndView(模型数据和逻辑视图名);图中的 3、4、5 步骤;

3、 前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;图中的步骤 6、7;

4、 前端控制器再次收回控制权,将响应返回给用户,图中的步骤 8;至此整个结束。

(二)Spring MVC 的核心组件

java springmvc后台校验 springmvc怎么处理请求_初始化_02

大致步骤:

  • ① 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 中的某个方法。

  1. 在Spring 中先将URL和Controller的对应关系保存到Map<url,Controller>中。Web容器启动时会通知Spring初始化容器(加载Bean的定义信息和初始化所有单例Bean),然后Spring MVC会遍历容器中的Bean,获取每一个Controller中的所有方法访问的URL,将URL和Controller保存到一个Map中。
  2. 这样就可以根据URL请求快速定位到Controller。
  3. 因为最终处理请求的是Controller中的方法,Map中只保留了URL和Controller的对应关系,所以要根据请求的URL进一 步确认Controller中的方法。其原理就是拼接Controller 的URL ( Controller @RequestMapping的值)和方法的URL ( Method上@RequestMapping的值),与请求的URL进行匹配,找到匹配的方法。
  4. 确定处理请求的方法后,接下来的任务就是参数绑定,把请求中的参数绑定到方法的形式参数上,这是整个请求处理过程中最复杂的一步。

(三)核心流程

java springmvc后台校验 springmvc怎么处理请求_java springmvc后台校验_03

具体步骤:

第一步:发起请求到前端控制器(DispatcherServlet)

第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找)

第三步:处理器映射器HandlerMapping向前端控制器返回Handler,HandlerMapping会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象,多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易添加新的映射策略

第四步:前端控制器调用处理器适配器去执行Handler

第五步:处理器适配器HandlerAdapter将会根据适配的结果去执行Handler

第六步:Handler执行完成给适配器返回ModelAndView

第七步:处理器适配器向前端控制器返回ModelAndView (ModelAndView是springmvc框架的一个底层对象,包括 Model和view)

第八步:前端控制器请求视图解析器去进行视图解析 (根据逻辑视图名解析成真正的视图(jsp)),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可

第九步:视图解析器向前端控制器返回View

第十步:前端控制器进行视图渲染 (视图渲染将模型数据(在ModelAndView对象中)填充到request域)

第十一步:前端控制器向用户响应结果