web.xml的配置及加载顺序

一web.xml加载过程(步骤):

1.启动WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点:   

和     

2.紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文.

3.容器将转化为键值对,并交给ServletContext.

4.容器创建中的类实例,即创建监听


二 、 load-on-startup:控制servlet的加载顺序

load-on-startup 元素在web应用启动的时候指定了servlet被加载的顺序,它的值必须是一个整数。如果它的值是一个负整数或是这个元素(servlet配置元素)不存在,那么容器会在该 servlet被调用的时候,加载这个servlet 。如果值是正整数或零,容器在配置的时候就加载并初始化这个servlet,正数的值越小,启动该servlet的优先级越高。如果值相等,容器可以自动选择先加载谁。  如果servlet的配置元素中没有load-on-startup元素的配置,则servlet的加载顺序按照servlet-mapping出现的顺序控制

三  、加载顺序

首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关。即不会因为 filter 写在 listener 的前面而会先加载 filter。最终得出的结论是:ServletContext (并没有在web.xml中进行配置,服务器启动创建的容器)-> listener -> filter -> servlet

        同时还存在着这样一种配置节:context-param(加载spring、加载log4j资源文件),它用于向 ServletContext 提供键值对,即应用程序上下文信息。我们的 listener, filter 等在初始化时会用到这些上下文中的信息,那么 context-param 配置节是不是应该写在 listener 配置节前呢?实际上 context-param 配置节可写在任意位置,因此真正的加载顺序为: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() 方法的。

       由此,可以看出,web.xml 的加载顺序是:ServletContext -> context-param -> listener -> filter -> servlet ,而同个类型之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的。


四 、 web.xml文件详解 


我将自己知道的web.xml的元素整理了一下:

1、web.xml首先是肯定要包含它的schema,version="2.4"表示servlet的版本号,对应的jsp版本应该是2.0,tomcat为5,

"
    xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance "
    xsi:schemaLocation=" http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd "
    version="2.4">

。。。。

其它的元素都放在之中。

是对站台的描述
定义站台的名称
是指定该站台是否可分布式处理
用来设定web站台的环境参数,它包含两个子元素:
    用来指定参数的名称
    用来设定参数值
比如:
    my_param
    hello

在此设定的参数,可以在servlet中用 getServletContext().getInitParameter("my_param") 来取得

2、listener

用来设定Listener接口,它的主要子元素为
    定义Listener的类名称
比如:
    com.myTest.ContextListener 
3.1、filter
是用来声明filter的相关设定,它包含以下子元素:
    这当然就是指定filter的名字
    这是用来定义filter的类的名称
    用来定义参数,它有两个子元素:
        用来指定参数的名称
        用来设定参数值
比如:
        setCharacterEncoding
        com.myTest.setCharacterEncodingFilter
       
            encoding
            GB2312
       

3.2、filter-mapping

同时使用的是 用来定义filter所对应的URL,它有两个子元素:
    指定filter的名字
    指定filter所对应的URL
比如:
        setCharacterEncoding
        /*

4.1、servlet

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

4.2、servlet-mapping

一起使用的是 用来定义servlet所对应的URL,包含两个子元素:
    指定servlet的名称
    指定servlet所对应的URL
比如:
        ShoppingServlet
        com.myTest.ShoppingServlet
        ShoppingServlet
        /shop/ShoppingServlet
5、session-config
用来定义web站台中的session参数,包含一个子元素:
    用来定义这个web站台所有session的有效期限,单位为 分钟



6、mime-mapping
定义某一个扩展名和某一个MIME Type做对映,包含两个子元素:
    扩展名的名称
    MIME格式
比如:
    doc
    application/vnd.ms-word
 
    xls
    application/vnd.ms-excel
7、welcom-file-list
用来定义首页的列单,包含一个子元素:
    指定首页的文件名称
比如:
    index.jsp
    index.html
8、error-page
用来处理错误代码或异常的页面,有三个子元素:
    指定错误代码
    指定一个JAVA异常类型
    指定在web站台内的相关资源路径
比如:
    404
    /error404.jsp
    java.lang.Exception
    /exception.jsp
9、taglib
用来设定JSP网页所用到的Tag Library路径,有两个子元素:
    定义TLD文件的URI,在JSP网页中用taglib指令便可取得该URI 的TLD文件
    指定TLD文件相对于web站台的存放位置
比如:
      myTaglib
      /WEB-INF/tlds/MyTaglib.tld


6、web.xml常见配置详解
========================================================================

display-name

定义了WEB应用的名字

description

声明WEB应用的描述信息

context-param

元素声明应用范围内的初始化参数

filter

过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联

filter-mapping

 一旦命名了一个过滤器,就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联

listener

捕捉服务器的启动和停止,触发相应的方法

servlet

在向servlet或JSP页面制定初始化参数或定制URL时,必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的

servlet-mapping

服务器一般为servlet提供一个缺省的URL:http://host/webAppPrefix/servlet/ServletName。但是,常常会更改这个URL,以便servlet可以访问初始化参数或更容易地处理相对URL。在更改缺省URL时,使用servlet-mapping元素。   

session-config

如果某个会话在一定时间内未被访问,服务器可以抛弃它以节省内存。 可通过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对象的超时值,或者可利用session-config元素制定缺省超时值。   

welcome-file-list

欢迎页

error-page

返回特定HTTP状态代码时,或者特定类型的异常被抛出时,能够制定将要显示的页面。 

resource-ref

声明一个资源工厂使用的外部资源

web.xml中webAppRootKey

------------------------------------------------------------------------------------------------
1、 web.xml配置

webAppRootKey
webapp.root

"webapp.root"这个字符串可以随便写任何字符串。如果不配置默认值是"webapp.root"。
 
可以用System.getProperty("webapp.root")来动态获项目的运行路径。
一般返回结果例如:/usr/local/tomcat6/webapps/项目名

2、解决以下报错

部署在同一容器中的Web项目,要配置不同的,不能重复,否则报类似下面的错误:
Web app root system property already set to different value: 'webapp.root' = [/home/user/tomcat/webapps/project1/] instead of [/home/user/tomcat/webapps/project2/] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files! 
意思是“webapp.root”这个key已经指向了项目1,不可以再指向项目2.

3、加载方式

Spring通过org.springframework.web.util.WebAppRootListener 这个监听器来运行时的项目路径。
但是如果在web.xml中已经配置了 org.springframework.web.util.Log4jConfigListener这个监听器,
则不需要配置WebAppRootListener了。因为Log4jConfigListener已经包含了WebAppRootListener的功能
一般配置类型下面的例子:

Xml代码   收藏代码
  1.   
  2. <context-param>  
  3.     <param-name>log4jConfigLocationparam-name>  
  4.     <param-value>WEB-INF/conf/log4j.propertiesparam-value>  
  5. context-param>     
  6.   
  7. <context-param>  
  8.     <param-name>log4jRefreshIntervalparam-name>  
  9.       <param-value>3000param-value>  
  10.  context-param>  
  11.   
  12. <listener>  
  13.     <listener-class>org.springframework.web.util.Log4jConfigListenerlistener-class>  
  14.  listener>  

 

4、在运行时动态的找出项目的路径

在log4j.properties配置文件,就可以按下面的方式使用${webapp.root}:
 log4j.appender.file.File=${webapp.root}/WEB-INF/logs/sample.log
就可以在运行时动态的找出项目的路径


你可能感兴趣的:(java基础学习)