applicationContext.xml ----> spring 全局配置文件,装配表现层以外的bean,比如数据源,事务,jdbc模板,mybatis集成,hibernate集成等等。配置文件默认在/WEB-INF/applicationContext.xml
xxx-servlet.xml ----> spring MVC的配置文件,也就是表现层配置文件,建议只装配表现层Bean。xxx表示DispatcherServlet的Servlet名字,配置文件默认在/WEB-INF/xxx-servlet.xml
web.xml ----> web工程配置文件
①配置spring的全局配置文件的位置和spring MVC的配置文件的位置
如果spring MVC的配置文件的位置没有配置,那么默认DispatcherServlet会加载WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml
②web.xml中配置的两个重要的类:
org.springframework.web.context.ContextLoaderListener ----> 负责查找配置文件/WEB-INF/applicationContext.xml,并加载该配置文件
org.springframework.web.servlet.DispatcherServlet ----> 负责协调和组织各个组件完成用户请求处理[处理请求,分发请求,如转发,重定向等操作]并返回响应工作
ContextLoaderListener和DispatcherServlet的区别?下面参考
ContextLoaderListener和DispatcherServlet都会在Web容器启动的时候加载一下bean配置. 区别在于:
1 DispatcherServlet一般会加载MVC相关的bean配置管理(如: ViewResolver, Controller, MultipartResolver, ExceptionHandler, etc.)
2 ContextLoaderListener一般会加载整个Spring容器相关的bean配置管理(如: Log, Service, Dao, PropertiesLoader, etc.)
DispatcherServlet默认使用WebApplicationContext作为上下文。值得注意的是, DispatcherServlet的上下文仅仅是Spring MVC的上下文, 而ContextLoaderListener的上下文则对整个Spring都有效。一般Spring web项目中同时会使用这两种上下文.
③web.xml几个标签:
<context-param/>,<listener/>,<filter/>,<servlet/>(web.xml加载顺序)
1 <context-param/> <!--上下文参数:声明应用范围内的初始化参数,会被转换为key-value的形式-->
2 <param-name/>,<param-value/>
3 <listener/> <!--声明监听器-->
4 <listener-class/>
5 <filter/> <!--声明过滤器-->
6 <filter-name/>,<filter-class/>,<init-param/>
7 <filter-mapping/> <!-mapping必须出现在filter之后,当请求资源匹配mapping时,mapping有顺序之分-->
8 <filter-name/>,<url-pattern/>
9 <servlet/> <!--声明servlet-->
10 <servlet-name/>,<servlet-class/>,<init-param/>
11 <load-on-startup/> <!--告知servlet的启动顺序,数值是整数,大于等于0时,启动时按顺序加载Servlet,数值越低,该Servlet越先启动-->
12 <servlet-mapping/> <!-mapping必须出现在Servlet之后,当请求资源匹配mapping时,mapping有顺序之分-->
13 <servlet-name/>,<url-pattern/>
14 <session-config/> <!--声明会话超时,单位min-->
15 <session-timeout/>
16 <error-page/> <!--声明错误页面,异常和404等状态码映射到指定页面-->
17 <error-code/>,<location/>,<exception-type/>
自定义spring MVC的配置文件位置,<servlet/>标签内的<init-param/>标签内指定配置文件的位置,如下所示:
1 <!-- spring MVC 配置内容 -->
2 <servlet>
3 <servlet-name>springMVCServlet</servlet-name>
4 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
5 <init-param>
6 <param-name>contextConfigLocation</param-name>
7 <param-value>classpath:spring/springmvc.xml</param-value>
8 </init-param>
9 <load-on-startup>1</load-on-startup>
10 </servlet>
11
12 <servlet-mapping>
13 <servlet-name>springMVCServlet</servlet-name>
14 <url-pattern>/</url-pattern>
15 </servlet-mapping>
ContextLoaderListener类的依赖关系图如下,ContextLoaderListener实现了ServletContextListener的两个抽象方法,EventListener是一个空抽象接口。
DispatcherServlet类的依赖关系图如下,Serializable和Aware是一个空的抽象接口。
什么是Aware?Aware的作用是什么?Spring提供了一系列Aware接口,允许bean向容器指示它们需要某种基础结构依赖。例如EnvironmentAware接口,该接口便拥有感知spring 容器的能力,可以获得spring 容器的服务,从而获得环境相关的属性值。
加载顺序
tomcat startup ----> DispatcherServlet instantiated ----> DispathcerServlet inited
①加载web.xml,初始化参数 ②建立WebapplicationContext容器 ③初始化相关组件(HandlerMappings,HandlerAdapters,HandlerExceptionResolvers,ViewResolvers等)
user request coming ----> tomcat recieved request ----> web.xml matched request ----> DispatcherServlet got request ----> DispathcerServlet began deal request ----> doDispatch() [ getHandler() ----> getLastModified() ----> getHandlerAdapter() ----> applyPreHandle() ----> handle() ----> applyPostHandle() ----> processDispatchResult() [render()] ----> ???]
spring MVC 组件:
DispatcherServlet, HandlerMapping , Handler(HandlerExecutionChain, ModelAndView), HandlerAdapter, ViewResolver, View
DispatcherServlet:总控制器,调度器
HandlerMapping:根据用户请求url 找到Handler
Handler:后端控制器
HandlerAdapter:执行Handler,返回ModelAndView
ViewResolver:生成View视图,返回view
View:支持多种View视图类型,填充模型数据到request
spring MVC各个组件工作流程:
参考文档
spring-framework-4.3.15.RELEASE