一个Web项目随着Tomcat服务器启动,Tomcat会读取项目中的web.xml文件,文件中有context-param、listener、filter和servlet这几个重要的标签,而web项目的启动也和这四个标签有很大的关系。
前言
这里以spring-mvc、spring和mybatis框架为基础的web项目启动为例,简单地介绍下四个标签的作用,以及web启动时这四个标签加载的顺序。更详细的内容可以查参考或者查源码。
web.xml的四种重要标签
tomcat启动时,会读取项目中的web.xml文件。其中较为重要的标签包括:context-param、listener、filter和servlet。
context-param
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
</param-value>
</context-param>
该标签包含web应用servlet上下文初始化参数的声明,在这里声明的参数是全局的,存在于ServletContext容器中。listener、filter等在初始化时可以使用这些上下文信息。在servlet中可以通过getServletContext().getInitParameter(“context/param”)方法获取参数的值,用其指定spring配置文件应该是该标签最常用的用途。
listener
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
该标签用来注册一个监听器类。事件监听程序包括:应用的启动和关闭;session的创建与销毁,属性的新增、移除和更改;对象被绑定到session中或从session中删除。
filter
<filter>
<filter-name>Set Character Encoding</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>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
该标签用来过滤请求。在request请求到达servlet之前进行预处理,在response响应离开servlet之后进行后处理。常用的用途如上面代码中的设置请求和响应的编码方式。
servlet
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
该标签用于处理用户请求。可以看到servlet和filter标签的使用比较像,filter就像servlet前面的安检。
web.xml中标签加载顺序
web项目启动时,以上四种标签加载的顺序是:context-param,listener,filter,servlet。除了filter-mapping不能写在filter前面和servlet-mapping不能写在servlet前面,其余的没有书写顺序要求。启动步骤如下:
-
web项目启动,服务器容器读取context-param和listener;
-
服务器容器创建ServletContext;
-
将context-param转化为键值对放入ServletContext;
-
服务器容器创建listener的实例;
-
服务器容器创建filter实例;
-
按照load-on-startup去实例servlet。
总结
内容写的比较简单,很多细节都没有去讲,因为我也不清楚,而且要全部描述清楚,恐怕篇幅会很恐怖。这里记住context-param、listener、filter和servlet的加载顺序,和标签的基本用途就可以了。