Web.xml文件配置详解

Web.xml文件配置详解

1、Web.xml作用

Web.xml是Java Web项目中的一个配置文件,主要用于配置首页、Filter、Listener、Servlet等。
tomcat在部署启动web应用时,会解析加载${CATALINA_HOME}/conf目录下所有web应用通用的web.xml,
然后解析加载web应用目录中的WEB-INF/web.xml。如果没有WEB-INF/web.xml文件,
tomcat会输出找不到的消息,但仍然会部署并使用web应用程序,因此,这个web.xml并不是必要的,
不过通常最好还是让每一个上线的web应用程序都有一个自己的WEB-INF/web.xml。

conf/web.xml文件中的设定会应用于所有的web应用程序,
而web应用程序的WEB-INF/web.xml中的设定只应用于该应用程序本身。

2.web.xml配置详解

web.xml加载过程

1、启动Web应用时,容器(tomcat)会去读取web.xml文件的和 两个节点;

2、容器创建一个ServletContext(上下文);

3、容器以的name作为键,value作为值,将其转化为键值对,存入ServletContext。

4、容器创建中的类实例,根据配置的class类路径来创建监听,
在监听中会有contextInitialized(ServletContextEvent args)初始化方法,启动Web应用时,
系统调用Listener的该方法。

5、容器初始化,web.xml中可以定义多个 filter,
初始化每个 filter 时,是按照 filter 配置节出现的顺序来初始化的,
当请求资源匹配多个 filter-mapping 时,
filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的;

6、容器初始化,servlet 同 filter 类似。

那么,web项目启动时,可以知道web.xml文件各个节点的加载顺序:
context-param -> listener -> filter -> servlet

Web.xml中定义的元素

 
    
    
    
     
    
      
    
      
    
     
    
     
    
     
    
     
    
     
    
    
    
     
    
     
    
     
    
    
    
     
    
     
    
     
    
    
    
    
    
    
    
    

相应元素配置:

(1)Web应用图标

 
    /images/app_small.gif 
    /images/app_large.gif 
 

(2)Web 应用名称

App Name

(3)Web 应用描述

This is a app disciption.

(4)上下文初始化参数

 
    ContextParameter 
    test 
    It is a test parameter. 
 

context-param元素含有一对参数名和参数值,用作应用的Servlet上下文初始化参数,参数名在整个Web应用中必须是惟一的,在web应用的整个生命周期中上下文初始化参数都存在,任意的Servlet和jsp都可以随时随地访问它。在servlet里面可以通过getServletContext().getInitParameter(“context/param”)得到。

Spring配置文件:

在spring配置中,必须需要,而可有可无,如果在web.xml中不写配置信息,默认的路径是/WEB-INF/applicationContext.xml,在WEB-INF目录下创建的xml文件的名称必须是applicationContext.xml。如果是要自定义文件名可以在web.xml里加入contextConfigLocation这个context参数:在param-value里指定相应的xml文件名,如果有多个xml文件,可以写在一起并以“,”号分隔,比如在business-client工程中,我们采用了自定义配置方式:


    contextConfigLocation
    /WEB-INF/spring-configuration/*.xml


     org.springframework.web.context.ContextLoaderListener

案例1:部署在同一容器中的多个Web项目,要配置不同的webAppRootKey,web.xml文件中最好定义webAppRootKey参数,如果不定义,将会缺省为“webapp.root”,如下:

  
  
    webAppRootKey  
    business.root  
  
  
  
    webAppRootKey  
    pubbase.root  
  

这样就不会出现冲突了。就可以在运行时动态地找到项目路径,在log4j.properties配置文件中可以按下面的方式使用webapp.root:log4j.appender.file.File={webapp.root}:log4j.appender.file.File=webapp.root:log4j.appender.file.File={webapp.root}/WEB-INF/logs/sample.log,就可以在运行时动态地找出项目的路径。

(5)过滤器配置




    CharacterEncodingFilter
    org.springframework.web.filter.CharacterEncodingFilter
    
        encoding
        UTF-8
    
    
        forceEncoding
        true
    



    CAS Single Sign Out Filter
    com.yonyou.mcloud.cas.client.session.SingleSignOutFilter



    CAS Authentication Filter
    com.yonyou.mcloud.cas.client.authentication.ExpandAuthenticationFilter
    
        casServerLoginUrl
        https://dev.yonyou.com:443/sso-server/login
    
    
        
        serverName
        http://********
    



    CAS Validation Filter
    org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
    
        casServerUrlPrefix
        https://dev.yonyou.com:443/sso-server
    
    
        serverName
        http://10.1.215.40:80
    
    
        proxyCallbackUrl
        https://dev.yonyou.com:443/business/proxyCallback
    
    
        proxyReceptorUrl
        /proxyCallback
    
    
        proxyGrantingTicketStorageClass
        com.yonyou.mcloud.cas.client.proxy.MemcachedBackedProxyGrantingTicketStorageImpl
    
    
    
        encoding
        UTF-8
    


    CAS HttpServletRequest Wrapper Filter
    org.jasig.cas.client.util.HttpServletRequestWrapperFilter


    CAS Assertion Thread Local Filter
    org.jasig.cas.client.util.AssertionThreadLocalFilter


    NoCache Filter
    com.yonyou.mcloud.cas.client.authentication.NoCacheFilter



    CharacterEncodingFilter
    /*


    NoCache Filter
    /*


    CAS Single Sign Out Filter
    /*


    CAS Validation Filter
    /proxyCallback


    CAS Authentication Filter
    /*


    CAS Validation Filter
    /*


    CAS HttpServletRequest Wrapper Filter
    /*


    CAS Assertion Thread Local Filter
    /*

Filter介绍:

Filter可认为是Servlet的一种“加强版”,主要用于对用户请求request进行预处理,也可以对Response进行后处理,是个典型的处理链。使用Filter的完整流程是:Filter对用户请求进行预处理,接着将请求HttpServletRequest交给Servlet进行处理并生成响应,最后Filter再对服务器响应HttpServletResponse进行后处理。Filter与Servlet具有完全相同的生命周期,且Filter也可以通过来配置初始化参数,获取Filter的初始化参数则使用FilterConfig的getInitParameter()。

换种说法,Servlet里有request和response两个对象,Filter能够在一个request到达Servlet之前预处理request,也可以在离开Servlet时处理response,Filter其实是一个Servlet链。以下是Filter的一些常见应用场合:
认证Filter
日志和审核Filter
图片转换Filter
数据压缩Filter
密码Filter
令牌Filter
触发资源访问事件的Filter
XSLT Filter
媒体类型链Filter

Filter可负责拦截多个请求或响应;一个请求或响应也可被多个Filter拦截。创建一个Filter只需两步:

1)创建Filter处理类

2)Web.xml文件中配置Filter

Filter必须实现javax.servlet.Filter接口,在该接口中定义了三个方法:

1)init(FilterConfig config):用于完成Filter的初始化。FilteConfig用于访问Filter的配置信息。

2)void destroy():用于Filter销毁前,完成某些资源的回收。

3)void doFilter(ServletRequest request, ServletResponse response, FilterChain chain):实现过滤功能的核心方法,该方法就是对每个请求及响应增加额外的处理。该方法实现对用户请求request进行预处理,也可以实现对服务器响应response进行后处理—它们的分界线为是否调用了chain.doFilter(request,response),执行该方法之前,即对用户请求request进行预处理,执行该方法之后,即对服务器响应response进行后处理。

Filter配置:

Filter配置与Servlet的配置非常相似,需要配置两部分:配置Filter名称和Filter拦截器URL模式。区别在于Servlet通常只配置一个URL,而Filter可以同时配置多个请求的URL。配置Filter有两种方式:

在Filter类中通过Annotation进行配置。

在web.xml文件中通过配置文件进行配置。

我们使用的是web.xml这种配置方式,下面重点介绍内包含的一些元素。

用于指定Web容器中的过滤器,可包含

:用来定义过滤器的名称,该名称在整个程序中都必须唯一。

:指定过滤器类的完全限定的名称,即Filter的实现类。

:为Filter配置参数,与具有相同的元素描述符和。

:用来声明Web应用中的过滤器映射,过滤器被映射到一个servlet或一个URL模式。这个过滤器的和必须具有相同的,指定该Filter所拦截的URL。过滤是按照部署描述符的出现的顺序执行的。

(6)用于设置容器的session参数,

比如: 用于指定http session的失效时间。


 
   120 

session-timeout用来指定默认的会话超时时间间隔,以分钟为单位。该元素值必须为整数。如果 session-timeout元素的值为零或负数,则表示会话将永远不会超时.

(7)监听器配置

 
    listener.SessionListener 

7.1、Listener介绍:

为web应用程序定义监听器,监听器用来监听各种事件,比如:Application和Session事件,所有的监听器按照相同的方式定义,功能取决去它们各自实现的接口,常用的Web事件接口有如下几个:

ServletContextListener:用于监听Web Application的启动和关闭;

ServletContextAttributeListener:用于监听ServletContext范围(Application)内属性的改变;

ServletRequestListener:用于监听用户的请求;

ServletRequestAttributeListener:用于监听ServletRequest范围(Request)内属性的改变;

HttpSessionListener:用于监听用户session的开始和结束;

HttpSessionAttributeListener:用于监听HttpSession范围(Session)内属性的改变。

主要用于监听Web应用事件,其中有两个比较重要的Web应用事件:Application的启动和停止(starting up or shutting down)和Session的创建和失效(created or destroyed)。

application启动事件发生在应用第一次被Servlet容器装载和启动的时候;停止事件发生在Web应用停止的时候。Session创建事件发生在每次一个新的Session创建的时候,类似地Session失效事件发生在每次一个Session失效的时候。为了使用这些Web应用事件做些有用的事情,我们必须创建和使用一些特殊的“监听类”。它们是实现了以下两个接口中任何一个接口的简单java类:javax.servlet.ServletContextListener或javax.servlet.http.HttpSessionListener,如果想让你的类监听Application的启动和停止事件,你就得实现ServletContextListener接口;想让你的类去监听Session的创建和失效事件,那你就得实现HttpSessionListener接口。

7.2、Listener配置:

配置Listener只要向Web应用注册Listener实现类即可,无序配置参数之类的东西,因为Listener获取的是Web应用ServletContext(Application)的配置参数。为Web应用配置Listener的两种方式:

使用@WebListener修饰Listener实现类即可。

在web.xml文档中使用进行配置。

我们选择web.xml这种配置方式,只有一个元素指定Listener的实现类,如下所示:


   org.springframework.web.context.ContextLoaderListener

这里的用于Spring的加载,Spring加载可以利用ServletContextListener实现,也可以采用load-on-startup Servlet 实现,但是,当需要用到bean时,加载顺序是先加载后加载,则中初始化操作中的bean为null;所以,如果中要使用到bean,此时就可以根据加载顺序 ,将spring的加载改成Listener的方式。

采用load-on-startup Servlet 实现:

  
   context 
   org.springframework.web.context.ContextLoaderServlet  
   1  
 

利用ServletContextListener实现:

org.springframework.web.context.ContextLoaderListener 我们选择了第二种方式,在J2EE工程中web服务器启动的时候最先调用web.xml,上面这段配置的意思是加载spring的监听器,其中ContextLoaderListener的作用就是启动Web容器时,自动装配applicationContext.xml的配置信息,执行它所实现的方法。

(8)Servlet配置

8.1、Servlet介绍:

Servlet通常称为服务器端小程序,是运行在服务器端的程序,用于处理及响应客户的请求。Servlet是个特殊的java类,继承于HttpServlet。客户端通常只有GET和POST两种请求方式,Servlet为了响应这两种请求,必须重写doGet()和doPost()方法。大部分时候,Servlet对于所有的请求响应都是完全一样的,此时只需要重写service()方法即可响应客户端的所有请求。另外,HttpServlet有两个方法:

init(ServletConfig config):创建Servlet实例时,调用该方法来初始化Servlet资源。

destroy():销毁Servlet实例时,自动调用该方法来回收资源。

通常无需重写init()和destroy()两个方法,除非需要在初始化Servlet时,完成某些资源初始化的方法,才考虑重写init()方法,如果重写了init()方法,应在重写该方法的第一行调用super.init(config),该方法将调用HttpServlet的init()方法。如果需要在销毁Servlet之前,先完成某些资源的回收,比如关闭数据库连接,才需要重写destory方法()。

Servlet的生命周期,创建Servlet实例有两个时机:

客户端第一次请求某个Servlet时,系统创建该Servlet的实例,大部分Servlet都是这种Servlet。

Web应用启动时立即创建Servlet实例,即load-on-start Servlet。

每个Servlet的运行都遵循如下生命周期:

1)创建Servlet实例。

2)Web容器调用Servlet的init()方法,对Servlet进行初始化。

3)Servlet初始化后,将一直存在于容器中,用于响应客户端请求,如果客户端发送GET请求,容器调用Servlet的doGet()方法处理并响应请求;如果客户端发送POST请求,容器调用Servlet的doPost()方法处理并响应请求。或者统一使用service()方法处理来响应用户请求。

4)Web容器决定销毁Servlet时,先调用Servlet的destory()方法,通常在关闭Web应用时销毁Servlet实例。




    business
    org.springframework.web.servlet.DispatcherServlet
    
      publishContext
      false
    
    1



    LogOutServlet
    com.yonyou.mcloud.cas.web.servlet.LogOutServlet
    
      serverLogoutUrl
      https://dev.yonyou.com:443/sso-server/logout
    
    
      serverName
      http://10.1.215.40:80/business/
    



    LogOutServlet
    /logout


    business
    /

 

8.2、Servlet具体配置:

为了让Servlet能响应用户请求,还必须将Servlet配置在web应用中,配置Servlet需要修改web.xml文件。从Servlet3.0开始,配置Servlet有两种方式:

在Servlet类中使用@WebServlet Annotation进行配置。
在web.xml文件中进行配置。
我们用web.xml文件来配置Servlet,需要配置用来声明一个Servlet。元素和元素的用法相同。元素与元素具有相同的元素描述符,可以使用子元素将初始化参数名和参数值传递给Servlet,访问Servlet配置参数通过ServletConfig对象来完成,ServletConfig提供如下方法:

java.lang.String.getInitParameter(java.lang.String name),用于获取初始化参数。ServletConfig获取配置参数的方法和ServletContext获取配置参数的方法完全一样,只是ServletConfig是取得当前Servlet的配置参数,而ServletContext是获取整个Web应用的配置参数。


8.2.1 、

:用来定义servlet的名称,该名称在整个应用中必须是惟一的。

:用来指定servlet的完全限定的名称。

8.2.2、

如果load-on-startup元素存在,而且也指定了jsp-file元素,则JSP文件会被重新编译成Servlet,同时产生的Servlet也被载入内存。的内容可以为空,或者是一个整数。这个值表示由Web容器载入内存的顺序。

举个例子:如果有素两个Servlet元素都含有子元,则子元素值较小的Servlet将先被加载。如果子元素值为空或负值,则由Web容器决定什么时候加载Servlet。如果两个Servlet的子元素值相同,则由Web容器决定先加载哪一个Servlet。1表示启动容器时,初始化Servlet。

8.2.3、

:Servlet的名字,唯一性和一致性,与元素中声明的名字一致。
:指定相对于Servlet的URL的路径。该路径相对于web应用程序上下文的根路径。将URL模式映射到某个Servlet,即该Servlet处理的URL。

8.2.4、加载Servlet的过程

容器的Context对象对请求路径(URL)做出处理,去掉请求URL的上下文路径后,按路径映射规则和Servlet映射路径()做匹配,如果匹配成功,则调用这个Servlet处理请求。

8.3、DispatcherServlet在web.xml中的配置:



    business
    org.springframework.web.servlet.DispatcherServlet
    
      publishContext
      false
    
    1

配置Spring MVC,指定处理请求的Servlet
注意:用户可以配置多个DispatcherServlet来分别处理不同的url请求,每个DispatcherServlet上下文都对应一个自己的子Spring容器,他们都拥有相同的父Spring容器(业务层,持久(dao)bean所在的容器)。

(9)MIME类型配置

 
    html 
    text/html 
 

(10)欢迎页配置

 
    index.jsp 
    index.html 
    index.htm 
 

(11)配置错误页面

方法1:通过错误码来配置error-page

 
    404 
    /404.jsp 
 

上面的配置当系统发生404错误时,页面将跳转到错误处理页面404.jsp

方法2:通过异常类型配置error-page

 
    java.lang.NullException 
    /error.jsp 
 

上面的配置当系统发生java.lang.NullException异常时,页面将跳转到错误处理页面error.jsp

(12)TLD配置

 
    http://jakarta.apache.org/tomcat/debug-taglib 
    /WEB-INF/jsp/debug-taglib.tld 

 

 
     
        http://jakarta.apache.org/tomcat/debug-taglib 
        /WEB-INF/pager-taglib.tld 
     
 

(13)资源管理对象配置

 
    jms/StockQueue 

(14)资源工厂配置

 
    mail/Session 
    javax.mail.Session 
    Container 

配置数据库连接池就可在此配置:

 
    JNDI JDBC DataSource of shop 
    jdbc/sample_db 
    javax.sql.DataSource 
    Container 
 

(15)安全限制配置

 
  Example Security Constraint 
   
      Protected Area 
      /jsp/security/protected/* 
      DELETE 
      GET 
      POST 
      PUT 
   
   
      tomcat 
      role1 
   

(16)登陆验证配置

 
    FORM 
    Example-Based Authentiation Area 
     
        /jsp/security/protected/login.jsp 
        /jsp/security/protected/error.jsp 
     
 

(17)安全角色:security-role元素给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为容易。

 
    tomcat 
 

(18)Web环境参数:env-entry元素声明Web应用的环境项

 
    minExemptions 
    1 
    java.lang.Integer 
 

(19)EJB 声明

 
    Example EJB reference 
    ejb/Account 
    Entity 
    com.mycompany.mypackage.AccountHome 
    com.mycompany.mypackage.Account 
 

(20)本地EJB声明

 
    Example Loacal EJB reference 
    ejb/ProcessOrder 
    Session 
    com.mycompany.mypackage.ProcessOrderHome 
    com.mycompany.mypackage.ProcessOrder 

借鉴:Web.xml文件详解_weixin_44458879的博客-CSDN博客

你可能感兴趣的:(xml)