SpringMvc原理分析

springmvc的工作原理图:
在这里插入图片描述
SpringMVC流程
1、 用户发送请求至前端控制器DispatcherServlet的doDispatcher方法(其实在前端控制器收到请求时会创建springmvc容器,如果存在spring容器,则将spring容器向下转型得到springmvc容器,如果不存在则创建springmvc的ioc容器,所以spring和springmvc是父子容器的关系)。

2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。HandlerMapping其实只有一个HandlerExecutionChain getHandler(HttpServletRequest request);方法。作用是根据当前请求的找到对应的 Handler(HandlerMethod(Controller 中的方法)、 Controller 对象),并将 Handler 与一堆 HandlerInterceptor (拦截器)封装到
HandlerExecutionChain 对象中。

3.5、在执行目标方法之前,会看看有没有拦截器,有的话,执行拦截器的preHandler方法

4、 DispatcherServlet调用HandlerAdapter处理器适配器(利用 RequestMappingHandlerMapping 获取的 Handler 是 HadnlerMethod 类型,它代表 Controller 里要执行的方法,将handler传递给HandlerAdapter。)。

5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器),HandlerAdapter其实是将当前的Handler进行匹配,判断是哪一种类型(基于注解实现d的requestMappingHandlerAdapter,基于配置文件实现的simpleControllerHandlerAdapter(其本质也是执行 Controller 中的 handleRequest 方法),HttpRequestHandlerAdapter(其实就是 Controller 中的 handleRequest 方法),还有用于适配Servlet的SimpleServletHandlerAdapter (其最终执行的方法是 Servlet 的 service 方法))。

适配器执行目标方法返回ModelAndView:
1)、ModelAttribute注解标注的方法提前运行(即隐含模型,添加参数什么的)
2)、执行目标方法的时候(确定目标方法用的参数)

  1. 有注解
  2. 没注解:
    1)、看是否Model、Map以及其他的
    2)、如果是自定义类型
    1)、从隐含模型中看有没有,如果有就从隐含模型中拿
    2)、如果没有,再看是否SessionAttributes表注的属性,如果是从Session中拿,如果拿不到会抛异常
    3)、都不是,就利用反射创建对象

5.5、在执行目标方法之后,会看看有没有拦截器,有的话,执行拦截器的postHandler方法

6、 Controller执行完成返回ModelAndView。

6.5、在渲染视图之后,会看看有没有拦截器,有的话,执行拦截器的postHandl方法

7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器(将逻辑试图转换成物理视图的过程,例如,如果有异常,异常解析器处理异常,处理完之后还会返回ModelAndView)。

9、 ViewReslover解析后返回具体View。
调用render进行页面渲染:
1)、试图解析器根据试图名得到视图对象
2)、试图对象调用render方法

10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中,模型数据是保存在request对象中的)。

10.5、执行拦截器的afterCompletion方法(如果有拦截器的话)

11、 DispatcherServlet响应用户。

其实这里的Handler可以说就是我们编写的controller。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值