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配置详解

2.1、web.xml加载过程

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

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

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

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

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

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

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

2.2、Web.xml中定义的元素

<web-app> 
    <!--定义了WEB应用的名字 -->
    <display-name></display-name>
    <!--声明WEB应用的描述信息 -->
    <description></description> 
    <!--context-param元素声明应用范围内的初始化参数。-->
    <context-param></context-param>  
    <!--过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。-->
    <filter></filter>  
    <!--一旦命名了一个过滤器,就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。 -->
    <filter-mapping></filter-mapping> 
    <!--servlet API的版本2.3增加了对事件监听程序的支持,事件监听程序在建立、修改和删除会话或servlet环境时得到通知。Listener元素指出事件监听程序类。-->
    <listener></listener> 
    <!--在向servlet或JSP页面制定初始化参数或定制URL时,必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。-->
    <servlet></servlet> 
    <!--服务器一般为servlet提供一个缺省的URL:http://host/webAppPrefix/servlet/ServletName.但是,常常会更改这个URL,以便servlet可以访问初始化参数或更容易地处理相对URL。在更改缺省URL时,使用servlet-mapping元素。 -->
    <servlet-mapping></servlet-mapping> 
    <!--如果某个会话在一定时间内未被访问,服务器可以抛弃它以节省内存。 可通过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对象的超时值,或者可利用session-config元素制定缺省超时值。 -->
    <session-config></session-config> 
    <!--如果Web应用具有想到特殊的文件,希望能保证给他们分配特定的MIME类型,则mime-mapping元素提供这种保证。 -->
    <mime-mapping></mime-mapping>
    <!--指示服务器在收到引用一个目录名而不是文件名的URL时,使用哪个文件。 -->
    <welcome-file-list></welcome-file-list> 
    <!--在返回特定HTTP状态代码时,或者特定类型的异常被抛出时,能够制定将要显示的页面。 -->
    <error-page></error-page> 
    <!--对标记库描述符文件(Tag Libraryu Descriptor file)指定别名。此功能使你能够更改TLD文件的位置,而不用编辑使用这些文件的JSP页面。 -->
    <taglib></taglib> 
    <!--声明与资源相关的一个管理对象。 -->
    <resource-env-ref></resource-env-ref>
    <!--声明一个资源工厂使用的外部资源。 -->
    <resource-ref></resource-ref> 
    <!--制定应该保护的URL。它与login-config元素联合使用 -->
    <security-constraint></security-constraint> 
    <!--指定服务器应该怎样给试图访问受保护页面的用户授权。它与sercurity-constraint元素联合使用。 -->
    <login-config></login-config> 
    <!--给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为容易。 -->
    <security-role></security-role>
    <!--声明Web应用的环境项。 -->
    <env-entry></env-entry>
    <!--声明一个EJB的主目录的引用。 -->
    <ejb-ref></ejb-ref>
    <!--声明一个EJB的本地主目录的应用。 -->
    <ejb-local-ref></ejb-local-ref>
</web-app>

相应元素配置:

(1)Web应用图标

<icon> 
    <small-icon>/images/app_small.gif</small-icon> 
    <large-icon>/images/app_large.gif</large-icon> 
</icon> 

(2)Web 应用名称

<display-name>App Name</display-name>

(3)Web 应用描述

<disciption>This is a app disciption.</disciption>

(4)上下文初始化参数

<context-param> 
    <param-name>ContextParameter</para-name> 
    <param-value>test</param-value> 
    <description>It is a test parameter.</description> 
</context-param> 

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

Spring配置文件:

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

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring-configuration/*.xml</param-value>
</context-param>
<listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

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

<!—business-client应用路径  -->  
<context-param>  
    <param-name>webAppRootKey</param-name>  
    <param-value>business.root</param-value>  
</context-param>  
<!—public-base应用路径  -->  
<context-param>  
    <param-name>webAppRootKey</param-name>  
    <param-value>pubbase.root</param-value>  
</context-param>  

这样就不会出现冲突了。就可以在运行时动态地找到项目路径,在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)过滤器配置

<!--****************************过滤器配置*********************************-->
<!-- 字符集过滤器 -->
<filter>
    <filter-name>CharacterEncodingFilter</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>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<!-- 单点登出过滤器 -->
<filter>
    <filter-name>CAS Single Sign Out Filter</filter-name>
    <filter-class>com.yonyou.mcloud.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<!-- 认证过滤器 -->
<filter>
    <filter-name>CAS Authentication Filter</filter-name>
    <filter-class>com.yonyou.mcloud.cas.client.authentication.ExpandAuthenticationFilter</filter-class>
    <init-param>
        <param-name>casServerLoginUrl</param-name>
        <param-value>https://dev.yonyou.com:443/sso-server/login</param-value>
    </init-param>
    <init-param>
        <!--这里的server是服务端的IP -->
        <param-name>serverName</param-name>
        <param-value>http://********</param-value>
    </init-param>
</filter>
<!-- 验证ST/PT过滤器 -->
<filter>
    <filter-name>CAS Validation Filter</filter-name>
    <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
    <init-param>
        <param-name>casServerUrlPrefix</param-name>
        <param-value>https://dev.yonyou.com:443/sso-server</param-value>
    </init-param>
    <init-param>
        <param-name>serverName</param-name>
        <param-value>http://10.1.215.40:80</param-value>
    </init-param>
    <init-param>
        <param-name>proxyCallbackUrl</param-name>
        <param-value>https://dev.yonyou.com:443/business/proxyCallback</param-value>
    </init-param>
    <init-param>
        <param-name>proxyReceptorUrl</param-name>
        <param-value>/proxyCallback</param-value>
    </init-param>
    <init-param>
        <param-name>proxyGrantingTicketStorageClass</param-name>
        <param-value>com.yonyou.mcloud.cas.client.proxy.MemcachedBackedProxyGrantingTicketStorageImpl</param-value>
    </init-param>
    <!-- 解决中文问题 -->
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter>
    <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
    <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter>
    <filter-name>CAS Assertion Thread Local Filter</filter-name>
    <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter>
    <filter-name>NoCache Filter</filter-name>
    <filter-class>com.yonyou.mcloud.cas.client.authentication.NoCacheFilter</filter-class>
</filter>
<!--****************************映射关系配置********************************-->
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>NoCache Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>CAS Single Sign Out Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>CAS Validation Filter</filter-name>
    <url-pattern>/proxyCallback</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>CAS Authentication Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>CAS Validation Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>CAS Assertion Thread Local Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

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-name>、<filter-class>、<init-param>、<filter-mapping>。

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

<filter-class>:指定过滤器类的完全限定的名称,即Filter的实现类。

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

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

(6)<session-config>用于设置容器的session参数,

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

<!-- Set timeout to 120 minutes -->
<session-config> 
   <session-timeout>120</session-timeout> 
</session-config>

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

(7)监听器配置

<listener> 
    <listerner-class>listener.SessionListener</listener-class> 
</listener>

7.1、Listener介绍:

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

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

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

ServletRequestListener用于监听用户的请求;

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

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

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

<listener>主要用于监听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的实现类,如下所示:

<listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

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

采用load-on-startup Servlet 实现:

<servlet>  
   <servlet-name>context</servlet-narne> 
   <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>  
   <load-on-startup>1</load-on-startup>  
</servlet> 

利用ServletContextListener实现:

<listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

我们选择了第二种方式,在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实例。

<!--****************************servlet配置******************************-->
<!-- Spring view分发器  对所有的请求都由business对应的类来控制转发 -->
<servlet>
    <servlet-name>business</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>publishContext</param-name>
      <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<!-- 用户登出 -->
<servlet>
    <servlet-name>LogOutServlet</servlet-name>
    <servlet-class>com.yonyou.mcloud.cas.web.servlet.LogOutServlet</servlet-class>
    <init-param>
      <param-name>serverLogoutUrl</param-name>
      <param-value>https://dev.yonyou.com:443/sso-server/logout</param-value>
    </init-param>
    <init-param>
      <param-name>serverName</param-name>
      <param-value>http://10.1.215.40:80/business/</param-value>
    </init-param>
</servlet>
<!--****************************servlet映射关系配置*************************-->
<servlet-mapping>
    <servlet-name>LogOutServlet</servlet-name>
    <url-pattern>/logout</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>business</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

8.2、Servlet具体配置:

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

  • 在Servlet类中使用@WebServlet Annotation进行配置。
  • 在web.xml文件中进行配置。

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

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

<!-- 
当Web应用启动时,装载Servlet的次序
当值为正数或零时:Servlet容器先加载数值小的servlet,再依次加载其他数值大的servlet. 
当值为负或未定义:Servlet容器将在Web客户首次访问这个servlet时加载它 
-->

8.2.1 、<servlet>

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

<servlet-class>:用来指定servlet的完全限定的名称。

8.2.2、<load-on-startup>

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

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

8.2.3、<servlet-mapping>

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

8.2.4、加载Servlet的过程

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

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

<!-- Spring view分发器  对所有的请求都由business对应的类来控制转发 -->
<servlet>
    <servlet-name>business</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>publishContext</param-name>
      <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

配置Spring MVC,指定处理请求的Servlet,有两种方式:

1)默认查找MVC配置文件的地址是:/WEB-INF/${servletName}-servlet.xml

2)可以通过配置修改MVC配置文件的位置,需要在配置DispatcherServlet时指定MVC配置文件的位置

8.4、ContextLoaderListener和DispatcherServlet初始化上下文关系和区别:

从上图可以看出,ContextLoaderListener初始化的上下文加载的Bean是对于整个应用程序共享的,一般如:DAO层、Service层Bean;DispatcherServlet初始化的上下文加载的Bean是只对Spring MVC有效的Bean,如:Controller、HandlerMapping、HandlerAdapter等,该初始化上下文只加载Web相关组件。 

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

(9)MIME类型配置

<mime-mapping> 
    <extension>html</extension> 
    <mime-type>text/html</mime-type> 
</mime-mapping> 

(10)欢迎页配置

<welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
    <welcome-file>index.html</welcome-file> 
    <welcome-file>index.htm</welcome-file> 
</welcome-file-list> 

(11)配置错误页面

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

<error-page> 
    <error-code>404</error-code> 
    <location>/404.jsp</location> 
</error-page> 

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

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

<error-page> 
    <exception-type>java.lang.NullException</exception-type> 
    <location>/error.jsp</location> 
</error-page> 

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

(12)TLD配置

<taglib> 
    <taglib-uri>http://jakarta.apache.org/tomcat/debug-taglib</taglib-uri> 
    <taglib-location>/WEB-INF/jsp/debug-taglib.tld</taglib-location> 
</taglib>

<!--如果MyEclipse一直在报错,应该把<taglib>放到<jsp-config>中-->
<jsp-config> 
    <taglib> 
        <taglib-uri>http://jakarta.apache.org/tomcat/debug-taglib</taglib-uri> 
        <taglib-location>/WEB-INF/pager-taglib.tld</taglib-location> 
    </taglib> 
</jsp-config> 

(13)资源管理对象配置

<resource-env-ref> 
    <resource-env-ref-name>jms/StockQueue</resource-env-ref-name> 
</resource-env-ref>

(14)资源工厂配置

<resource-ref> 
    <res-ref-name>mail/Session</res-ref-name> 
    <res-type>javax.mail.Session</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref>

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

<resource-ref> 
    <description>JNDI JDBC DataSource of shop</description> 
    <res-ref-name>jdbc/sample_db</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref> 

(15)安全限制配置

<security-constraint> 
  <display-name>Example Security Constraint</display-name> 
  <web-resource-collection> 
      <web-resource-name>Protected Area</web-resource-name> 
      <url-pattern>/jsp/security/protected/*</url-pattern> 
      <http-method>DELETE</http-method> 
      <http-method>GET</http-method> 
      <http-method>POST</http-method> 
      <http-method>PUT</http-method> 
  </web-resource-collection> 
  <auth-constraint> 
      <role-name>tomcat</role-name> 
      <role-name>role1</role-name> 
  </auth-constraint> 
</security-constraint>

(16)登陆验证配置

<login-config> 
    <auth-method>FORM</auth-method> 
    <realm-name>Example-Based Authentiation Area</realm-name> 
    <form-login-config> 
        <form-login-page>/jsp/security/protected/login.jsp</form-login-page> 
        <form-error-page>/jsp/security/protected/error.jsp</form-error-page> 
    </form-login-config> 
</login-config> 

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

<security-role> 
    <role-name>tomcat</role-name> 
</security-role> 

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

<env-entry> 
    <env-entry-name>minExemptions</env-entry-name> 
    <env-entry-value>1</env-entry-value> 
    <env-entry-type>java.lang.Integer</env-entry-type> 
</env-entry> 

(19)EJB 声明

<ejb-ref> 
    <description>Example EJB reference</decription> 
    <ejb-ref-name>ejb/Account</ejb-ref-name> 
    <ejb-ref-type>Entity</ejb-ref-type> 
    <home>com.mycompany.mypackage.AccountHome</home> 
    <remote>com.mycompany.mypackage.Account</remote> 
</ejb-ref> 

(20)本地EJB声明

<ejb-local-ref> 
    <description>Example Loacal EJB reference</decription> 
    <ejb-ref-name>ejb/ProcessOrder</ejb-ref-name> 
    <ejb-ref-type>Session</ejb-ref-type> 
    <local-home>com.mycompany.mypackage.ProcessOrderHome</local-home> 
    <local>com.mycompany.mypackage.ProcessOrder</local> 
</ejb-local-ref>

转自:Web.xml文件详解_weixin_44458879的博客-CSDN博客 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐