web.xml浅析

1、web.xml简介

web.xml是Java web项目的配置文件,但它不是项目必须的。

web.xml的模式(Schema)文件中定义了多少种标签元素,web.xml中就可以出现它的模式文件所定义的标签元素,它就能拥有定义出来的那些功能。web.xml的模式文件是由Sun公司定义的,每个web.xml文件的根元素中,都必须标明这个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> 

其它的元素都放在之中。

   对应用的描述
   定义应用的名称
   指定该应用是否可分布式处理

4.2、context-param

用来设定应用的环境参数,它包含两个子元素:

用来指定参数的名称

用来设定参数值

<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>
    <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所对应的URL,它有两个子元素:

指定filter的名字

指定filter所对应的URL

<filter-mapping>
        <filter-name>setCharacterEncoding</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

4.4、listener

用来设定Listener接口,它的主要子元素为
定义Listener的类名称

<listener>
    <listener-class>com.myTest.ContextListener</listener-class> 
</listener>

4.5、servlet

用来声明一个servlet的数据,主要有以下子元素:
指定servlet的名称
指定servlet的类名称
指定web站台中的某个JSP网页的完整路径
用来定义参数,和前面的差不多

同样,与成对使用的是 用来定义servlet所对应的URL,包含两个子元素:
指定servlet的名称
指定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>

用来定义web应用中的session参数,包含一个子元素:
用来定义这个web应用所有session的有效期限,单位为分钟

4.7、mime-mapping

定义某一个扩展名和某一个MIME Type做对映,包含两个子元素:
扩展名的名称
MIME格式

4.8、welcome-file-list

用来定义首页的列单,包含一个子元素:
指定首页的文件名称

4.9、error-page

用来处理错误代码或异常的页面,有三个子元素:
指定错误代码
指定一个JAVA异常类型
指定在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

用来设定JSP网页所用到的Tag Library路径,有两个子元素:
定义TLD文件的URI,在JSP网页中用taglib指令便可取得该URI的TLD文件
指定TLD文件相对于web站台的存放位置

<taglib>
    <taglib-uri>myTaglib</taglib-uri>
    <taglib-location>/WEB-INF/tlds/MyTaglib.tld</taglib-location>
</taglib>

web.xml浅析

上一篇:.net core 3.1 使用nlog记录日志 NLog.Web.AspNetCore


下一篇:css布局精髓