15.1、常用组件
15.1.1、 DispatcherServlet
DispatcherServlet 是前端控制器,由框架提供,不需要工程师开发;
作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求。
15.1.2、HandlerMapping
HandlerMapping 是处理器映射器,由框架提供,不需要工程师开发;
作用:根据请求的 url、method 等信息去查找 Handler(即控制器方法)。
15.1.3、Handler
Handler 是处理器(即控制器方法),需要工程师开发;
作用:对匹配的用户请求进行具体处理。
15.1.4、HandlerAdapter
HandlerAdapter 是处理器适配器,由框架提供,不需要工程师开发;
作用:通过 HandlerAdapter 来调用处理器(即控制器方法)。
15.1.5、ViewResolver
ViewResolver 是视图解析器,由框架提供,不需要工程师开发;
作用:进行视图解析,得到相应的视图,例如:ThymeleafView、InternalResourceView、RedirectView。
15.1.6、View
View 是视图,,需要工程师开发;
作用:将共享域中的数据通过页面展示给用户。
15.2、执行流程
-
用户向服务器发送请求,请求被 SpringMVC 的前端控制器 DispatcherServlet 捕获;
-
DispatcherServlet 对请求 URL 进行解析,得到 URI ,判断请求 URI 对应的映射是否存在;
-
如果请求 URI 对应的映射不存在:
-
再判断是否配置了 mvc:default-servlet-handler :
-
如果没配置,则控制台日志显示找不到请求对应的目标资源,客户端展示404错误;
-
如果有配置,则访问目标资源(一般为静态资源,如:JS,CSS,HTML);若目标资源不存在,客户端也会展示404错误。
-
-
-
如果请求 URI 对应的映射存在,则执行以下流程:
-
根据该 URI ,调用 HandlerMapping 获得该 Handler 配置的所有相关的对象(包括Handler对象以及对应的拦截器),
最后以 HandlerExecutionChain (处理器执行链对象)的形式返回; -
DispatcherServlet 根据获得的 Handler ,选择一个合适的 HandlerAdapter ;
-
如果成功获得了 HandlerAdapter ,此时将开始执行对应拦截器的 preHandler() 方法【正向】;
-
提取 Request (请求)中的数据,填充到 Handler 的入参,开始执行 Handler(控制器方法)对用户请求进行具体处理;
在填充 Handler 的入参过程中,根据控制器方法的配置,Spring将帮忙做一些额外的工作:-
HttpMessageConverter(常用): 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
-
数据转换(常用):对请求消息进行数据转换,如将 String 转换成 Integer、Double 等
-
数据格式化(少用):对请求消息进行数据格式化,如将字符串转换成格式化数字或格式化日期等
-
数据验证(少用):验证数据的有效性(长度、格式等),验证结果存储到 BindingResult 或 Error 中
-
-
Handler 执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象;
(此时会判断 Handler 执行是否存在异常,如果存在异常,则执行 HandlerExceptionResolver 进行异常处理) -
如果 Handler 执行不存在异常,则执行对应拦截器的 postHandle() 方法【逆向】,存在异常则跳过该步骤;
-
根据返回的ModelAndView 选择一个适合的 ViewResolver 进行视图解析,根据 Model 和 View 来渲染视图;
-
渲染视图完毕后,执行对应拦截器的 afterCompletion() 方法【逆向】;
-
将渲染结果返回给客户端。
-
-