欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!
Spring 通篇源码 基于 spring-framework-4.1.7.RELEASE 版本。
基于Spring搭建项目时,会在web.xml中配置Spring需要的相关信息,web.xml配置是Spring框架运行必须的(当然Spring boot可以完全无配置启动,依据本文开头的声明,基于 spring-framework-4.1.7.RELEASE 版本),配置的内容会启动Spring容器,包括大家熟知的Ioc和AOP都是以这里为起点的,先看一下配置内容,让我们逐项分析一下。
web.xml Spring 配置
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/spring/applicationContext.xml
</param-value>
</context-param>
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>springMVCServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/spring/applicationContext.mvc.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVCServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
配置功能分析
① org.springframework.web.context.ContextLoaderListener
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/spring/applicationContext.xml
</param-value>
</context-param>
ContextLoaderListener继承了ContextLoader,实现了ServletContextListener接口,web.xml中与元素配合一起完成ContextLoaderListener的配置,ContextLoaderListener的作用是在Servlert容器启动时,读取contextConfigLocation变量指向的xml配置文件,根据文件描述装配ApplicationContext的配置,并产生WebApplicationContext对象。在Servlet容器关闭时,销毁WebApplicationContext对象。
ContextLoaderListener为什么要继承ServletContextListener?
ServletContextListener事件可以监听到ServletContext对象的生命过程,ServletContext是一个全局性的对象,可以等价于Servlet容器(一般Servlet容器就代表Web应用程序)的生命周期。正是由于ContextLoaderListener继承了ServletContextListener,Spring才可以在Servlet容器启动和关闭时完成初始化和销毁操作。
② org.springframework.web.context.request.RequestContextListener
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
RequestContextListener实现了ServletRequestListener接口,可以使得RequestContextListener可以在Servlet容器运行期间的所有请求,Servlet容器的每一次请求都会通知该监听器。
RequestContextListener作用:
· RequestContextListener可以用于监听请求,基于ThreadLocal把HttpServletRequest对象绑定到当前线程上,使得线程后续操作中可以直接获取。
· Spring 4.1.7.RELEASE版本中,Bean可以拥有五种作用域:singleton、prototype、request、session和global session。request、session和global session是Spring 2.x新增的Web作用域,若希望Bean拥有这三项中的某种作用域,除了在Bean生命时通过scope属性标注外,还需要增加上面的配置。
· 若Servlet容器的Servlet API是2.4之前的版本,那需要定义一个Filter实现:
<filter>
<filter-name>requestContextFilter</filter-name>
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>requestContextFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
③ org.springframework.web.filter.CharacterEncodingFilter
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
CharacterEncodingFilter是Spring内置的过滤器,主要用来处理请求和响应的编码问题。上面的配置指示:拦截到Servlet容器的所有请求,编码格式为UTF-8,禁止应用进行修改。CharacterEncodingFilter具有过滤器的所有特性,可在请求达到Servlet前和响应发送到客户端之前, 进行过滤处理,可修改请求和响应的头信息以及有效负载数据。
④ org.springframework.web.servlet.DispatcherServlet
<servlet>
<servlet-name>springMVCServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/spring/applicationContext.mvc.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVCServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
DispatcherServlet是前置控制器,是Spring应用请求的集中访问点,负责接收请求并根据响应规则进行请求分派。contextConfigLocation指定Spring MVC xml配置文件路径。
总结
至此,Spring在web.xml中的配置大致介绍就完成了,这些内容是一个Spring应用必不可少的,在这些配置的合作下,完成Spring Ioc容器、Spring MVC流程控制、Spring 编码处理等等事项。
若文中存在错误和不足,欢迎指正!
本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!