SpringMVC执行流程流程版

topb3222 / 2023-08-23 / 原文

1.用户向服务器发送请求,请求被SpringMVC前端控制器DispatcherServlet捕获。

2.DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI),判断请求URI对应的映射:

a.不存在

i.再次判断是否配置mvc:default-servlet-handler

ii:如果开启default-servlet-:会先交给DispatherServlet处理,处理不了交给default-servlet处理,404

  细节:

    开启了mvc:annotation-driven:先交给前端控制器处理,处理不了交给default-servlet处理。

    没有开启mvc:annotation-driven:全部交给default-servlet处理。

iii:如果没有配置mvc:default-servlet-handler

  前端控制器处理不了

 

b.存在执行下面的流程:

3.根据URI,调用HandlerMappring获得该Handler配置得所有相关的对象(包含Handler对象以及Handler对象对应的拦截器),最后HandlerExecutionChain执行链对象的形式返回。

4.DispatcherServlet根据获得的Handler,选择合适的HandlerAdapter。

5.如果成功获得HandlerAdapter,此时将开始执行拦截器的preHandler(...)方法【正向】

6.提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)方法,处理请求。在填充Handler的入参过程中,根据您的配置,Spring将帮你做一些额外的各种:

a) HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息

b) 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等

c) 数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等

d) 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中

7.Handler执行完成后,向DispatcherServlet返回一个ModleAndView对象。

8.此时将开始执行拦截器的postHandle(...)方法【逆向】

9.根据返回的ModleAndView(此时会判断是否存在异常,如果存在异常,则执行HandlerExceptionResolver进行异常处理)选择一个合适的ViewResolver进行视图解析,根据Model和View,来渲染视图.

10.渲染视图完毕执行拦截器的afterCompletion(...)方法【逆向】