SpringMvc---SpringMvc的执行过程
1、SpringMVC常用组件
-
DispatcherServlet:前端控制器,不需要工程师开发,由框架提供
作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求
-
HandlerMapping:处理器映射器,不需要工程师开发,由框架提供
作用:根据请求的url、method等信息查找Handler,即将请求和控制器方法建立映射关系
-
Handler:处理器,需要工程师开发
作用:在DispatcherServlet的控制下Handler对具体的用户请求进行处理 控制器方法
-
HandlerAdapter:处理器适配器,不需要工程师开发,由框架提供
作用:通过HandlerAdapter对处理器(控制器方法)进行执行,调用控制器方法
-
ViewResolver:视图解析器,不需要工程师开发,由框架提供
作用:进行视图解析,得到相应的视图,例如:ThymeleafView、InternalResourceView、RedirectView
-
View:视图
作用:将模型数据通过页面展示给用户
2、SpringMvc的初始化
DispatcherServlet本质也是一个Servlet,他的生命周期也遵循servlet的规则,初始化也应该从init方法开始。
首先进入DiapatcherServlet中,再进入他的父类FrameworkServlet,再进入FrameworkServlet的父类HttpServletBean、在进入HttpServletBean的父类HttpServlet、再进入HttpServlet的父类GenericServlet、最后发现GenericServlet实现了Servlet的接口。已知在Servlet接口中有一个初始化方法init
使用IDEA左下角工具栏的structure工具可以看见当前类中的方法和继承关系,方法后出现向上的箭头就是来自父类的方法
接下来分别在GenericServlet、HttpServlet、HttpServletBean、FrameworkServlet、DiapatcherServlet中找实现了父类的init方法。发现在GenericServlet中init的工作是把ServletConfig的值赋给成员变量,在HttpServlet中没有实现init方法,在HttpServletBean中init方法调用了一个initServletBean()方法,在initServletBean()方法中什么都没写。在FrameworkServlet中对它父类的initServletBean()进行了编写内容以及再次调用了一个方法initWebApplicationContext(),在initWebApplicationContext()方法中
首先通过工具类的getWebApplicationContext()方法创建了一个WebApplicationContext类型的对象,又在底下再次创建了一个对象。对第二次创建的对象进行判断是否为空。由于是从初始化一路找来的,并没有对这个对象进行任何操作,他肯定为空。在下面的判断中,如果为null,首先会去找,没找到就会创建一个WebApplicationContext对象。在创建这个WebApplicationContext对象的