web.xml浅析
1、web.xml简介
web.xml是Java web项目的配置文件,但它不是项目必须的。
web.xml的模式(Schema)文件中定义了多少种标签元素,web.xml中就可以出现它的模式文件所定义的标签元素,它就能拥有定义出来的那些功能。web.xml的模式文件是由Sun公司定义的,每个web.xml文件的根元素
web.xml Schema 头部声明 4.0
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
</web-app>
2、web.xml加载过程
当启动一个WEB项目时,容器(如Tomcat、Apache)会去读取它的配置文件web.xml ,当这一步骤没有出错并且完成之后,项目才能正常地被启动起来。具体如下:
a. 启动web项目,容器(如Tomcat、Apache)会去读取它的配置文件web.xml 中的两个节点,context-param和listener。
b. 紧接着,容器将创建一个ServletContext(又称为:Servlet上下文),应用范围内即整个WEB项目都能使用这个Servlet上下文。
容器将< context-param >转化为键值对,并交给ServletContext。
c. 容器创建< listener >中的类实例,即创建监听。(备注:listener定义的类可以是自定义的类但必须需要继承ServletContextListener)。
d. 在监听中会有contextInitialized(ServletContextEvent args)初始化方法,在这个方法中获得:
ServletContext = ServletContextEvent.getServletContext(); context-param的值 = ServletContext.getInitParameter(“context-param的键”);
在这个类中还必须有一个contextDestroyed(ServletContextEvent event) 销毁方法。用于关闭应用前释放资源,比如说数据库连接的关闭。
e. 得到context-param的值之后,你就可以做一些操作了。注意,这个时候你的WEB项目还没有完全启动完成。这个动作会比所有的Servlet都要早。例如:你可能想在项目启动之前就打开数据库。那么这里就可以在< context-param >中设置数据库的连接方式,在监听类中初始化数据库的连接。
f. 补充知识:ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放。request,一个用户可有多个;session,一个用户一个;而servletContext,所有用户共用一个。所以,为了节省空间,提高效率,ServletContext中,要放必须的、重要的、所有用户需要共享的线程又是安全的一些信息。例如,一个购物网站,用户要访问商品的详细信息,如果放在session域,每个用户都要访问一遍数据库,这样效率太低;而放在ServletContext中,服务器一启动,就访问数据库将商品信息存入,这样所有用户只需要通过上下文就能访问到商品的信息。
3、web.xml中节点的加载顺序
首先可以肯定的是,不同类型的节点,加载顺序与它们在 web.xml 文件中的先后顺序无关。即不会因为 filter 写在 listener 的前面而会先加载 filter。
web.xml节点加载顺序:context-param -> listener -> filter -> servlet
对于同类配置节而言,与它们出现的顺序是有关的。以 filter 为例,web.xml 中当然可以定义多个 filter,与 filter 相关的一个配置节是 filter-mapping,这里一定要注意,对于拥有相同 filter-name 的 filter 和 filter-mapping 配置节而言,filter-mapping 必须出现在 filter 之后,否则当解析到 filter-mapping 时,它所对应的 filter-name 还未定义。web 容器启动时初始化每个 filter 时,是按照 filter 配置节出现的顺序来初始化的,当请求资源匹配多个 filter-mapping 时,filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的。
4、web.xml文件详解
4.1、schema头
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
</web-app>
其它的元素都放在<web-app> 之中。
<discription></discription> 对应用的描述
<display-name></display-name> 定义应用的名称
<distributable/> 指定该应用是否可分布式处理
4.2、context-param
<context-param></context-param> 用来设定应用的环境参数,它包含两个子元素:
<param-name></param-name> 用来指定参数的名称
<param-value></param-value> 用来设定参数值
<context-param>
<param-name>param1</param-name>
<param-value>zhangsan</param-value>
<description></description>
</context-param>
<context-param>
<param-name>param2</param-name>
<param-value>123abc</param-value>
</context-param>
在此设定的参数,可以在servlet中用 getServletContext().getInitParameter("param1") 来取得。
ServletContext context = getServletContext();
Enumeration<String> initParameterNames = context.getInitParameterNames();
while (initParameterNames.hasMoreElements()) {
String element = initParameterNames.nextElement();
String initParameter = context.getInitParameter(element);
System.out.println(element + " = " + initParameter);
}
4.3、filter
<filter></filter>是用来声明filter的相关设定,它包含以下子元素:
<filter-name></filter-name> 指定filter的名字
<filter-class></filter-class> 定义filter的类的名称
<init-param></init-param>用来定义参数,它有两个子元素:
<param-name></param-name> 用来指定参数的名称
<param-value></param-value> 用来设定参数值
<filter>
<filter-name>setCharacterEncoding</filter-name>
<filter-class>com.myTest.setCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GB2312</param-value>
</init-param>
</filter>
与<filter></filter>成对使用的是<filter-mapping></filter-mapping> 用来定义filter所对应的URL,它有两个子元素:
<filter-name></filter-name> 指定filter的名字
<url-pattern></url-pattern>指定filter所对应的URL
<filter-mapping>
<filter-name>setCharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.4、listener
<listener></listener> 用来设定Listener接口,它的主要子元素为
<listener-class></listener-class> 定义Listener的类名称
<listener>
<listener-class>com.myTest.ContextListener</listener-class>
</listener>
4.5、servlet
<servlet></servlet> 用来声明一个servlet的数据,主要有以下子元素:
<servlet-name></servlet-name> 指定servlet的名称
<servlet-class></servlet-class> 指定servlet的类名称
<jsp-file></jsp-file> 指定web应用中的某个JSP网页的完整路径
<init-param></init-param> 用来定义参数,和前面的
同样,与<servlet></servlet>成对使用的是<servlet-mapping></servlet-mapping> 用来定义servlet所对应的URL,包含两个子元素:
<servlet-name></servlet-name> 指定servlet的名称
<url-pattern></url-pattern> 指定servlet所对应的URL
<servlet>
<servlet-name>ShoppingServlet</servlet-name>
<servlet-class>com.myTest.ShoppingServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShoppingServlet</servlet-name>
<url-pattern>/shop/ShoppingServlet</url-pattern>
</servlet-mapping>
4.6、session-config
<session-config></session-config> 用来定义web应用中的session参数,包含一个子元素:
<session-timeout></session-timeout> 用来定义这个web应用所有session的有效期限,单位为分钟
4.7、mime-mapping
<mime-mapping></mime-mapping> 定义某一个扩展名和某一个MIME Type做对映,包含两个子元素:
<extension></extension> 扩展名的名称
<mime-type></mime-type> MIME格式
4.8、welcome-file-list
<welcome-file-list></welcom-file-list> 用来定义首页的列单,包含一个子元素:
<welcome-file></welcome-file> 指定首页的文件名称
4.9、error-page
<error-page></error-page> 用来处理错误代码或异常的页面,有三个子元素:
<error-code></error-code> 指定错误代码
<exception-type></exception-type> 指定一个JAVA异常类型
<location></location> 指定在web应用内的相关资源路径
<error-page>
<error-code>404</error-code>
<location>/error404.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/exception.jsp</location>
</error-page>
4.10、taglib
<taglib></taglib> 用来设定JSP网页所用到的Tag Library路径,有两个子元素:
<taglib-uri></taglib-uri> 定义TLD文件的URI,在JSP网页中用taglib指令便可取得该URI的TLD文件
<taglib-location></taglib-location> 指定TLD文件相对于web站台的存放位置
<taglib>
<taglib-uri>myTaglib</taglib-uri>
<taglib-location>/WEB-INF/tlds/MyTaglib.tld</taglib-location>
</taglib>
浙公网安备 33010602011771号