Tomcat中用web.xml控制Web应用详解

时间:2021-02-22 13:35:36
  1 定义头和根元素

部署描述符文件就像所有XML文件一样,必须以一个XML头开始。这个头声明可以使用的XML版本并给出文件的字符编码。中文JAVA技术网U)vF.|qK]
DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用的servlet规范的版本(如2.2或2.3)并指定管理此文件其余部分内容的语法的DTD(Document Type Definition,文档类型定义)。
B r5z4y:}2q723691所有部署描述符文件的顶层(根)元素为web-app。请注意,XML元素不像HTML,他们是大小写敏感的。因此,web-App和WEB-APP都是不合法的,web-app必须用小写。

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

XML元素不仅是大小写敏感的,而且它们还对出现在其他元素中的次序敏感。例如,XML头必须是文件中的第一项,DOCTYPE声明必须是第二项,而web-app元素必须是第三项。在web-app元素内,元素的次序也很重要。服务器不一定强制要求这种次序,但它们允许(实际上有些服务器就是这样做的)完全拒绝执行含有次序不正确的元素的Web应用。这表示使用非标准元素次序的web.xml文件是不可移植的。
l'^ C8tv@2cC&nT723691下面的列表给出了所有可直接出现在web-app元素内的合法元素所必需的次序。例如,此列表说明servlet元素必须出现在所有servlet-mapping元素之前。请注意,所有这些元素都是可选的。因此,可以省略掉某一元素,但不能把它放于不正确的位置。
e8fTm)MS723691l icon icon元素指出IDE和GUI工具用来表示Web应用的一个和两个图像文件的位置。
OY9Qh`:z\723691l display-name display-name元素提供GUI工具可能会用来标记这个特定的Web应用的一个名称。中文JAVA技术网#f%HU9Y8Be%x;?
l description description元素给出与此有关的说明性文本。中文JAVA技术网#tD^\!\e9g
l context-param context-param元素声明应用范围内的初始化参数。
&d.w:Y yqYu!X723691l filter 过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。
"y^)U3@Qz6f723691l filter-mapping 一旦命名了一个过滤器,就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。
0Aa"Ak%Za2QB:TbE723691l listener servlet API的版本2.3增加了对事件监听程序的支持,事件监听程序在建立、修改和删除会话或servlet环境时得到通知。Listener元素指出事件监听程序类。中文JAVA技术网-a5c(ry;S?
l servlet 在向servlet或JSP页面制定初始化参数或定制URL时,必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。中文JAVA技术网3~$Z+h(Fn(n2\]'eY
l servlet-mapping 服务器一般为servlet提供一个缺省的URL:
http://host/webAppPrefix/servlet/ServletName。但是,常常会更改这个URL,以便servlet可以访问初始化参数或更容易地处理相对URL。在更改缺省URL时,使用servlet-mapping元素。
ou,P#U:H723691l session-config 如果某个会话在一定时间内未被访问,服务器可以抛弃它以节省内存。可通过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对象的超时值,或者可利用session-config元素制定缺省超时值。中文JAVA技术网'zr?-D#TP+K*sl
l mime-mapping 如果Web应用具有想到特殊的文件,希望能保证给他们分配特定的MIME类型,则mime-mapping元素提供这种保证。
Sg Q;k:NH723691l welcom-file-list welcome-file-list元素指示服务器在收到引用一个目录名而不是文件名的URL时,使用哪个文件。
^r]/r\ J6q723691l error-page error-page元素使得在返回特定HTTP状态代码时,或者特定类型的异常被抛出时,能够制定将要显示的页面。中文JAVA技术网 s%M.NO!l7x)sew6H"Z
l taglib taglib元素对标记库描述符文件(Tag Libraryu Descriptor file)指定别名。此功能使你能够更改TLD文件的位置,而不用编辑使用这些文件的JSP页面。
$Y2z9N:S9|5mfdb723691l resource-env-ref resource-env-ref元素声明与资源相关的一个管理对象。
P!t:E O;n\723691l resource-ref resource-ref元素声明一个资源工厂使用的外部资源。中文JAVA技术网/k fN i:pI:a@
l security-constraint security-constraint元素制定应该保护的URL。它与login-config元素联合使用中文JAVA技术网"G;l5L%i0B
l login-config 用login-config元素来指定服务器应该怎样给试图访问受保护页面的用户授权。它与sercurity-constraint元素联合使用。中文JAVA技术网L1H o4ea^7n
l security-role security-role元素给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为容易。
-p)b dWZ1UVe0z723691l env-entry env-entry元素声明Web应用的环境项。
f^3ZJV1[!]723691l ejb-ref ejb-ref元素声明一个EJB的主目录的引用。
&} uw(dM ].Yq0Kk723691l ejb-local-ref ejb-local-ref元素声明一个EJB的本地主目录的应用。

3 分配名称和定制的UL

在web.xml中完成的一个最常见的任务是对servlet或JSP页面给出名称和定制的URL。用servlet元素分配名称,使用servlet-mapping元素将定制的URL与刚分配的名称相关联。中文JAVA技术网m fUL)C'@ Ym9]1lWP
3.1 分配名称中文JAVA技术网;T$u3L+?E+J+E
为了提供初始化参数,对servlet或JSP页面定义一个定制URL或分配一个安全角色,必须首先给servlet或JSP页面一个名称。可通过servlet元素分配一个名称。最常见的格式包括servlet-name和servlet-class子元素(在web-app元素内),如下所示:
Wz-mo%F$E.X X723691<servlet>
*GsE_s P"?X723691<servlet-name>Test</servlet-name>
P"y2PM%d Ny723691<servlet-class>moreservlets.TestServlet</servlet-class>
*o _ ZI}fK723691</servlet>

这表示位于WEB-INF/classes/moreservlets/TestServlet的servlet已经得到了注册名Test。给servlet一个名称具有两个主要的含义。首先,初始化参数、定制的URL模式以及其他定制通过此注册名而不是类名引用此servlet。其次,可在URL而不是类名中使用此名称。因此,利用刚才给出的定义,URLhttp://host/webAppPrefix/servlet/Test 可用于http://host/webAppPrefix/servlet/moreservlets.TestServlet 的场所。
-f#w{]#fV,G723691请记住:XML元素不仅是大小写敏感的,而且定义它们的次序也很重要。例如,web-app元素内所有servlet元素必须位于所有servlet-mapping元素(下一小节介绍)之前,而且还要位于5.6节和5.11节讨论的与过滤器或文档相关的元素(如果有的话)之前。类似地,servlet的servlet-name子元素也必须出现在servlet-class之前。5.2节"部署描述符文件内的元素次序"将详细介绍这种必需的次序。中文JAVA技术网)g^4_;D'wN*}
例如,程序清单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
+[PI6A$Wx(K723691package moreservlets;

import java.io.*;中文JAVA技术网 f U"G8{o.h9SK re
import javax.servlet.*;
I6g%jD` b+x723691import javax.servlet.http.*;

/** Simple servlet used to illustrate servlet naming中文JAVA技术网HQ:s+?'|e&K i1e
* and custom URLs.
(aWiH9^B723691* <P>中文JAVA技术网%Ogk FA+V4r
* Taken from More Servlets and JavaServer Pages
uV@)G,S1cb723691* from Prentice Hall and Sun Microsystems Press,
Tp)N&w!d#W723691*
http://www.moreservlets.com/.
3B1t8{/[#}7^9?c723691* &copy; 2002 Marty Hall; may be freely used or adapted.中文JAVA技术网6AJj)j3Rw$B+r
*/

public class TestServlet extends HttpServlet {
LO8Vs8P G.Rr723691public void doGet(HttpServletRequest request,
x&rye&D*sA-o f$P723691HttpServletResponse response)
z9d8A ^de723691throws ServletException, IOException {
6?0v,b9m/UK%Ue$tz G723691response.setContentType("text/html");
E o1^R R'c!l,KR723691PrintWriter ut = response.getWriter();中文JAVA技术网1Me'hg p ?Zaf
String uri = request.getRequestURI();中文JAVA技术网v}pq5\
out.println(ServletUtilities.headWithTitle("Test Servlet") +
N*az8\#y723691"<BODY BGCOLOR=\"#FDF5E6\">\n" +
P\t*S!Fj"D0j723691"<H2>URI: " + uri + "</H2>\n" +
^n`0G*S^ msK5I723691"</BODY></HTML>");中文JAVA技术网.L n,TT#wK)@{
}
$?q}^7G723691}


"mE$l[ }"]1p Y723691程序清单5-2 web.xml(说明servlet名称的摘录)
vM7?0`9|GWe#u5_T+J723691<?xml version="1.0" encoding="ISO-8859-1"?>
6Lk'U+_"fat[E723691<!DOCTYPE web-app中文JAVA技术网Aw a P8L O%em
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"中文JAVA技术网_m$yz2zd
"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>中文JAVA技术网,DpYk@
<!-- … -->中文JAVA技术网d6Na@%h[q3f-{
<servlet>中文JAVA技术网 v#EF V4};X8V
<servlet-name>Test</servlet-name>
G"cE Aq6Ff723691<servlet-class>moreservlets.TestServlet</servlet-class>中文JAVA技术网)Bk `+r:V!ldd#M V
</servlet>
V?6G(_7v$^B5^;lz723691<!-- … -->中文JAVA技术网Ym4Xs?0H%]'vR
</web-app>

3.2 定义定制的URL中文JAVA技术网6M;u3P0k2SUcF#?%_
大多数服务器具有一个缺省的serlvet URL:中文JAVA技术网*v SQYu*j+s
http://host/webAppPrefix/servlet/packageName.ServletName。虽然在开发中使用这个URL很方便,但是我们常常会希望另一个URL用于部署。例如,可能会需要一个出现在Web应用顶层的URL(如,http://host/webAppPrefix/Anyname),并且在此URL中没有servlet项。位于顶层的URL简化了相对URL的使用。此外,对许多开发人员来说,顶层URL看上去比更长更麻烦的缺省URL更简短。中文JAVA技术网y"_&^/{j
事实上,有时需要使用定制的URL。比如,你可能想关闭缺省URL映射,以便更好地强制实施安全限制或防止用户意外地访问无初始化参数的servlet。如果你禁止了缺省的URL,那么你怎样访问servlet呢?这时只有使用定制的URL了。中文JAVA技术网.J9th_o*DcH E7O
为了分配一个定制的URL,可使用servlet-mapping元素及其servlet-name和url-pattern子元素。Servlet-name元素提供了一个任意名称,可利用此名称引用相应的servlet;url-pattern描述了相对于Web应用的根目录的URL。url-pattern元素的值必须以斜杠(/)起始。
NF#G!mXy@X723691下面给出一个简单的web.xml摘录,它允许使用URL
http://host/webAppPrefix/UrlTest而不是http://host/webAppPrefix/servlet/Test
hX9b6bp[Lu723691
http://host/webAppPrefix/servlet/moreservlets.TestServlet。请注意,仍然需要XML头、DOCTYPE声明以及web-app封闭元素。此外,可回忆一下,XML元素出现地次序不是随意的。特别是,需要把所有servlet元素放在所有servlet-mapping元素之前。
nDu-f_e'M723691<servlet>
X,im9C1x:R723691<servlet-name>Test</servlet-name>
ER(og0w ^@723691<servlet-class>moreservlets.TestServlet</servlet-class>中文JAVA技术网 aY4FV I0e,~9E] H#I#y#Z
</servlet>中文JAVA技术网@HF/h6D Bt#O
<!-- ... -->中文JAVA技术网$wIfW"`w8G9q
<servlet-mapping>中文JAVA技术网(k jYqYoz
<servlet-name>Test</servlet-name>中文JAVA技术网l-v G0Mx;Kx]}PAMK!mB
<url-pattern>/UrlTest</url-pattern>
$r._z6o"[)^M723691</servlet-mapping>
vSC ~#f[%j2Oe J723691URL模式还可以包含通配符。例如,下面的小程序指示服务器发送所有以Web应用的URL前缀开始,以..asp结束的请求到名为BashMS的servlet。
W;{O"V8C4L2[723691<servlet>
`Q d VG!K1WU[D723691<servlet-name>BashMS</servlet-name>中文JAVA技术网 O\SV|'p
<servlet-class>msUtils.ASPTranslator</servlet-class>中文JAVA技术网){J iIi7TW YY"O
</servlet>
+V K#s,}VS C)K7x723691<!-- ... -->中文JAVA技术网,X c b BA,c.o?Uh
<servlet-mapping>中文JAVA技术网vP9Jy3R4op'q
<servlet-name>BashMS</servlet-name>中文JAVA技术网AlJ,Lqr+~
<url-pattern>/*.asp</url-pattern>
W0G SeP+Q-c\)r X723691</servlet-mapping>
oeb ^W7236913.3 命名JSP页面中文JAVA技术网@ Dz7Fk7VM0n v
因为JSP页面要转换成sevlet,自然希望就像命名servlet一样命名JSP页面。毕竟,JSP页面可能会从初始化参数、安全设置或定制的URL中受益,正如普通的serlvet那样。虽然JSP页面的后台实际上是servlet这句话是正确的,但存在一个关键的猜疑:即,你不知道JSP页面的实际类名(因为系统自己挑选这个名字)。因此,为了命名JSP页面,可将jsp-file元素替换为servlet-calss元素,如下所示:
"Z2f)Q+\5Dff W%PB723691<servlet>
GE a$O'jp723691<servlet-name>Test</servlet-name>
yM4TM"no7t-h/h7jV!@723691<jsp-file>/TestPage.jsp</jsp-file>中文JAVA技术网1Pms$ZX$n4O`
</servlet>
-`m*XE1LY7Ad tS723691命名JSP页面的原因与命名servlet的原因完全相同:即为了提供一个与定制设置(如,初始化参数和安全设置)一起使用的名称,并且,以便能更改激活JSP页面的URL(比方说,以便多个URL通过相同页面得以处理,或者从URL中去掉.jsp扩展名)。但是,在设置初始化参数时,应该注意,JSP页面是利用jspInit方法,而不是init方法读取初始化参数的。中文JAVA技术网&BvHr9Q#Wk7V
例如,程序清单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
)zCP}6ul-Z3W9unlx723691<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">中文JAVA技术网%P*J?gR
<HTML>中文JAVA技术网-_xk![} m$o7\8]
<HEAD>中文JAVA技术网Q3Z*}0ML"jw7~
<TITLE>中文JAVA技术网@'j&]*i+` dX)c
JSP Test Page中文JAVA技术网a ] {']Q/Yc!D
</TITLE>中文JAVA技术网8G4o G|0{,poj
</HEAD>
1XT0K:TVAC723691<BODY BGCOLOR="#FDF5E6">中文JAVA技术网]:C~ n.k3l[I
<H2>URI: <%= request.getRequestURI() %></H2>
Fe v2HE v6sXf723691</BODY>中文JAVA技术网D!h-O"I'ReBg
</HTML>


X@-E"K"V:A5Uu/@0V723691程序清单5-4 web.xml(说明JSP页命名的摘录)
^vF zH`723691<?xml version="1.0" encoding="ISO-8859-1"?>中文JAVA技术网 Y3p3J(Ex t2l
<!DOCTYPE web-app
C2ay{8?He723691PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"中文JAVA技术网o0@4B-s*\
"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
i P){]*CZ"u.p&Z723691<!-- ... -->
^jqW Rc723691<servlet>
^?*b*Lt0@2},r723691<servlet-name>PageName</servlet-name>
+F-LM:aG_pfI}723691<jsp-file>/TestPage.jsp</jsp-file>
4z&u2{[8NAh u723691</servlet>
1C `'b Cefh5I723691<!-- ... -->
j6[C0S\ j9N(i~723691<servlet-mapping>中文JAVA技术网7r Q9L;P;O:S/P
<servlet-name> PageName </servlet-name>中文JAVA技术网9Sr1Fd?} z7k|s Z@
<url-pattern>/UrlTest2/*</url-pattern>中文JAVA技术网![["W(@L["El y"z$K t
</servlet-mapping>
'{^8t[x3P}s723691<!-- ... -->
\o{,^"|Qw6C$O723691</web-app>


`1bq4n T0u1j7236914 禁止激活器servlet

对servlet或JSP页面建立定制URL的一个原因是,这样做可以注册从init(servlet)或jspInit(JSP页面)方法中读取得初始化参数。但是,初始化参数只在是利用定制URL模式或注册名访问servlet或JSP页面时可以使用,用缺省URLhttp://host/webAppPrefix/servlet/ServletName 访问时不能使用。因此,你可能会希望关闭缺省URL,这样就不会有人意外地调用初始化servlet了。这个过程有时称为禁止激活器servlet,因为多数服务器具有一个用缺省的servlet URL注册的标准servlet,并激活缺省的URL应用的实际servlet。中文JAVA技术网 i ~ KxM
有两种禁止此缺省URL的主要方法:中文JAVA技术网w9f2KfZE/s|(B
l 在每个Web应用中重新映射/servlet/模式。中文JAVA技术网 ji-hi!@qOyex
l 全局关闭激活器servlet。中文JAVA技术网/Nd:KFU._
重要的是应该注意到,虽然重新映射每个Web应用中的/servlet/模式比彻底禁止激活servlet所做的工作更多,但重新映射可以用一种完全可移植的方式来完成。相反,全局禁止激活器servlet完全是针对具体机器的,事实上有的服务器(如ServletExec)没有这样的选择。下面的讨论对每个Web应用重新映射/servlet/ URL模式的策略。后面提供在Tomcat中全局禁止激活器servlet的详细内容。
.py9HW$[b\Z7236914.1 重新映射/servlet/URL模式中文JAVA技术网 N5}$M e-S _7fUi
在一个特定的Web应用中禁止以
http://host/webAppPrefix/servlet/ 开始的URL的处理非常简单。所需做的事情就是建立一个错误消息servlet,并使用前一节讨论的url-pattern元素将所有匹配请求转向该servlet。只要简单地使用:中文JAVA技术网 D L ~Etg2V+U#Y7M3T
<url-pattern>/servlet/*</url-pattern>中文JAVA技术网2T6X2|VA;A4r0Bvh
作为servlet-mapping元素中的模式即可。
#gb"Z*oz%^`723691例如,程序清单5-5给出了将SorryServlet servlet(程序清单5-6)与所有以
http://host/webAppPrefix/servlet/ 开头的URL相关联的部署描述符文件的一部分。

程序清单5-5 web.xml(说明JSP页命名的摘录)
X'M!y G1I,M fT723691<?xml version="1.0" encoding="ISO-8859-1"?>中文JAVA技术网 d@|`6^R
<!DOCTYPE web-app中文JAVA技术网P7p VQP%b'?s?'M
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"中文JAVA技术网 @I+oi/Y%m]
"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>中文JAVA技术网[.`.M#L y-N)ba
<!-- ... -->
5x X_%xfi723691<servlet>
[xbDG,ec723691<servlet-name>Sorry</servlet-name>
+`)_*t;V$U&T*nH723691<servlet-class>moreservlets.SorryServlet</servlet-class>
Sie{.C9x723691</servlet>中文JAVA技术网b"`CJQ,Z
<!-- ... -->
bz?e+jT,j,SYPb723691<servlet-mapping>
JCy S9m/D\723691<servlet-name> Sorry </servlet-name>
:Y.j@.@g@_8y p723691<url-pattern>/servlet/*</url-pattern>
1s pdZZ;lU u723691</servlet-mapping>中文JAVA技术网:j:fyT-T#a"b#@
<!-- ... -->中文JAVA技术网4h(d(b]:G;U-qJ
</web-app>

中文JAVA技术网P RG*\ZnY H
程序清单5-6 SorryServlet.java中文JAVA技术网X$wIT t0e
package moreservlets;

import java.io.*;中文JAVA技术网u(xDW#rrL
import javax.servlet.*;
D9oyj;F723691import javax.servlet.http.*;

/** Simple servlet used to give error messages to中文JAVA技术网%~4r;Ld/c6BM/s*[9G
* users who try to access default servlet URLs
8{dtS4o$F1f7@2y$I.{;o723691* (i.e.,
http://host/webAppPrefix/servlet/ServletName)
VUg,iTOGz.f2Q723691* in Web applications that have disabled this中文JAVA技术网^w4ny7Uw
* behavior.
#w9@,j@%|[k723691* <P>中文JAVA技术网$to W"V&MD O
* Taken from More Servlets and JavaServer Pages中文JAVA技术网H5L%XJu{G4X"M@
* from Prentice Hall and Sun Microsystems Press,
Ib_4A"G1zK0BR z8A7S723691*
http://www.moreservlets.com/.中文JAVA技术网4Noyc8T']1o
* &copy; 2002 Marty Hall; may be freely used or adapted.
wOJNv vsf723691*/

public class SorryServlet extends HttpServlet {中文JAVA技术网F+Lz)_${-v
public void doGet(HttpServletRequest request,
X fB5d V723691HttpServletResponse response)
U&m!i`Nd723691throws ServletException, IOException {
a;j$Z!a3dv`723691response.setContentType("text/html");中文JAVA技术网4bCM%C^"Z#XxK
PrintWriter ut = response.getWriter();中文JAVA技术网}PbrmC B
String title = "Invoker Servlet Disabled.";
Im)w"zZ+_723691out.println(ServletUtilities.headWithTitle(title) +
9L4e|'HY(]723691"<BODY BGCOLOR=\"#FDF5E6\">\n" +
L+d+P \wP723691"<H2>" + title + "</H2>\n" +中文JAVA技术网 |%c+x^p,q2~i(IU
"Sorry, access to servlets by means of\n" +中文JAVA技术网 M)zA1o{Zi4]'u
"URLs that begin with\n" +中文JAVA技术网X)JK6e(g
"
http://host/webAppPrefix/servlet/\n" +
U2CQ k*nU#TY5I723691"has been disabled.\n" +
qT]+~4^-U}+T1i723691"</BODY></HTML>");
.f Y+Ma"QW{V9i8G723691}

public void doPost(HttpServletRequest request,
4]7D-I0j9w-j(omk723691HttpServletResponse response)中文JAVA技术网jA!U qt8xj
throws ServletException, IOException {中文JAVA技术网M P;Lh| Z-b2G
doGet(request, response);
.WC_} G.|Ww)m723691}中文JAVA技术网 wA+tPD_)`;c
}

中文JAVA技术网+o5\(Md6b;~/X'_
4.2 全局禁止激活器:Tomcat
*}{2? LquU9KC723691Tomcat 4中用来关闭缺省URL的方法与Tomcat 3中所用的很不相同。下面介绍这两种方法:中文JAVA技术网I(_ a,H:`_)m6|
1.禁止激活器: Tomcat 4中文JAVA技术网)\-]Js(Q
Tomcat 4用与前面相同的方法关闭激活器servlet,即利用web.xml中的url-mapping元素进行关闭。不同之处在于Tomcat使用了放在install_dir/conf中的一个服务器专用的全局web.xml文件,而前面使用的是存放在每个Web应用的WEB-INF目录中的标准web.xml文件。中文JAVA技术网'cQqL(h!E;C.B
因此,为了在Tomcat 4中关闭激活器servlet,只需在install_dir/conf/web.xml中简单地注释出/servlet/* URL映射项即可,如下所示:
!v"[U Tn$v}%X p723691<!-- 中文JAVA技术网's%lV*VD6j~
<servlet-mapping>中文JAVA技术网_ i)Lw E o;c C(h
<servlet-name>invoker</servlet-name>中文JAVA技术网 K] W6HP.F+eB0in
<url-pattern>/servlet/*</url-pattern>中文JAVA技术网K(w^6vbm g
</servlet-mapping>中文JAVA技术网Q'n4F5`z,K f
-->
\6x1j |8s0W(B723691再次提醒,应该注意这个项是位于存放在install_dir/conf的Tomcat专用的web.xml文件中的,此文件不是存放在每个Web应用的WEB-INF目录中的标准web.xml。
to_5eBl7236912.禁止激活器:Tomcat3中文JAVA技术网/LCs4T+xFp
在Apache Tomcat的版本3中,通过在install_dir/conf/server.xml中注释出InvokerInterceptor项全局禁止缺省servlet URL。例如,下面是禁止使用缺省servlet URL的server.xml文件的一部分。中文JAVA技术网9f%N?.J d
<!-- 中文JAVA技术网6c/z.zn,R3I3g8B!`p
<RequsetInterceptor
*|1kY,\R+d723691className="org.apache.tomcat.request.InvokerInterceptor"
XR\3Y(eM723691debug="0" prefix="/servlet/" />中文JAVA技术网 NU3J9o1bQ
-->

5 初始化和预装载servlet与JSP页面

这里讨论控制servlet和JSP页面的启动行为的方法。特别是,说明了怎样分配初始化参数以及怎样更改服务器生存期中装载servlet和JSP页面的时刻。中文JAVA技术网Pb&l2S#?JRne
5.1 分配servlet初始化参数
c(\vU ]Pyh@723691利用init-param元素向servlet提供初始化参数,init-param元素具有param-name和param-value子元素。例如,在下面的例子中,如果initServlet servlet是利用它的注册名(InitTest)访问的,它将能够从其方法中调用getServletConfig().getInitParameter("param1")获得"Value 1",调用getServletConfig().getInitParameter("param2")获得"2"。
Gr/eUT } at["t723691<servlet>
[-A/X6K9yl J723691<servlet-name>InitTest</servlet-name>中文JAVA技术网&ta:e8l(~)qM I-d
<servlet-class>moreservlets.InitServlet</servlet-class>
UUo6y!g723691<init-param>中文JAVA技术网t5`m\d'V
<param-name>param1</param-name>
&mi N:X4v723691<param-value>value1</param-value>中文JAVA技术网6x,M'`8[ E*q
</init-param>
*d&D4L9rI4fbyk723691<init-param>
^Wr0tltf9f8D[723691<param-name>param2</param-name>
t9pJ u"^0Yv723691<param-value>2</param-value>中文JAVA技术网gWO1VRi(v
</init-param>
[*o!fX;Rx%^ o723691</servlet>
:Zc0c#UR wd723691在涉及初始化参数时,有几点需要注意:中文JAVA技术网)_%H9^2m*k
l 返回值。GetInitParameter的返回值总是一个String。因此,在前一个例子中,可对param2使用Integer.parseInt获得一个int。中文JAVA技术网4t~U;j9[
l JSP中的初始化。JSP页面使用jspInit而不是init。JSP页面还需要使用jsp-file元素代替servlet-class。中文JAVA技术网&G(|b:az|
l 缺省URL。初始化参数只在通过它们的注册名或与它们注册名相关的定制URL模式访问Servlet时可以使用。因此,在这个例子中,param1和param2初始化参数将能够在使用URL
http://host/webAppPrefix/servlet/InitTest 时可用,但在使用URLhttp://host/webAppPrefix/servlet/myPackage.InitServlet 时不能使用。中文JAVA技术网Wyt@;?4rk6H|
例如,程序清单5-7给出一个名为InitServlet的简单servlet,它使用init方法设置firstName和emailAddress字段。程序清单5-8给出分配名称InitTest给servlet的web.xml文件。中文JAVA技术网-V3dN|v\[!{
程序清单5-7 InitServlet.java中文JAVA技术网:zd%GC#jn w$N r2Qi
package moreservlets;

import java.io.*;
;|@(T`w(\[bj!i"T723691import javax.servlet.*;
\| h)@c723691import javax.servlet.http.*;

/** Simple servlet used to illustrate servlet中文JAVA技术网+uZBr MV;I
* initialization parameters.
q"`,R$Fb723691* <P>中文JAVA技术网`,F;c.b5R8`!pM
* Taken from More Servlets and JavaServer Pages
r8pO @2ot6g(t c c723691* from Prentice Hall and Sun Microsystems Press,
k"T IMo)nnz g723691*
http://www.moreservlets.com/.
n\Hz4N9a(H7dPq723691* &copy; 2002 Marty Hall; may be freely used or adapted.
f{a3Q(RT)LE723691*/

public class InitServlet extends HttpServlet {中文JAVA技术网f^*J0M5Mppm
private String firstName, emailAddress;

public void init() {
&d3Xy#w[ Y%t#\D0X `?723691ServletConfig config = getServletConfig();中文JAVA技术网v&OMy i:i
firstName = config.getInitParameter("firstName");中文JAVA技术网h'^1E+nR^ X
emailAddress = config.getInitParameter("emailAddress");中文JAVA技术网8[ShQ b*AE!@ o
}

public void doGet(HttpServletRequest request,
M3I%T#l;dM6^723691HttpServletResponse response)
8Zu$\l{$m%l723691throws ServletException, IOException {
Mgy2t3U_H723691response.setContentType("text/html");
1l%B)Pw9sU e&b7c723691PrintWriter ut = response.getWriter();中文JAVA技术网6`k-`:lx }
String uri = request.getRequestURI();
+hj"O"d:Zk@Fv"y6@723691out.println(ServletUtilities.headWithTitle("Init Servlet") +中文JAVA技术网 HRrq7\3B
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
n C~4EMJ723691"<H2>Init Parameters:</H2>\n" +
fUU+vO0x5F723691"<UL>\n" +
V9b\VSG-p"@#j723691"<LI>First name: " + firstName + "\n" +
*c8U0E/M*U qQ-^723691"<LI>Email address: " + emailAddress + "\n" +中文JAVA技术网 RR)PZ.u j+_;AF
"</UL>\n" +
0k3Xs@ \X n!a8|B723691"</BODY></HTML>");
#| E3C VT'g6J723691}
m%p5hH$T{723691}


^HPw!I]|723691程序清单5-8 web.xml(说明初始化参数的摘录)中文JAVA技术网-l-w@ BM'}
<?xml version="1.0" encoding="ISO-8859-1"?>中文JAVA技术网'ut/x+t!X7QrP
<!DOCTYPE web-app中文JAVA技术网$M1f/] A)?6K+lCvi-o.o(a
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
@T7Fe` lRH723691"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
l6BI_\SR723691<!-- ... -->中文JAVA技术网~Gk4m@J
<servlet>中文JAVA技术网1{i0Ycy-],n |P
<servlet-name>InitTest</servlet-name>
#H"|W!y&q723691<servlet-class>moreservlets.InitServlet</servlet-class>中文JAVA技术网 s ?b|W.mQ2A0f!J
<init-param>
(g~[rok[723691<param-name>firstName</param-name>中文JAVA技术网Ej1L_y/SIY
<param-value>Larry</param-value>中文JAVA技术网.lu&QqJo5i#L1e
</init-param>中文JAVA技术网.?hH@9N$Iy/k K5Q
<init-param>
!~mA]/l\^723691<param-name>emailAddress</param-name>
)o+c;@oY A7m'C723691<param-value>Ellison@Microsoft.com</param-value>
rs(}#@2g723691</init-param>
"{ _ LM)O8z)S723691</servlet>中文JAVA技术网Zd P;yk
<!-- ... -->
qS2j_,jc])WJ723691</web-app>

5.2 分配JSP初始化参数中文JAVA技术网1|UWL~U/Wo4Y
给JSP页面提供初始化参数在三个方面不同于给servlet提供初始化参数。中文JAVA技术网;Gt isF_1Hi
1)使用jsp-file而不是servlet-class。因此,WEB-INF/web.xml文件的servlet元素如下所示:
/`u5b)i mf723691<servlet>
AQ:BkS,n,m723691<servlet-name>PageName</servlet-name>
2k){y0@F W(R723691<jsp-file>/RealPage.jsp</jsp-file>中文JAVA技术网vp'dk/F+G7V!|yGe$`
<init-param>
J0[RoR$x#_?723691<param-name>...</param-name>中文JAVA技术网:aRv(g+O q
<param-value>...</param-value>中文JAVA技术网C/~_7c$b)j"^k
</init-param>中文JAVA技术网w$SFo;D
...
C$z Km}"_)R?723691</servlet>中文JAVA技术网c#yj Z ID
2)几乎总是分配一个明确的URL模式。对servlet,一般相应地使用以
http://host/webAppPrefix/servlet/ 开始的缺省URL。只需记住,使用注册名而不是原名称即可。这对于JSP页面在技术上也是合法的。例如,在上面给出的例子中,可用URLhttp://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定义:中文JAVA技术网4f y.Jgv?V
<servlet-mapping>
(nR^G4IM~723691<servlet-name>PageName</servlet-name>中文JAVA技术网%T#g|,Tk d
<url-pattern>/RealPage.jsp</url-pattern>中文JAVA技术网 e5xt h%w7[5I*?/M
</servlet-mapping>中文JAVA技术网%bcp-W9RW
3)JSP页使用jspInit而不是init。自动从JSP页面建立的servlet或许已经使用了inti方法。因此,使用JSP声明提供一个init方法是不合法的,必须制定jspInit方法。
!Y:Oy zhECm723691为了说明初始化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
o+Q!b.}'t!^/l%R3pD;O723691<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">中文JAVA技术网$|9G+uzj%_4l
<HTML>
1O8Jc,Bs723691<HEAD><TITLE>JSP Init Test</TITLE></HEAD>中文JAVA技术网+[;^ X/l9S
<BODY BGCOLOR="#FDF5E6">
G;\!^+X`-g N [_,_E723691<H2>Init Parameters:</H2>中文JAVA技术网#Ovr@h&l
<UL>中文JAVA技术网3M;P6JT,X8N(o
<LI>First name: <%= firstName %>中文JAVA技术网 _:jX;P'a.sI
<LI>Email address: <%= emailAddress %>
Z7h/~5x _c a,I723691</UL>中文JAVA技术网w7p!v'A t*e gz$|Bt
</BODY></HTML>中文JAVA技术网'e| F*]#Y.|
<%!中文JAVA技术网9FU$Bb f(m"C?%C%CWC
private String firstName, emailAddress;

public void jspInit() {中文JAVA技术网9qa8l |_Y_
ServletConfig config = getServletConfig();
z6bK$|n:H0`;S723691firstName = config.getInitParameter("firstName");中文JAVA技术网#]k n.Bn@ z:dN
emailAddress = config.getInitParameter("emailAddress");中文JAVA技术网F:zO[4C\6k9`
}
}s6L^;}.F|723691%>

中文JAVA技术网A h@1cAzx
程序清单5-10 web.xml(说明JSP页面的init参数的摘录)中文JAVA技术网q&i'G^?
<?xml version="1.0" encoding="ISO-8859-1"?>
f%O%e!g{3`qM723691<!DOCTYPE web-app中文JAVA技术网0c,I?q9I0D9|5r
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
C[/Co#m,l723691"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>中文JAVA技术网8@7~[ i3|:I
<!-- ... -->中文JAVA技术网4T$WO@xMh
<servlet>中文JAVA技术网s f mLZ.rq
<servlet-name>InitPage</servlet-name>
~&f!w'ox6B(@723691<jsp-file>/InitPage.jsp</jsp-file>
qc;J#D0y A723691<init-param>中文JAVA技术网.?+s)Y }[y`v
<param-name>firstName</param-name>
#G*D R5n9m`{#?723691<param-value>Bill</param-value>
^)u|$}5{4[^#f723691</init-param>
S0o+ES"J.P ug m723691<init-param>中文JAVA技术网U${(A bY6ja
<param-name>emailAddress</param-name>
zg9h_,L o4i1`723691<param-value>gates@oracle.com</param-value>中文JAVA技术网:}P&eM`U}J
</init-param>
f;g&DXM3M723691</servlet>中文JAVA技术网:E tA/ao*c]|%r
<!-- ... -->
H1W*U&\E2@723691<servlet-mapping>中文JAVA技术网U/xkw^l
<servlet-name> InitPage</servlet-name>中文JAVA技术网3BX8tL] G$R/TA
<url-pattern>/InitPage.jsp</url-pattern>
ksMH.KY2V723691</servlet-mapping>
` w&nz-X b {723691<!-- ... -->
1k%Q7rA[a723691</web-app>


km;G:^q-]7236915.3 提供应用范围内的初始化参数中文JAVA技术网+~&B9xW$K$|;B
一般,对单个地servlet或JSP页面分配初始化参数。指定的servlet或JSP页面利用ServletConfig的getInitParameter方法读取这些参数。但是,在某些情形下,希望提供可由任意servlet或JSP页面借助ServletContext的getInitParameter方法读取的系统范围内的初始化参数。中文JAVA技术网]5m/i4l5q a
可利用context-param元素声明这些系统范围内的初始化值。context-param元素应该包含param-name、param-value以及可选的description子元素,如下所示:中文JAVA技术网s].t4g&]x8X Ds
<context-param>
'| H8`G*e~d t723691<param-name>support-email</param-name>中文JAVA技术网jT&n*B#c"~)sL
<param-value>blackhole@mycompany.com</param-value>中文JAVA技术网sC!I*L]_^2M
</context-param>
fI1nE.C#u723691可回忆一下,为了保证可移植性,web.xml内的元素必须以正确的次序声明。但这里应该注意,context-param元素必须出现任意与文档有关的元素(icon、display-name或description)之后及filter、filter-mapping、listener或servlet元素之前。
Q+n qZ;~7Y%t7236915.4 在服务器启动时装载servlet中文JAVA技术网 E1u I`EL!I
假如servlet或JSP页面有一个要花很长时间执行的init(servlet)或jspInit(JSP)方法。例如,假如init或jspInit方法从某个数据库或ResourceBundle查找产量。这种情况下,在第一个客户机请求时装载servlet的缺省行为将对第一个客户机产生较长时间的延迟。因此,可利用servlet的load-on-startup元素规定服务器在第一次启动时装载servlet。下面是一个例子。
)])d5N+dX9H723691<servlet>中文JAVA技术网el(V4|;W
<servlet-name> … </servlet-name>中文JAVA技术网Qg%{p*RX{-IV(O
<servlet-class> … </servlet-class> <!-- Or jsp-file -->中文JAVA技术网xVa [j Z-i
<load-on-startup/>
CE'M)C8k U}8_ I9z723691</servlet>
mVD*r'?J723691可以为此元素体提供一个整数而不是使用一个空的load-on-startup。想法是服务器应该在装载较大数目的servlet或JSP页面之前装载较少数目的servlet或JSP页面。例如,下面的servlet项(放置在Web应用的WEB-INF目录下的web.xml文件中的web-app元素内)将指示服务器首先装载和初始化SearchServlet,然后装载和初始化由位于Web应用的result目录中的index.jsp文件产生的servlet。中文JAVA技术网RN!O:Z;Ah)rj^h
<servlet>
mb\"H9dJ4tT723691<servlet-name>Search</servlet-name>中文JAVA技术网 {(iS"SB/u3R g+@0\
<servlet-class>myPackage.SearchServlet</servlet-class> <!-- Or jsp-file -->中文JAVA技术网4a$y\D,k-sP"q$\
<load-on-startup>1</load-on-startup>中文JAVA技术网E L2P#JT4h
</servlet>
Nv }.^ ld @E5lF9m723691<servlet>
3j"WTY&J:a723691<servlet-name>Results</servlet-name>中文JAVA技术网Xv(LX%fs
<servlet-class>/results/index.jsp</servlet-class> <!-- Or jsp-file -->中文JAVA技术网 k"x,j^ V
<load-on-startup>2</load-on-startup>
H k ]@WY/u'a D723691</servlet>

6 声明过滤器

servlet版本2.3引入了过滤器的概念。虽然所有支持servlet API版本2.3的服务器都支持过滤器,但为了使用与过滤器有关的元素,必须在web.xml中使用版本2.3的DTD。中文JAVA技术网Gzn(tjJ4RQ
过滤器可截取和修改进入一个servlet或JSP页面的请求或从一个servlet或JSP页面发出的相应。在执行一个servlet或JSP页面之前,必须执行第一个相关的过滤器的doFilter方法。在该过滤器对其FilterChain对象调用doFilter时,执行链中的下一个过滤器。如果没有其他过滤器,servlet或JSP页面被执行。过滤器具有对到来的ServletRequest对象的全部访问权,因此,它们可以查看客户机名、查找到来的cookie等。为了访问servlet或JSP页面的输出,过滤器可将响应对象包裹在一个替身对象(stand-in object)中,比方说把输出累加到一个缓冲区。在调用FilterChain对象的doFilter方法之后,过滤器可检查缓冲区,如有必要,就对它进行修改,然后传送到客户机。中文JAVA技术网F3w9J {/|%h k ?X
例如,程序清单5-11帝国难以了一个简单的过滤器,只要访问相关的servlet或JSP页面,它就截取请求并在标准输出上打印一个报告(开发过程中在桌面系统上运行时,大多数服务器都可以使用这个过滤器)。

程序清单5-11 ReportFilter.java中文JAVA技术网$O}4|&Diw@ r
package moreservlets;

import java.io.*;
\0@q;p$~7M-XBi723691import javax.servlet.*;
E-AW{x%w%CD723691import javax.servlet.http.*;
;X#A!V+_#_ z H3_723691import java.util.*;

/** Simple filter that prints a report on the standard output
I:_zP/x kI:}6YU723691* whenever the associated servlet or JSP page is accessed.
&`JlM%Z^"B723691* <P>
`/Ix dMxh&wr723691* Taken from More Servlets and JavaServer Pages中文JAVA技术网5uF[]*v#U/e#Q#{(l
* from Prentice Hall and Sun Microsystems Press,中文JAVA技术网 G0{u sa
*
http://www.moreservlets.com/.中文JAVA技术网 Xb,AME,S!`F'S
* &copy; 2002 Marty Hall; may be freely used or adapted.
r#s8u*?"G1EW723691*/

public class ReportFilter implements Filter {
fdx*K3^2m`9~s723691public void doFilter(ServletRequest request,中文JAVA技术网(l4? }:E)c
ServletResponse response,中文JAVA技术网O9C8WRN/gJ`
FilterChain chain)中文JAVA技术网I,_*P+F9U
throws ServletException, IOException {中文JAVA技术网 \v h!TW
HttpServletRequest req = (HttpServletRequest)request;中文JAVA技术网#B5P:R8VC(h;T#^
System.out.println(req.getRemoteHost() +中文JAVA技术网/G XS0U:[
" tried to access " +
*G&e.yG'q1|A723691req.getRequestURL() +
|$ED;n3dbWJ(~723691" on " + new Date() + ".");
ax6I_K*P xj723691chain.doFilter(request,response);中文JAVA技术网Gp7H(U.e|G^O
}

public void init(FilterConfig config)
nJ/Z uGcb723691throws ServletException {
)v%c@}8k"_9O723691}

public void destroy() {}中文JAVA技术网8WYl5KA&e'W.nA'g3K
}

一旦建立了一个过滤器,可以在web.xml中利用filter元素以及filter-name(任意名称)、file-class(完全限定的类名)和(可选的)init-params子元素声明它。请注意,元素在web.xml的web-app元素中出现的次序不是任意的;允许服务器(但不是必需的)强制所需的次序,并且实际中有些服务器也是这样做的。但这里要注意,所有filter元素必须出现在任意filter-mapping元素之前,filter-mapping元素又必须出现在所有servlet或servlet-mapping元素之前。
wXKnA4we723691例如,给定上述的ReportFilter类,可在web.xml中作出下面的filter声明。它把名称Reporter与实际的类ReportFilter(位于moreservlets程序包中)相关联。中文JAVA技术网9i.[tq:P r UF
<filter>
[NP i$QJ4Y723691<filter-name>Reporter</filter-name>中文JAVA技术网yw'_^%P
<filter-class>moresevlets.ReportFilter</filter-class>中文JAVA技术网 v8{Bq B7hlD
</filter>中文JAVA技术网 `tt8U ]%l~K
一旦命名了一个过滤器,可利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。关于此项工作有两种选择。
'{]8`Gl9Rj723691首先,可使用filter-name和servlet-name子元素把此过滤器与一个特定的servlet名(此servlet名必须稍后在相同的web.xml文件中使用servlet元素声明)关联。例如,下面的程序片断指示系统只要利用一个定制的URL访问名为SomeServletName的servlet或JSP页面,就运行名为Reporter的过滤器。中文JAVA技术网*T0o_)WM|*h
<filter-mapping>中文JAVA技术网v1o @zK-U+P#uCt
<filter-name>Reporter</filter-name>
a y![XPx5?Zv H8~723691<servlet-name>SomeServletName</servlet-name>中文JAVA技术网 [-YF'w,R@H#Z4{
</filter-mapping>中文JAVA技术网 FW#qL.[9X W
其次,可利用filter-name和url-pattern子元素将过滤器与一组servlet、JSP页面或静态内容相关联。例如,相面的程序片段指示系统只要访问Web应用中的任意URL,就运行名为Reporter的过滤器。中文JAVA技术网!~Q0y5b!n v"vk
<filter-mapping>中文JAVA技术网8{ P!xN2u$H
<filter-name>Reporter</filter-name>中文JAVA技术网*\v*G/Ml o
<url-pattern>/*</url-pattern>
2O6D c2f&P.A#B723691</filter-mapping>
4@2N8g ?#{vx3S723691例如,程序清单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项,可看到下面的标准输出形式的调试报告(换行是为了容易阅读)。中文JAVA技术网Uo$B[ l;kN
audit.irs.gov tried to access 中文JAVA技术网Y?c[UsCh
http://mycompany.com/deployDemo/UrlTest2/business/tax-plan.html
bB7h$i BQ"L723691on Tue Dec 25 13:12:29 EDT 2001.

程序清单5-12 Web.xml(说明filter用法的摘录)
Xdo~.Y&_723691<?xml version="1.0" encoding="ISO-8859-1"?>
0W4}f-P'^n R8EL723691<!DOCTYPE web-app中文JAVA技术网&gbA)I4Q
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
,Jg3Bm;Ad723691"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
6m(pM#m C5o3Ze$C723691<filter>中文JAVA技术网(e&qO\/M-By#Bz1w
<filter-name>Reporter</filter-name>
,ed2Fms'hTC723691<filter-class>moresevlets.ReportFilter</filter-class>中文JAVA技术网r2EfR$y!z-^
</filter>
%d ?XVv g!V1G\#V723691<!-- ... -->
iDZ.`\ m723691<filter-mapping>
5_{8s2e7OP3Gb@723691<filter-name>Reporter</filter-name>
;O&[.e"ax$YE i,lk723691<servlet-name>PageName</servlet-name>
'[}4@|CIdS:{ ~[723691</filter-mapping>中文JAVA技术网tChG6v] LvF9O!e_.t3X
<!-- ... -->
-S5oF B*q ?+o723691<servlet>中文JAVA技术网 TO^+X _.}2d(v1M
<servlet-name>PageName</servlet-name>中文JAVA技术网Wd%S;ny._s
<jsp-file>/RealPage.jsp</jsp-file>中文JAVA技术网#W2v"H4AZ fT2T3B
</servlet>中文JAVA技术网t%K+@x,?R-xz [:W
<!-- ... -->中文JAVA技术网1zG VhA&i
<servlet-mapping>
RN&CiZ723691<servlet-name> PageName </servlet-name>
[w.zUVv723691<url-pattern>/UrlTest2/*</url-pattern>
3VlAv.zt9F"vQF723691</servlet-mapping>
t`0v"\0\w723691<!-- ... -->
H"U!Mc6w723691</web-app>