![深入分析SpirngMVC源码](http://p2.ttnews.xyz/loading.gif)
SpirngMVC流程综述
- 用户发送请求至前端控制器DispatcherServlet。
- DispatcherServlet收到请求调用HandlerMapping处理器映射器。
- 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
- DispatcherServlet调用HandlerAdapter处理器适配器。
- HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
- Controller执行完成返回ModelAndView。
- HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
- ViewReslover解析后返回具体View。
- DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
- DispatcherServlet响应用户。
![深入分析SpirngMVC源码](http://p2.ttnews.xyz/loading.gif)
以下开始源码分析
xml配置文件如下:
<code>
<web-app>\txmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
\txsi:schemaLocation="http://java.sun.com/xml/ns/javaee
\thttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
\t
\t
\t<servlet>
\t\t<servlet-name>springmvc/<servlet-name>
\t\t<servlet-class>org.springframework.web.servlet.DispatcherServlet/<servlet-class>
\t\t<init-param>
\t\t\t<param-name>contextConfigLocation/<param-name>
\t\t\t<param-value>classpath:springmvc.xml/<param-value>
\t\t/<init-param>
\t\t<load-on-startup>1/<load-on-startup>
\t/<servlet>
\t<servlet-mapping>
\t\t<servlet-name>springmvc/<servlet-name>
\t\t<url-pattern>//<url-pattern>
\t/<servlet-mapping>
/<web-app>/<code>
从DispatcherServlet中进入源码,选中DispatcherServlet,在eclipse中按F4会发现,其实DispatcherServlet是继承了HttpServlet的,我们都知道HttpServlet 的生命周期是先实例化,初始化,处理请求,销毁,在初始化时是执行HttpServlet的init()方法,处理请求执行HttpServlet的service()或doGet或doPost方法,销毁是执行HttpServlet的destory()方法。
init()方法
下面我们来看看init()方法中SpringMVC干了什么
最终发现init()是在HttpServletBean类中,并且是final修饰的方法,说明子类中是不存在其他init()方法,在init()方法中调用了initServletBean(),按住CTRL+鼠标左键点击进入查看子类FrameworkServlet的实现。
在FrameworkServlet的initServletBean()方法中调用了initWebApplicationContext()方法,查看其源码
- 518行:WebApplicationContext是Spring容器,得到Spring容器rootContext
- 524行:得到SpringMVC容器wac
- 533行:将rootContext设置为wac的父容器,所有很多人说Spring是SpringMVC的父容器 其他暂不考虑,有兴趣自行了解
service()方法
下面我们来看看service()方法都干了什么。
service()方法通过调用processRequest()方法放行请求,processRequest()方法实际是调用了doService()方法
- 867行:声明Map集合
- 874行:给Map集合插入值
- 880行:给request设置值
- 893行:最终调用doDispatch()方法
- 939行:HandlerAdapter在DispatcherServlet中调用 其他先忽略
最后:更多相关资料私信【Java】就可以免费领取哒
上面都是自己整理好的!我就把资料贡献出来给有需要的人!顺便求一波关注,哈哈~各位小伙伴关注我后私信【Java】就可以免费领取哒
閱讀更多 Java天天 的文章