Servlet配置详解

Servlet配置详解



义头和根元素

    部署描述符文件就像所有 XML 文件一 ,必 以一个 XML 头开 始。 声明可以使用的 XML 版本并 出文件的字符 编码


    DOCYTPE声明必立即出在此之后。个声明告器适用的servlet范的版本(如2.22.3)并指定管理此文件其余部分内容的法的DTD(Document Type Definition,文档型定)

    所有部署描述符文件的顶层(根)元素web-app注意,XML元素不像HTML,他是大小写敏感的。因此,web-AppWEB-APP都是不合法的,web-app用小写。

部署描述符文件内的元素次序


    XML 
元素不 是大小写敏感的,而且它 们还对 在其他元素中的次序敏感。例如, XML 是文件中的第一 DOCTYPE 声明必 是第二 ,而 web- app 元素必 是第三 。在 web-app 元素内,元素的次序也很重要。服 器不一定 制要求 这种 次序,但它 实际 上有些服 器就是 这样 做的)完全拒 绝执 行含有次序不正确的元素的 Web 用。 表示使用非 准元素次序的 web.xml 文件是不可移植的。


    下面的列表出了所有可直接出web-app元素内的合法元素所必需的次序。例如,此列表servlet元素必在所有servlet-mapping元素之前。注意,所有些元素都是可的。因此,可以省略掉某一元素,但不能把它放于不正确的位置。

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

分配名称和定制的UL


    在 web.xml 中完成的一个最常 的任 servlet JSP 出名称和定制的 URL servlet 元素分配名称,使用 servlet-mapping 元素将定制的 URL 分配的名称相 关联

3.1 分配名称

    为 了提供初始化参数, servlet JSP 面定 一个定制 URL 或分配一个安全角色,必 首先 servlet JSP 面一个名称。可通  servlet 元素分配一个名称。最常 的格式包括 servlet-name servlet-class 子元素(在 web-app 元素内),如下所示:

    Test
    moreservlets.TestServlet
    这 表示位于 WEB-INF/classes/moreservlets/TestServlet servlet 得到了注册名 Test  servlet 一个名称具有两个主要的含 。首先,初始化参数、定制的 URL 模式以及其他定制通 此注册名而不是 名引用此 servlet 。其次 , 可在  URL 而不是 名中使用此名称。因此,利用 出的定 URL  http://host/webAppPrefix/servlet/Test 可用于 http://host/webAppPrefix/servlet/moreservlets.TestServlet 所。
    请记 住: XML 元素不 是大小写敏感的,而且定 的次序也很重要。例如, web-app 元素内所有 servlet 元素必 位于所有 servlet- mapping 元素(下一小 )之前,而且 要位于 5.6 5.11 节讨论 的与 过滤 器或文档相 的元素(如果有的 )之前。 似地, servlet  servlet-name 子元素也必 servlet-class 之前。 5.2 " 部署描述符文件内的元素次序 " 详细 绍这种 必需的次序。
    例如,程序清 5-1 出了一个名 TestServlet 简单 servlet ,它 留在 moreservlets 程序包中。因 servlet 是扎根在一个名 deployDemo 的目 中的 Web 用的 成部分,所以 TestServlet.class 放在 deployDemo/WEB- INF/classes/moreservlets 中。程序清 5-2 出将放置在 deployDemo/WEB-INF/ 内的 web.xml 文件的一部分。此 web.xml 文件使用 servlet-name servlet-class 元素将名称 Test TestServlet.class 关联  5-1 5-2 别显 示利用缺省 URL 和注册名 TestServlet 果。

程序清单5-1 TestServlet.java
package moreservlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/** Simple servlet used to illustrate servlet naming
* and custom URLs.
* 

* Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * © 2002 Marty Hall; may be freely used or adapted. */ public class TestServlet extends HttpServlet {     public void doGet(HttpServletRequest request,HttpServletResponse response)         throws ServletException, IOException {         response.setContentType("text/html");         PrintWriter out = response.getWriter();         String uri = request.getRequestURI();         out.println(ServletUtilities.headWithTitle("Test Servlet") +             "/n" +             "

URI: " + uri + "

/n" +             "");     } }
程序清单5-2 web.xml(说明servlet名称的摘录)






    Test
    moreservlets.TestServlet


3.2 定制的URL

    大多数服 器具有一个缺省的 serlvet URL

http://host/webAppPrefix/servlet/packageName.ServletName然在开发中使用URL很方便,但是我常常会希望另一个URL用于部署。例如,可能会需要一个出Web顶层URL(如,http: //host/webAppPrefix/Anyname),并且在此URL中没有servlet。位于顶层URL化了相URL的使用。此外,对许开发顶层URL看上去比更更麻的缺省URL短。

    事上,有需要使用定制的URL。比如,你可能想关闭缺省URL映射,以便更好地施安全限制或防止用意外地访问无初始化参数的servlet。如果你禁止了缺省的URL,那你怎样访问servlet呢?这时只有使用定制的URL了。

    为 了分配一个定制的 URL ,可使用 servlet-mapping 元素及其 servlet-name url-pattern 子元素。 Servlet- name 元素提供了一个任意名称,可利用此名称引用相 servlet url-pattern 描述了相 Web 用的根目 URL url- pattern 元素的 以斜杠( / )起始。
下面 出一个 简单 web.xml ,它允 使用 URL  http://host/webAppPrefix/UrlTest 而不是 http://host/webAppPrefix/servlet/Test
http: //host/webAppPrefix/servlet/moreservlets.TestServlet
注意,仍然需要 XML  DOCTYPE 声明以及 web-app 元素。此外,可回 一下, XML 元素出 地次序不是随意的。特 是,需要把所有 servlet 元素放在所有 servlet-mapping 元素之前。

    Test
    moreservlets.TestServlet



    Test
    /UrlTest
    URL 模式 可以包含通配符。例如,下面的小程序指示服 送所有以 Web 用的 URL 缀开 始,以 ..asp 束的 求到名 BashMS servlet

    BashMS
    msUtils.ASPTranslator



    BashMS
    /*.asp

3.3 命名JSP

    因 JSP 面要 转换 sevlet ,自然希望就像命名 servlet 命名 JSP 面。 竟, JSP 面可能会从初始化参数、安全 置或定制的 URL 中受益,正如普通的 serlvet JSP 面的后台 实际 上是 servlet 是正确的,但 存在一个 关键 的猜疑:即,你不知道 JSP 面的 实际类 名(因 自己挑 选这 个名字)。因此, 了命名 JSP 面,可将 jsp-file 元素替 换为 servlet-calss 元素,如下所示:

    Test
    /TestPage.jsp

    命名JSP面的原因与命名servlet的原因完全相同:即了提供一个与定制置(如,初始化参数和安全置)一起使用的名称,并且,以便能更改激活 JSP面的URL(比方,以便多个URL相同面得以理,或者从URL中去掉.jsp展名)。但是,在置初始化参数应该注意,JSP面是利用jspInit方法,而不是init方法取初始化参数的。

    例如,程序清 5-3 出一个名 TestPage.jsp 简单 JSP 面,它的工作只是打印出用来激活它的 URL 的本地部分。 TestPage.jsp 放置在 deployDemo 用的 顶层 。程序清 5-4 出了用来分配一个注册名 PageName ,然后将此注册名与 http://host/webAppPrefix/UrlTest2/anything 形式的 URL 关联 web.xml 文件(即, deployDemo/WEB-INF/web.xml )的一部分。

程序清 5-3 TestPage.jsp




JSP Test Page


URI: <%= request.getRequestURI() %>

程序清 5-4 web.xml JSP 命名的摘






    PageName
    /TestPage.jsp



     PageName 
    /UrlTest2/*


禁止激活器servlet

    对servletJSP面建立定制URL的一个原因是,这样做可以注册从 initservlet)jspInitJSP面)方法中取得初始化参数。但是,初始化参数只在是利用定制URL模式或注册名访问 servletJSP可以使用,用缺省URLhttp://host/webAppPrefix/servlet/ServletName访问时不能使用。因此,你可能会希望关闭缺省URL这样就不会有人意外地用初始化servlet了。程有禁止激活器servlet,因多数服器具有一个用缺省的servlet URL注册的servlet,并激活缺省的URL用的实际servlet

有两 禁止此缺省 URL 的主要方法:
1. 
Web 用中重新映射 /servlet/ 模式。

2.全局关闭激活器servlet

    重要的是应该注意到,然重新映射Web用中的/servlet/模式比底禁止激活servlet所做的工作更多,但重新映射可以用一完全可移植的方式来完成。相反,全局禁止激活器servlet完全是针对具体机器的,事上有的服器(如ServletExec)没有这样选择。下面的讨论对每Web用重新映射/servlet/ URL模式的策略。后面提供在Tomcat中全局禁止激活器servlet详细内容。

4.1 重新映射/servlet/URL模式

    在一个特定的Web用中禁止以http://host/webAppPrefix/servlet/始的URL理非常简单。所需做的事情就是建立一个错误消息servlet,并使用前一节讨论url-pattern元素将所有匹配 servlet。只要简单地使用:

 /servlet/*

servlet-mapping元素中的模式即可。

例如,程序清5-5出了将SorryServlet servlet(程序清5-6)与所有以http://host/webAppPrefix/servlet/开头URL关联的部署描述符文件的一部分。


程序清 5-5 web.xml JSP 命名的摘






    Sorry
    moreservlets.SorryServlet



     Sorry 
    /servlet/*


程序清 5-6 SorryServlet.java
package moreservlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/** Simple servlet used to give error messages to
* users who try to access default servlet URLs
* (i.e., http://host/webAppPrefix/servlet/ServletName)
* in Web applications that have disabled this
* behavior.
* 

* Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * © 2002 Marty Hall; may be freely used or adapted. */ public class SorryServlet extends HttpServlet {     public void doGet(HttpServletRequest request,HttpServletResponse response)         throws ServletException, IOException {         response.setContentType("text/html");         PrintWriter out = response.getWriter();         String title = "Invoker Servlet Disabled.";         out.println(ServletUtilities.headWithTitle(title) +         "/n" +         "

" + title + "

/n" +         "Sorry, access to servlets by means of/n" +         "URLs that begin with/n" +         "http://host/webAppPrefix/servlet//n" +         "has been disabled./n" +         "");     }     public void doPost(HttpServletRequest request,HttpServletResponse response)         throws ServletException, IOException {         doGet(request, response);     } }

4.2 全局禁止激活器:Tomcat

    Tomcat 4 中用来 关闭 缺省 URL 的方法与 Tomcat 3 中所用的很不相同。下面介 绍这 方法:

1.禁止激活器: Tomcat 4

    Tomcat 4 用与前面相同的方法 关闭 激活器 servlet ,即利用 web.xml 中的 url-mapping 元素 关闭 。不同之 在于 Tomcat 使用了放在  install_dir/conf 中的一个服 用的全局 web.xml 文件,而前面使用的是存放在 Web 用的 WEB-INF 中的  web.xml 文件。
因此, 了在 Tomcat 4 关闭 激活器 servlet ,只需在 install_dir/conf/web.xml 简单 地注 /servlet/* URL 映射 即可,如下所示:

    invoker
    /servlet/*
    再次提醒, 应该 注意 是位于存放在 install_dir/conf Tomcat 用的 web.xml 文件中的,此文件不是存放在 Web 用的 WEB-INF 中的 web.xml

2.禁止激活器:Tomcat3

    在 Apache Tomcat 的版本 3 中,通 install_dir/conf/server.xml 中注 InvokerInterceptor 全局禁止缺省 servlet URL 。例如,下面是禁止使用缺省 servlet URL server.xml 文件的一部分。

初始化和servletJSP


    这 讨论 控制 servlet JSP 面的启 的方法。特 是, 明了怎 分配初始化参数以及怎 更改服 器生存期中装 servlet JSP 面的 刻。

5.1 分配servlet初始化参数

    利用 init-param 元素向 servlet 提供初始化参数, init-param 元素具有 param-name param-value 子元素。例如,在下面的例子中,如果 initServlet servlet 是利用它的注册名( InitTest 访问 的,它将能 从其方法中 getServletConfig().getInitParameter("param1") "Value 1" getServletConfig().getInitParameter("param2") "2"

InitTest
moreservlets.InitServlet
    
        param1
        value1
    
    
        param2
        2
    
    在 及初始化参数 ,有几点需要注意:
  • 返回GetInitParameter的返回值总是一个String。因此,在前一个例子中,可param2使用Integer.parseInt得一个int
  • JSP中的初始化。JSP面使用jspInit而不是initJSP需要使用jsp-file元素代替servlet-class
  • 缺省URL。初始化参数只在通的注册名或与它注册名相的定制URL模式访问Servlet可以使用。因此,在个例子中,param1 param2初始化参数将能在使用URL http://host/webAppPrefix/servlet/InitTest可用,但在使用URL http://host/webAppPrefix/servlet/myPackage.InitServlet不能使用。
    例如,程序清 5-7 出一个名 InitServlet 简单 servlet ,它使用 init 方法 firstName emailAddress 字段。程序清 5-8 出分配名称 InitTest servlet web.xml 文件。
程序清 5-7 InitServlet.java
package moreservlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/** Simple servlet used to illustrate servlet
* initialization parameters.
* 

* Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * © 2002 Marty Hall; may be freely used or adapted. */ public class InitServlet extends HttpServlet {     private String firstName, emailAddress;     public void init() {         ServletConfig config = getServletConfig();         firstName = config.getInitParameter("firstName");         emailAddress = config.getInitParameter("emailAddress"); }     public void doGet(HttpServletRequest request,HttpServletResponse response)         throws ServletException, IOException {         response.setContentType("text/html");         PrintWriter out = response.getWriter();         String uri = request.getRequestURI();         out.println(ServletUtilities.headWithTitle("Init Servlet") +         "/n" +         "

Init Parameters:

/n" +         "
    /n" +         "
  • First name: " + firstName + "/n" +         "
  • Email address: " + emailAddress + "/n" +         "
/n" +         "");     } }
程序清 5-8 web.xml 明初始化参数的摘






    InitTest
    moreservlets.InitServlet
        
            firstName
            Larry
        
        
            emailAddress
            [email protected]
        
    

5.2 分配JSP初始化参数

    给 JSP 面提供初始化参数在三个方面不同于 servlet 提供初始化参数。
1
)使用 jsp-file 而不是 servlet-class 。因此, WEB-INF/web.xml 文件的 servlet 元素如下所示:

    PageName
    /RealPage.jsp
    
        ...
        ...
    
...
2)  几乎 是分配一个明确的 URL 模式。 servlet ,一般相 地使用以 http://host/webAppPrefix/servlet/ 始的缺省 URL 。只需 住,使用注册名而不是原名称即可。 这对 JSP 面在技 上也是合法的。例如,在上面 出的例子中,可用 URL  http://host/webAppPrefix/servlet/PageName 访问 RealPage.jsp 初始化参数具有 访问权 的版本。但在用于 JSP 多用 似乎不喜 欢应 用常 servlet URL 。此外,如果  JSP 面位于服 其提供了目 的目 中(如,一个既没有 index.html 也没有 index.jsp 文件的目 ), 可能会 接到此  JSP 面, 单击 它,从而意外地激活未初始化的 面。因此,好的 法是使用 url-pattern 5.3 )将 JSP 面的原 URL 与注册的  servlet 名相 关联 这样 ,客 机可使用 JSP 面的普通名称,但仍然激活定制的版本。例如, 定来自 1 servlet ,可使用下面的  servlet-mapping

    PageName
    /RealPage.jsp
3 JSP 使用 jspInit 而不是 init 。自 JSP 面建立的 servlet 使用了 inti 方法。因此,使用 JSP 声明提供一个 init 方法是不合法的,必 制定 jspInit 方法。
明初始化 JSP 面的 程,程序清 5-9 出了一个名 InitPage.jsp JSP 面,它包含一个 jspInit 方法且放置于 deployDemo Web 构的 顶层 。一般, http://host/deployDemo/InitPage.jsp 形式的 URL 将激活此 面的不具有初始化参数 访问权 的版本,从而将 firstName emailAddress null 。但是,  web.xml 文件(程序清 5-10 )分配了一个注册名,然后将 注册名与 URL 模式 /InitPage.jsp 关联

程序清 5-9 InitPage.jsp


JSP Init Test

Init Parameters:

  • First name: <%= firstName %>
  • Email address: <%= emailAddress %>
<%! private String firstName, emailAddress; public void jspInit() {     ServletConfig config = getServletConfig();     firstName = config.getInitParameter("firstName");     emailAddress = config.getInitParameter("emailAddress"); } %>
程序清 5-10 web.xml JSP 面的 init 参数的摘






    InitPage
    /InitPage.jsp
        
            firstName
            Bill
        
        
            emailAddress
            [email protected]
        

 

         InitPage
        /InitPage.jsp



5.3 提供用范内的初始化参数

    一般, 对单 个地 servlet JSP 面分配初始化参数。指定的 servlet JSP 面利用 ServletConfig getInitParameter 方法 些参数。但是,在某些情形下,希望提供可由任意 servlet JSP 面借助 ServletContext getInitParameter 方法 取的系 内的初始化参数。
    可利用 context-param 元素声明 些系 内的初始化 context-param 元素 应该 包含 param-name param-value 以及可 description 子元素,如下所示:

    support-email
    [email protected]
    可回 一下, 了保 可移植性, web.xml 内的元素必 以正确的次序声明。但 应该 注意, context-param 元素必 任意与文档有 的元素( icon display-name description )之后及 filter filter-mapping listener  servlet 元素之前。

5.4 在服器启动时servlet

    假如 servlet JSP 面有一个要花很 长时间执 行的 init  servlet )或 jspInit JSP )方法。例如,假如 init jspInit 方法从某个数据 ResourceBundle 量。 这种 情况下,在第一个客 servlet 的缺省行 一个客 较长时间 的延 。因此,可利用 servlet load-on- startup 元素 定服 器在第一次启 动时 servlet 。下面是一个例子。

    
     
    
    可以 此元素体提供一个整数而不是使用一个空的 load-on-startup 。想法是服 应该 在装 载较 大数目的 servlet JSP 面之前装 载较 少数目的 servlet JSP 面。例如,下面的 servlet (放置在 Web 用的 WEB-INF 下的 web.xml 文件中的 web-app 元素内)将指示服 器首先装 和初始化 SearchServlet ,然后装 和初始化由位于 Web 用的 result 中的 index.jsp 文件 生的  servlet

    Search
    myPackage.SearchServlet 
    1


    Results
    /results/index.jsp 
    2

声明过滤


    servlet
版本 2.3 引入了 过滤 器的概念。 然所有支持 servlet API 版本 2.3 的服 器都支持 过滤 器,但 了使用与 过滤 器有 的元素,必 web.xml 中使用版本 2.3 DTD
    过滤 器可截取和修改 入一个 servlet JSP 面的 求或从一个 servlet JSP 出的相 。在 行一个 servlet JSP 面之前,必 须执 行第一个相 过滤 器的 doFilter 方法。在 该过滤 FilterChain doFilter 中的下一个 过滤 器。如果没有其他 过滤 servlet JSP 面被 行。 过滤 器具有 到来的 ServletRequest 象的全部 访问权 ,因此,它 可以 看客 机名、 找到来的 cookie 等。 访问 servlet JSP 面的 出, 过滤 器可将响 应对 象包裹在一个替身 象( stand-in object )中,比方 出累加到一个 冲区。在 FilterChain 象的 doFilter 方法之后, 过滤 器可 检查缓 冲区,如有必要,就 行修改,然后 送到客 机。
    例如,程序清 5-11 帝国 以了一个 简单 过滤 器,只要 访问 servlet JSP 面,它就截取 求并在 出上打印一个 告( 开发过 程中在桌面系 上运行 ,大多数服 器都可以使用 过滤 器)。

程序清 5-11 ReportFilter.java
package moreservlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

/** Simple filter that prints a report on the standard output 
* whenever the associated servlet or JSP page is accessed.
* 

* Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * © 2002 Marty Hall; may be freely used or adapted. */ public class ReportFilter implements Filter { public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain)     throws ServletException, IOException {     HttpServletRequest req = (HttpServletRequest)request;     System.out.println(req.getRemoteHost() +" tried to access " +req.getRequestURL() +" on " + new Date() + ".");     chain.doFilter(request,response); } public void init(FilterConfig config) throws ServletException { } public void destroy() {} }

    一旦建立了一个 过滤 器,可以在 web.xml 中利用 filter 元素以及 filter-name (任意名称)、 file-class (完全限定的 名)和(可 的) init-params 子元素声明它。 注意,元素在 web.xml web-app 元素中出 的次序不是任意的;允 器(但不是必需的) 制所需的次序,并且 实际 中有些服 器也是 这样 做的。但 里要注意,所有 filter 元素必 在任意 filter-mapping 元素之前,  filter-mapping 元素又必 在所 servlet servlet-mapping 元素之前。
    例如, 定上述的 ReportFilter ,可在 web.xml 中作出下面的 filter 声明。它把名称 Reporter 实际 ReportFilter (位于 moreservlets 程序包中)相 关联

    Reporter
    moresevlets.ReportFilter
    一旦命名了一个 过滤 器,可利用 filter-mapping 元素把它与一个或多个 servlet JSP 面相 关联 于此 工作有两 种选择
    首先,可使用 filter-name servlet-name 子元素把此 过滤 器与一个特定的 servlet 名(此 servlet 名必 稍后在相同的 web.xml 文件中使用 servlet 元素声明) 关联 。例如,下面的程序片断指示系 只要利用一个定制的 URL 访问 SomeServletName  servlet JSP 面,就运行名 Reporter 过滤 器。

    Reporter
    SomeServletName
    其次,可利用 filter-name url-pattern 子元素将 过滤 器与一 servlet JSP 面或静 内容相 关联 。例如,相面的程序片段指示系 只要 访问 Web 用中的任意 URL ,就运行名 Reporter 过滤 器。

    Reporter
    /*
    例如,程序清 5-12 出了将 ReportFilter 过滤 器与名 PageName servlet 关联 web.xml 文件的一部分。名字 PageName 依次又与一个名 TestPage.jsp JSP 面以及以模式 http: //host/webAppPrefix/UrlTest2/  开头 URL 关联 TestPage.jsp 的源代 JSP 面命名的 谈论 在前面的 3 " 分配名称和定制的 URL" 出。事 上,程 序清 5- 12 中的 servlet servlet-name 该节 原封不 地拿 来的。 web.xml ,可看到下面的 出形式的 调试报 告( 行是 了容易 阅读 )。
audit.irs.gov tried to access 
http://mycompany.com/deployDemo/UrlTest2/business/tax-plan.html
on Tue Dec 25 13:12:29 EDT 2001.

程序清 5-12 Web.xml filter 用法的摘





    Reporter
    moresevlets.ReportFilter



    Reporter
    PageName



    PageName
    /RealPage.jsp



     PageName 
    /UrlTest2/*


指定


    假如用 提供了一个像 http: //host/webAppPrefix/directoryName/  这样 的包含一个目 名但没有包含文件名的 URL ,会 生什 事情呢?用 能得到一个目 表?一个 错误 准文件的内容?如果得到 准文件内容,是 index.html index.jsp default.html default.htm 的什 么东 西呢?
    Welcome-file-list 
元素及其 助的 welcome-file 元素解决了 个模糊的 问题 。例如,下面的 web.xml 指出,如果一个 URL 出一个目 名但未 出文件名,服 应该 首先 index.jsp ,然后再 index.html 。如果两者都没有找到, 则结 果有 于所用的服 器(如一个目 列表)。

    index.jsp
    index.html
    虽 多服 器缺省遵循 这种 ,但不一定必 须这样 。因此,明确地使用 welcom-file-list 可移植性是一 良好的 习惯

指定错误


    现 在我了解到,你在 开发 servlet JSP 从不会犯 错误 ,而且你的所有 面是那 的清晰,一般的程序 都不会被它 的搞糊涂。但是,是人 会犯 错误 的,用 可能会提供不合 定的参数,使用不正确的 URL 或者不能提供必需的表 字段 。除此之外,其它 开发 可能不那 么细 心,他 们应该 有些工具来克服自己的不足。
    error-page
元素就是用来克服 问题 的。它有两个可能的子元素,分 是: error-code exception- type 。第一个子元素 error-code 指出在 定的 HTTP 错误 现时 使用的 URL 。第二个子元素 excpetion-type 指出在出 某个 定的 Java 异常但未捕捉到 使用的 URL error-code exception-type 都利用 location 元素指出相 URL 。此  URL / 始。 location 所指出的位置 面可通 过查 HttpServletRequest 象的两个 专门 的属性来 访问关 错误 信息, 两个属性分 是: javax.servlet.error.status_code javax.servlet.error.message
    可回 一下,在 web.xml 内以正确的次序声明 web-app 的子元素很重要。 里只要 住, error-page web.xml 文件的末尾附近, servlet servlet-name welcome-file-list 之后即可。

8.1 error-code元素

    为 了更好地了解 error-code 元素的 ,可考 一下如果不正确地 入文件名,大多数站点会作出什 反映。 这样 做一般会出 一个 404 错误 信息,它表示不能找到 文件,但几乎没提供更多有用的信息。另一方面,可以 一下在 www.microsoft.com www.ibm.com 或者特 是在 www.bea.com 处输 出未知的文件名。 是会得出有用的消息, 些消息提供可 选择 的位置,以便 找感 趣的 面。提供 这样 有用的 错误页 Web 用来 是很有价 得。事 rm-error-page 子元素)。由 form-login-page 出的 HTML 具有一个 j_security_check  ACTION 属性、一个名 j_username 的用 名文本字段以及一个名 j_password 的口令字段。
    例如,程序清 5-19 指示服 器使用基于表 验证 Web 用的 顶层 中的一个名 login.jsp 面将收集用 名和 口令,并且失 的登 将由相同目 中名 login-error.jsp 告。

程序清 5-19 web.xml login-config 的摘





 ... 

     FORM 
    
    /login.jsp
        /login-error.jsp
    


9.2 限制Web源的访问

    现 在,可以指示服 器使用何 种验证 方法了。 " 了不起, " 道, " 除非我能指定一个来收到保  URL ,否 没有多大用 " 。指出 URL 明他 们应该 得到何 正是 security-constriaint 元素的用途。此元素在  web.xml 应该 login-config 前面。它包含是个可能的子元素,分 是: web-resource-collection  auth-constraint user-data-constraint display-name 。下面各小 节对 们进 行介
1. web-resource-collection
    此元素确定 应该 源。所有 security-constraint 元素都必 包含至少一个 web-resource-collection 。此元素由一个 出任意 标识 名称的 web-resource-name 元素、一个确定 应该 URL url-pattern 元素、一个指出此保 所适用的  HTTP 命令( GET POST 等,缺省 所有方法)的 http-method 元素和一个提供 料的可 description 元素 成。例如,下面的  Web-resource-collection (在 security-constratint 元素内)指出 Web 用的 proprietary 中所有文档 应该 受到保


    Proprietary
    /propritary/*


    重要的是 应该 注意到, url-pattern 适用于直接 访问这 源的客 机。特 是,它不适合于通 MVC 体系 构利用 RequestDispatcher 访问 面,或者不适合于利用 jsp:forward 的手段来 访问 面。 这种 不匀称如果利 用得当的 很有好 。例如, servlet 可利用 MVC 体系 找数据,把它放到 bean 中, 求到从 bean 中提取数据的 JSP 面并 示它。我 希望保 决不直接 访问 受保 JSP 面,而只是通 建立 该页 面将使用的 bean servlet 访问 它。 url-pattern auth-contraint 元素可通 声明不允 任何用 直接 访问 JSP 面来提供 这种 。但是, 这种 不匀称的行 可能 让开发 放松警惕,使他 偶然 对应 受保 源提供不受限制的 访问  
2. auth-constraint
    尽管 web-resource-collention 元素 出了哪些 URL 应该 受到保 ,但是 auth-constraint 元素却指出哪些用 户应该 具有受保 护资 源的 访问权 。此元素 应该 包含一个或多个 标识 具有 访问权 限的用 户类别 role- name 元素,以及包含(可 )一个描述角色的 description 元素。例如,下面 web.xml 中的 security-constraint 元素部 门规 定只有指定 Administrator Big Kahuna (或两者)的用 具有指定 源的 访问权

     ... 
    
        administrator
        kahuna
    
    重要的是 认识 到,到此 止, 程的可移植部分 束了。服 器怎 确定哪些用 户处 于任何角色以及它怎 存放用 的口令,完全有 于具体的系
    例如, Tomcat 使用 install_dir/conf/tomcat-users.xml 将用 名与角色名和口令相 关联 ,正如下面例子中所示,它指出用 joe (口令 bigshot )和 jane (口令 enaj )属于 administrator kahuna 角色。

    
    

l user-data-constraint
    这 个可 的元素指出在 访问 关资 使用任何 传输层 。它必 包含一个 transport-guarantee 子元素(合法 值为 NONE  INTEGRAL CONFIDENTIAL ),并且可 地包含一个 description 元素。 transport-guarantee NONE 所用的通 讯协议 不加限制。 INTEGRAL 表示数据必 以一 防止截取它的人 阅读 它的方式 送。 然原理上(并且在未来的 HTTP 版本中),在  INTEGRAL CONFIDENTIAL 可能会有差 ,但在当前 践中,他 都只是 简单 地要求用 SSL 。例如,下面指示服 器只允 许对 关资 源做  HTTPS 接:


    
        CONFIDENTIAL
    

l display-name
security-constraint 个很少使用的子元素 予可能由 GUI 工具使用的安全 一个名称。

9.3 分配角色名

    迄今 止, 讨论 集中到完全由容器(服 器) 理的安全 问题 之上了。但 servlet 以及 JSP 面也能 够处 理它 自己的安全 问题
    例如,容器可能允 bigwig bigcheese 角色 访问 一个 示主管人 员额 紧贴 面,但只允 bigwig 修改此 面的参数。完成 这种 致的控制的一 方法是 HttpServletRequset isUserInRole 方法,并据此修改 访问
    Servlet
 security-role-ref 子元素提供出 在服 用口令文件中的安全角色名的一个 名。例如,假如 写了一个  request.isUserInRole "boss" )的 servlet ,但后来 servlet 被用在了一个其口令文件 用角色 manager 而不是 boss 的服 器中。下面的程序段使 servlet 使用 两个名称中的任何一个。



    boss 
    manager 

    也可以在 web-app 内利用 security-role 元素提供将出 role-name 元素中的所有安全角色的一个全局列表。分 地生命角色使高 IDE 容易 理安全信息。

10 控制会


    如果某个会 在一定的 时间 内未被 访问 ,服 器可把它扔掉以 节约 内存。可利用 HttpSession setMaxInactiveInterval 方法直接 置个 话对 象的超 时值 。如果不采用 这种 方法, 缺省的超 时值 由具体的服 器决定。但可利用 session-config session- timeout 元素来 出一个适用于所有服 器的明确的超 时值 。超 时值 ,因此,下面的例子 置缺省会 时值为 三个小 180 )。

180

11 Web用的文档化


    越来越多的 开发环 始提供 servlet JSP 的直接支持。例子有 Borland Jbuilder Enterprise Edition Macromedia UltraDev Allaire JRun Studio (写此文 ,已被 Macromedia )以及 IBM VisuaAge for Java 等。
    大量的 web.xml 元素不 设计 的,而且 视开发环 设计 的。它 包括 icon display-name discription 等。
    可回 一下,在 web.xml 内以适当地次序声明 web-app 子元素很重要。不 里只要 icon display-name description web.xml web-app 元素内的前三个合法元素即可。

1. icon

    icon 元素指出 GUI 工具可用来代表 Web 用的一个和两个 像文件。可利用 small-icon 元素指定一幅 16 x 16 GIF JPEG 像,用 large-icon 元素指定一幅 32 x 32 像。下面 一个例子:  

    /images/small-book.gif
    /images/tome.jpg

2. display-name

    display-name 元素提供 GUI 工具可能会用来 标记 Web 用的一个名称。下面是个例子。
Rare Books

3. description

description 元素提供解 性文本,如下所示:

This Web application represents the store developed for
rare-books.com, an online bookstore specializing in rare
and limited-edition books.

12 关联文件与MIME


    服 器一般都具有一 种让 Web 站点管理 将文件 展名与媒体相 关联 的方法。例如,将会自 动给 予名 mom.jpg 的文件一个 image/jpeg MIME  型。但是,假如你的 Web 用具有几个不 常的文件,你希望保 送到客 分配 MIME 型。 mime-mapping 元素(具有  extension mime-type 子元素)可提供 这种 。例如,下面的代 指示服 器将 application/x-fubar MIME 型分配 所有以 .foo 尾的文件。

    foo
    application/x-fubar
    或 ,你的 Web 用希望重 override 准的映射。例如,下面的代 将告 器在 送到客 指定 .ps 文件作 为纯 文本( text/plain )而不是作 PostScript application/postscript )。

    ps
    application/postscript

13 定位TLD


    JSP taglib
元素具有一个必要的 uri 属性,它 出一个 TLD Tag Library Descriptor )文件相 Web 用的根的位置。 TLD 文件的 实际 名称在 布新的 标签库 版本 可能会改 ,但我 希望避免更改所有 JSP 面。此外,可能 希望使用保持 taglib 元素的 简练 性的一个 短的 uri 就是部署描述符文件的 taglib 元素派用 的所在了。 Taglib 包含两个子元素: taglib-uri taglib-location taglib-uri 元素 应该 与用于 JSP taglib 元素的 uri 属性的 西相匹配。 Taglib-location 元素 TLD 文件的 实际 位置。例如,假如你将文件 chart-tags- 1.3beta.tld 放在 WebApp/WEB-INF/tlds 中。 在,假如 web.xml web-app 元素内包含下列内容。

    /charts.tld
    
        /WEB-INF/tlds/chart-tags-1.3beta.tld
    
明后, JSP 面可通 下面的 化形式使用 标签库
<%@ taglib uri="/charts.tld" prefix="somePrefix" %>

14 指定用事件听程序


    应 用事件 听器 程序是建立或修改 servlet 境或会 话对 通知的 。它 servlet 范的版本 2.3 中的新内容。 里只 简单 明用来向 Web 用注册一个 听程序的 web.xml 的用法。
注册一个 听程序 及在 web.xml web-app 元素内放置一个 listener 元素。在 listener 元素内, listener-class 元素列出 听程序的完整的限定 名,如下所示:

package.ListenerClass




    虽 listener 元素的 构很 简单 ,但 不要忘 ,必 正确地 web-app 元素内的子元素的次序。 listener 元素位于所有的 servlet  元素之前以及所有 filter-mapping 元素之后。此外,因 为应 用生存期 听程序是 serlvet 范的 2.3 版本中的新内容,所以必 使用  web.xml DTD 2.3 版本,而不是 2.2 版本。
    例如,程序清 5-20 出一个名 ContextReporter 简单 听程序,只要 Web 用的 Servlet-Context 建立(如装 Web 用)或消除 (如服 关闭 ,它就在 出上 示一条消息。程序清 5-21 出此 听程序注册所需要的 web.xml 文件的一部分。

程序清 5-20 ContextReporterjava
package moreservlets;

import javax.servlet.*;
import java.util.*;

/** Simple listener that prints a report on the standard output 
* when the ServletContext is created or destroyed.
* 

* Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * © 2002 Marty Hall; may be freely used or adapted. */ public class ContextReporter implements ServletContextListener {     public void contextInitialized(ServletContextEvent event) {         System.out.println("Context created on " +new Date() + ".");     }     public void contextDestroyed(ServletContextEvent event) {         System.out.println("Context destroyed on " +new Date() + ".");     } }

程序清 5-21 web.xml (声明一个 听程序的摘







    package.ListenerClass

 ... 

15 J2EE元素


    本 描述用作 J2EE 成部分的 Web 用的 web.xml 元素。 里将提供一个 明的介 详细 内容可以参 http://java.sun.com/j2ee/j2ee-1_3-fr-spec.pdf Java 2 Plantform Enterprise Edition 版本 1.3 范的第 5 章。

1. distributable

    distributable  元素指出, Web 用是以 这样 的方式 程的:即,支持集群的服 器可安全地在多个服 器上分布 Web 用。例如,一个可分布的 用必 只使用  Serializable 象作 HttpSession 象的属性,而且必 避免用 量(字段)来 实现 性。 distributable 元素直接出 discription 元素之后,并且不包含子元素或数据,它只是一个如下的 志。

2. resource-env-ref

    resource -env-ref 元素声明一个与某个 源有 的管理 象。此元素由一个可 description 元素、一个 resource-env-ref- name 元素(一个相 java:comp/env 境的 JNDI 名)以及一个 resource-env-type 元素(指定 型的完全限定的 ),如下所示:

    jms/StockQueue
    javax.jms.Queue

3. env-entry

    env -entry 元素声明 Web 用的 。它由一个可 description 元素、一个 env-entry-name 元素(一个相 java: comp/env JNDI 名)、一个 env-entry-value 元素( 项值 )以及一个 env-entry-type 元素( java.lang 程序包中一个 型的完全限定 名, java.lang.Boolean java.lang.String 等) 成。下面是一个例子:

    minAmout
    100.00
    minAmout

4. ejb-ref

    ejb -ref 元素声明 一个 EJB 的主目 用。它由一个可 description 元素、一个 ejb-ref-name 元素(相 java: comp/env EJB 用)、一个 ejb-ref-type 元素( bean 型, Entity Session )、一个 home 元素( bean 的主目 接口的完全限定名)、一个 remote 元素( bean 程接口的完全限定名)以及一个可 ejb-link 元素(当前 bean 接的另一个  bean 的名称) 成。

5. ejb-local-ref

    ejb-local-ref 元素声明一个 EJB 的本地主目 的引用。除了用 local-home 代替 home 外,此元素具有与 ejb-ref 元素相同的属性并以相同的方式使用

转载于:https://my.oschina.net/JiangTun/blog/300183

你可能感兴趣的:(java,web.xml,测试)