首页 > 代码库 > 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
元素指出IDEGUI工具用来表示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元素把它与一个或多个servletJSP面相关联
l listener servlet API
的版本2.3增加了事件听程序的支持,事件听程序在建立、修改和除会servlet得到通知。Listener元素指出事件听程序
l servlet 
在向servletJSP面制定初始化参数或定制URL,必首先命名servletJSP面。Servlet元素就是用来完成此的。
l servlet-mapping 器一般servlet提供一个缺省的URLhttp://host/webAppPrefix/servlet/ServletName但是,常常会更改URL,以便servlet可以访问初始化参数或更容易地理相URL。在更改缺省URL,使用servlet-mapping元素。
l session-config 
如果某个会在一定时间内未被访问,服器可以抛弃它以省内存。可通使用HttpSessionsetMaxInactiveInterval方法明确个会话对象的超时值,或者可利用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中完成的一个最常的任servletJSP出名称和定制的URLservlet元素分配名称,使用servlet-mapping元素将定制的URL分配的名称相关联
3.1 
分配名称
了提供初始化参数,servletJSP面定一个定制URL或分配一个安全角色,必首先servletJSP面一个名称。可通 servlet元素分配一个名称。最常的格式包括servlet-nameservlet-class子元素(在web-app元素内),如下所示:
<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>moreservlets.TestServlet</servlet-class>
</servlet> 
表示位于WEB-INF/classes/moreservlets/TestServletservlet得到了注册名Test servlet一个名称具有两个主要的含。首先,初始化参数、定制的URL模式以及其他定制通此注册名而不是名引用此servlet。其次,可在 URL而不是名中使用此名称。因此,利用出的定URL http://host/webAppPrefix/servlet/Test可用于http://host/webAppPrefix/servlet/moreservlets.TestServlet所。
请记住:XML元素不是大小写敏感的,而且定的次序也很重要。例如,web-app元素内所有servlet元素必位于所有servlet- mapping元素(下一小)之前,而且要位于5.65.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-nameservlet-class元素将名称TestTestServlet.class关联 5-15-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.
* <P>
* 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") +
"<BODY BGCOLOR=/"#FDF5E6/">/n" +
"<H2>URI: " + uri + "</H2>/n" +
"</BODY></HTML>");
}
}


程序清5-2 web.xmlservlet名称的摘
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- … -->
<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>moreservlets.TestServlet</servlet-class>
</servlet>
<!-- … -->
</web-app>

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-nameurl-pattern子元素。Servlet- name元素提供了一个任意名称,可利用此名称引用相servleturl-pattern描述了相Web用的根目URLurl- 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元素之前。
<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>moreservlets.TestServlet</servlet-class>
</servlet>
<!-- ... -->
<servlet-mapping>
<servlet-name>Test</servlet-name>
<url-pattern>/UrlTest</url-pattern>
</servlet-mapping>
URL
模式可以包含通配符。例如,下面的小程序指示服送所有以Web用的URL缀开始,以..asp束的求到名BashMSservlet
<servlet>
<servlet-name>BashMS</servlet-name>
<servlet-class>msUtils.ASPTranslator</servlet-class>
</servlet>
<!-- ... -->
<servlet-mapping>
<servlet-name>BashMS</servlet-name>
<url-pattern>/*.asp</url-pattern>
</servlet-mapping>
3.3 
命名JSP
JSP面要转换sevlet,自然希望就像命名servlet命名JSP面。竟,JSP面可能会从初始化参数、安全置或定制的URL中受益,正如普通的serlvetJSP面的后台实际上是servlet是正确的,但存在一个关键的猜疑:即,你不知道JSP面的实际类名(因自己挑选这个名字)。因此,了命名JSP面,可将jsp-file元素替换为servlet-calss元素,如下所示:
<servlet>
<servlet-name>Test</servlet-name>
<jsp-file>/TestPage.jsp</jsp-file>
</servlet>
命名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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>
JSP Test Page
</TITLE>
</HEAD>
<BODY BGCOLOR="#FDF5E6">
<H2>URI: <%= request.getRequestURI() %></H2>
</BODY>
</HTML>


程序清5-4 web.xmlJSP命名的摘
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<servlet>
<servlet-name>PageName</servlet-name>
<jsp-file>/TestPage.jsp</jsp-file>
</servlet>
<!-- ... -->
<servlet-mapping>
<servlet-name> PageName </servlet-name>
<url-pattern>/UrlTest2/*</url-pattern>
</servlet-mapping>
<!-- ... -->
</web-app>


禁止激活器servlet

servletJSP面建立定制URL的一个原因是,这样做可以注册从 initservlet)或jspInitJSP面)方法中取得初始化参数。但是,初始化参数只在是利用定制URL模式或注册名访问 servletJSP可以使用,用缺省URLhttp://host/webAppPrefix/servlet/ServletName访问时不能使用。因此,你可能会希望关闭缺省URL这样就不会有人意外地用初始化servlet了。程有禁止激活器servlet,因多数服器具有一个用缺省的servlet URL注册的servlet,并激活缺省的URL用的实际servlet
有两禁止此缺省URL的主要方法:
Web用中重新映射/servlet/模式。
全局关闭激活器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。只要简单地使用:
<url-pattern>/servlet/*</url-pattern>
servlet-mapping元素中的模式即可。
例如,程序清5-5出了将SorryServlet servlet(程序清5-6)与所有以http://host/webAppPrefix/servlet/开头URL关联的部署描述符文件的一部分。

程序清5-5 web.xmlJSP命名的摘
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<servlet>
<servlet-name>Sorry</servlet-name>
<servlet-class>moreservlets.SorryServlet</servlet-class>
</servlet>
<!-- ... -->
<servlet-mapping>
<servlet-name> Sorry </servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
<!-- ... -->
</web-app>


程序清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.
* <P>
* 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) +
"<BODY BGCOLOR=/"#FDF5E6/">/n" +
"<H2>" + title + "</H2>/n" +
"Sorry, access to servlets by means of/n" +
"URLs that begin with/n" +
"
http://host/webAppPrefix/servlet//n" +
"has been disabled./n" + 
"</BODY></HTML>");
}

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映射即可,如下所示:
<!-- 
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
-->
再次提醒,应该注意是位于存放在install_dir/confTomcat用的web.xml文件中的,此文件不是存放在Web用的WEB-INF中的web.xml
2
.禁止激活器:Tomcat3
Apache Tomcat的版本3中,通install_dir/conf/server.xml中注InvokerInterceptor全局禁止缺省servlet URL。例如,下面是禁止使用缺省servlet URLserver.xml文件的一部分。
<!-- 
<RequsetInterceptor 
className="org.apache.tomcat.request.InvokerInterceptor"
debug="0" prefix="/servlet/" />
-->

初始化和servletJSP

讨论控制servletJSP面的启的方法。特是,明了怎分配初始化参数以及怎更改服器生存期中装servletJSP面的刻。
5.1 
分配servlet初始化参数
利用init-param元素向servlet提供初始化参数,init-param元素具有param-nameparam-value子元素。例如,在下面的例子中,如果initServlet servlet是利用它的注册名(InitTest访问的,它将能从其方法中getServletConfig(). getInitParameter("param1")"Value 1"getServletConfig().getInitParameter("param2")"2"
<servlet>
<servlet-name>InitTest</servlet-name>
<servlet-class>moreservlets.InitServlet</servlet-class>
<init-param>
<param-name>param1</param-name>
<param-value>value1</param-value>
</init-param>
<init-param>
<param-name>param2</param-name>
<param-value>2</param-value>
</init-param>
</servlet>
及初始化参数,有几点需要注意:
返回GetInitParameter的返回值总是一个String。因此,在前一个例子中,可param2使用Integer.parseInt得一个int
l 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方法firstNameemailAddress字段。程序清5-8出分配名称InitTestservletweb.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.
* <P>
* 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") +
"<BODY BGCOLOR=/"#FDF5E6/">/n" +
"<H2>Init Parameters:</H2>/n" +
"<UL>/n" +
"<LI>First name: " + firstName + "/n" +
"<LI>Email address: " + emailAddress + "/n" +
"</UL>/n" + 
"</BODY></HTML>");
}
}


程序清5-8 web.xml明初始化参数的摘
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<servlet>
<servlet-name>InitTest</servlet-name>
<servlet-class>moreservlets.InitServlet</servlet-class>
<init-param>
<param-name>firstName</param-name>
<param-value>Larry</param-value>
</init-param>
<init-param>
<param-name>emailAddress</param-name>
<param-value>
Ellison@Microsoft.com</param-value>
</init-param>
</servlet>
<!-- ... -->
</web-app>

5.2 
分配JSP初始化参数
JSP面提供初始化参数在三个方面不同于servlet提供初始化参数。
1
)使用jsp-file而不是servlet-class。因此,WEB-INF/web.xml文件的servlet元素如下所示:
<servlet>
<servlet-name>PageName</servlet-name>
<jsp-file>/RealPage.jsp</jsp-file>
<init-param>
<param-name>...</param-name>
<param-value>...</param-value>
</init-param>
...
</servlet>
2) 
几乎是分配一个明确的URL模式。servlet,一般相地使用以http://host/webAppPrefix/servlet/始的缺省URL。只需住,使用注册名而不是原名称即可。这对JSP面在技上也是合法的。例如,在上面出的例子中,可用URL http://host/webAppPrefix/servlet/PageName访问RealPage.jsp初始化参数具有访问权的版本。但在用于JSP多用似乎不喜欢应用常servletURL。此外,如果 JSP面位于服其提供了目的目中(如,一个既没有index.html也没有index.jsp文件的目),可能会接到此 JSP面,单击它,从而意外地激活未初始化的面。因此,好的法是使用url-pattern5.3)将JSP面的原URL与注册的 servlet名相关联这样,客机可使用JSP面的普通名称,但仍然激活定制的版本。例如,定来自1servlet,可使用下面的 servlet-mapping
<servlet-mapping>
<servlet-name>PageName</servlet-name>
<url-pattern>/RealPage.jsp</url-pattern>
</servlet-mapping>
3
JSP使用jspInit而不是init。自JSP面建立的servlet使用了inti方法。因此,使用JSP声明提供一个init方法是不合法的,必制定jspInit方法。
明初始化JSP面的程,程序清5-9出了一个名InitPage.jspJSP面,它包含一个jspInit方法且放置于deployDemo Web构的顶层。一般,http://host/deployDemo/InitPage.jsp形式的URL将激活此面的不具有初始化参数访问权的版本,从而将firstNameemailAddressnull。但是, web.xml文件(程序清5-10)分配了一个注册名,然后将注册名与URL模式/InitPage.jsp关联

程序清5-9 InitPage.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD><TITLE>JSP Init Test</TITLE></HEAD>
<BODY BGCOLOR="#FDF5E6">
<H2>Init Parameters:</H2>
<UL>
<LI>First name: <%= firstName %>
<LI>Email address: <%= emailAddress %>
</UL>
</BODY></HTML>
<%!
private String firstName, emailAddress;

public void jspInit() {
ServletConfig config = getServletConfig();
firstName = config.getInitParameter("firstName");
emailAddress = config.getInitParameter("emailAddress");
}
%>


程序清5-10 web.xmlJSP面的init参数的摘
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<servlet>
<servlet-name>InitPage</servlet-name>
<jsp-file>/InitPage.jsp</jsp-file>
<init-param>
<param-name>firstName</param-name>
<param-value>Bill</param-value>
</init-param>
<init-param>
<param-name>emailAddress</param-name>
<param-value>
gates@oracle.com</param-value>
</init-param>
</servlet>
<!-- ... --> 
<servlet-mapping>
<servlet-name> InitPage</servlet-name>
<url-pattern>/InitPage.jsp</url-pattern>
</servlet-mapping>
<!-- ... -->
</web-app>


5.3 
提供用范内的初始化参数
一般,对单个地servletJSP面分配初始化参数。指定的servletJSP面利用ServletConfiggetInitParameter方法些参数。但是,在某些情形下,希望提供可由任意servletJSP面借助ServletContextgetInitParameter方法取的系内的初始化参数。
可利用context-param元素声明些系内的初始化context-param元素应该包含param-nameparam-value以及可description子元素,如下所示:
<context-param>
<param-name>support-email</param-name>
<param-value>
blackhole@mycompany.com</param-value>
</context-param>
可回一下,了保可移植性,web.xml内的元素必以正确的次序声明。但应该注意,context-param元素必任意与文档有的元素(icondisplay-namedescription)之后及filterfilter-mappinglistener servlet元素之前。
5.4 
在服器启动时servlet
假如servletJSP面有一个要花很长时间执行的init servlet)或jspInitJSP)方法。例如,假如initjspInit方法从某个数据ResourceBundle量。这种情况下,在第一个客servlet的缺省行一个客较长时间的延。因此,可利用servletload-on- startup元素定服器在第一次启动时servlet。下面是一个例子。
<servlet>
<servlet-name> … </servlet-name>
<servlet-class> … </servlet-class> <!-- Or jsp-file -->
<load-on-startup/>
</servlet>
可以此元素体提供一个整数而不是使用一个空的load-on-startup。想法是服应该在装载较大数目的servletJSP面之前装载较少数目的servletJSP面。例如,下面的servlet(放置在Web用的WEB-INF下的web.xml文件中的web-app元素内)将指示服器首先装和初始化SearchServlet,然后装和初始化由位于Web用的result中的index.jsp文件生的 servlet
<servlet>
<servlet-name>Search</servlet-name>
<servlet-class>myPackage.SearchServlet</servlet-class> <!-- Or jsp-file -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>Results</servlet-name>
<servlet-class>/results/index.jsp</servlet-class> <!-- Or jsp-file -->
<load-on-startup>2</load-on-startup>
</servlet>

声明过滤

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

程序清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.
* <P>
* 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.xmlweb-app元素中出的次序不是任意的;允器(但不是必需的)制所需的次序,并且实际中有些服器也是这样做的。但里要注意,所有filter元素必在任意filter-mapping元素之前, filter-mapping元素又必在所servletservlet-mapping元素之前。
例如,定上述的ReportFilter,可在web.xml中作出下面的filter声明。它把名称Reporter实际ReportFilter(位于moreservlets程序包中)相关联
<filter>
<filter-name>Reporter</filter-name>
<filter-class>moresevlets.ReportFilter</filter-class>
</filter>
一旦命名了一个过滤器,可利用filter-mapping元素把它与一个或多个servletJSP面相关联于此工作有两种选择
首先,可使用filter-nameservlet-name子元素把此过滤器与一个特定的servlet名(此servlet名必稍后在相同的web.xml文件中使用servlet元素声明)关联。例如,下面的程序片断指示系只要利用一个定制的URL访问SomeServletName servletJSP面,就运行名Reporter过滤器。
<filter-mapping>
<filter-name>Reporter</filter-name>
<servlet-name>SomeServletName</servlet-name>
</filter-mapping>
其次,可利用filter-nameurl-pattern子元素将过滤器与一servletJSP面或静内容相关联。例如,相面的程序片段指示系只要访问Web用中的任意URL,就运行名Reporter过滤器。
<filter-mapping>
<filter-name>Reporter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
例如,程序清5-12出了将ReportFilter过滤器与名PageNameservlet关联web.xml文件的一部分。名字PageName依次又与一个名TestPage.jspJSP面以及以模式http: //host/webAppPrefix/UrlTest2/ 开头URL关联TestPage.jsp的源代JSP面命名的谈论在前面的3"分配名称和定制的URL"出。事上,程序清5- 12中的servletservlet-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.xmlfilter用法的摘
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<filter>
<filter-name>Reporter</filter-name>
<filter-class>moresevlets.ReportFilter</filter-class>
</filter>
<!-- ... -->
<filter-mapping>
<filter-name>Reporter</filter-name>
<servlet-name>PageName</servlet-name>
</filter-mapping>
<!-- ... -->
<servlet>
<servlet-name>PageName</servlet-name>
<jsp-file>/RealPage.jsp</jsp-file>
</servlet>
<!-- ... -->
<servlet-mapping>
<servlet-name> PageName </servlet-name>
<url-pattern>/UrlTest2/*</url-pattern>
</servlet-mapping>
<!-- ... -->
</web-app>


指定

假如用提供了一个像http: //host/webAppPrefix/directoryName/ 这样的包含一个目名但没有包含文件名的URL,会生什事情呢?用能得到一个目表?一个错误准文件的内容?如果得到准文件内容,是index.htmlindex.jspdefault.htmldefault.htm的什么东西呢?
Welcome-file-list 
元素及其助的welcome-file元素解决了个模糊的问题。例如,下面的web.xml指出,如果一个URL出一个目名但未出文件名,服应该首先index.jsp,然后再index.html。如果两者都没有找到,则结果有于所用的服器(如一个目列表)。
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
多服器缺省遵循这种,但不一定必须这样。因此,明确地使用welcom-file-list可移植性是一良好的习惯

指定错误

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

8.1 error-code
元素
了更好地了解error-code元素的,可考一下如果不正确地入文件名,大多数站点会作出什反映。这样做一般会出一个404错误信息,它表示不能找到文件,但几乎没提供更多有用的信息。另一方面,可以一下在www.microsoft.comwww.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.xmllogin-config的摘
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<security-constraint> ... </security-constraint>
<login-config>
<auth-method> FORM </auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/login-error.jsp</form-error-page>
</form-login-config>
</login-config>
<!-- ... -->
</web-app>


9.2 
限制Web源的访问
在,可以指示服器使用何种验证方法了。"了不起,"道,"除非我能指定一个来收到保 URL,否没有多大用"。指出URL明他们应该得到何正是security-constriaint元素的用途。此元素在 web.xml应该login-config前面。它包含是个可能的子元素,分是:web-resource-collection auth-constraintuser-data-constraintdisplay-name。下面各小节对们进行介
l web-resource-collection
此元素确定应该源。所有security-constraint元素都必包含至少一个web-resource-collection。此元素由一个出任意标识名称的web-resource-name元素、一个确定应该URLurl-pattern元素、一个指出此保所适用的 HTTP命令(GETPOST等,缺省所有方法)的http-method元素和一个提供料的可description元素成。例如,下面的 Web-resource-collection(在security-constratint元素内)指出Web用的proprietary中所有文档应该受到保
<security-constraint>
<web-resource-coolection>
<web-resource-name>Proprietary</web-resource-name>
<url-pattern>/propritary/*</url-pattern>
</web-resource-coolection>
<!-- ... -->
</security-constraint>
重要的是应该注意到,url-pattern适用于直接访问这源的客机。特是,它不适合于通MVC体系构利用RequestDispatcher访问面,或者不适合于利用jsp:forward的手段来访问面。这种不匀称如果利用得当的很有好。例如,servlet可利用MVC体系找数据,把它放到bean中,求到从bean中提取数据的JSP面并示它。我希望保决不直接访问受保JSP面,而只是通建立该页面将使用的beanservlet访问它。url-patternauth-contraint元素可通声明不允任何用直接访问JSP面来提供这种。但是,这种不匀称的行可能让开发放松警惕,使他偶然对应受保源提供不受限制的访问 
l auth-constraint
尽管web-resource-collention元素出了哪些URL应该受到保,但是auth-constraint元素却指出哪些用户应该具有受保护资源的访问权。此元素应该包含一个或多个标识具有访问权限的用户类别role- name元素,以及包含(可)一个描述角色的description元素。例如,下面web.xml中的security-constraint元素部门规定只有指定AdministratorBig Kahuna(或两者)的用具有指定源的访问权
<security-constraint>
<web-resource-coolection> ... </web-resource-coolection>
<auth-constraint>
<role-name>administrator</role-name>
<role-name>kahuna</role-name>
</auth-constraint>
</security-constraint>
重要的是认识到,到此止,程的可移植部分束了。服器怎确定哪些用户处于任何角色以及它怎存放用的口令,完全有于具体的系
例如,Tomcat使用install_dir/conf/tomcat-users.xml将用名与角色名和口令相关联,正如下面例子中所示,它指出用joe(口令bigshot)和jane(口令enaj)属于administratorkahuna角色。
<tomcat-users>
<user name="joe" password="bigshot" roles="administrator,kahuna" />
<user name="jane" password="enaj" roles="kahuna" />
</tomcat-users>
l user-data-constraint
个可的元素指出在访问关资使用任何传输层。它必包含一个transport-guarantee子元素(合法值为NONE INTEGRALCONFIDENTIAL),并且可地包含一个description元素。transport-guaranteeNONE所用的通讯协议不加限制。INTEGRAL表示数据必以一防止截取它的人阅读它的方式送。然原理上(并且在未来的HTTP版本中),在 INTEGRALCONFIDENTIAL可能会有差,但在当前践中,他都只是简单地要求用SSL。例如,下面指示服器只允许对关资源做 HTTPS接:
<security-constraint>
<!-- ... -->
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
l display-name
security-constraint
个很少使用的子元素予可能由GUI工具使用的安全一个名称。
9.3 
分配角色名
迄今止,讨论集中到完全由容器(服器)理的安全问题之上了。但servlet以及JSP面也能够处理它自己的安全问题
例如,容器可能允bigwigbigcheese角色访问一个示主管人员额紧贴面,但只允bigwig修改此面的参数。完成这种致的控制的一方法是HttpServletRequsetisUserInRole方法,并据此修改访问
Servlet
 security-role-ref子元素提供出在服用口令文件中的安全角色名的一个名。例如,假如写了一个 request.isUserInRole"boss")的servlet,但后来servlet被用在了一个其口令文件用角色manager而不是boss的服器中。下面的程序段使servlet使用两个名称中的任何一个。
<servlet>
<!-- ... -->
<security-role-ref>
<role-name>boss</role-name> <!-- New alias -->
<role-link>manager</role-link> <!-- Real name -->
</security-role-ref>
</servlet>
也可以在web-app内利用security-role元素提供将出role-name元素中的所有安全角色的一个全局列表。分地生命角色使高IDE容易理安全信息。

10 
控制会

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

11 Web
用的文档化

越来越多的开发环始提供servletJSP的直接支持。例子有Borland Jbuilder Enterprise EditionMacromedia UltraDevAllaire JRun Studio(写此文,已被Macromedia)以及IBM VisuaAge for Java等。
大量的web.xml元素不设计的,而且视开发环设计的。它包括icondisplay-namediscription等。
可回一下,在web.xml内以适当地次序声明web-app子元素很重要。不里只要icondisplay-namedescriptionweb.xmlweb-app元素内的前三个合法元素即可。
l icon
icon
元素指出GUI工具可用来代表Web用的一个和两个像文件。可利用small-icon元素指定一幅16 x 16GIFJPEG像,用large-icon元素指定一幅32 x 32像。下面一个例子: 
<icon>
<small-icon>/images/small-book.gif</small-icon>
<large-icon>/images/tome.jpg</large-icon>
</icon>
l display-name
display-name
元素提供GUI工具可能会用来标记Web用的一个名称。下面是个例子。
<display-name>Rare Books</display-name>
l description
description
元素提供解性文本,如下所示:
<description>
This Web application represents the store developed for
rare-books.com, an online bookstore specializing in rare
and limited-edition books.
</description>

12 
关联文件与MIME

器一般都具有一种让Web站点管理将文件展名与媒体相关联的方法。例如,将会自动给予名mom.jpg的文件一个image/jpegMIME 型。但是,假如你的Web用具有几个不常的文件,你希望保送到客分配MIME型。mime-mapping元素(具有 extensionmime-type子元素)可提供这种。例如,下面的代指示服器将application/x-fubarMIME型分配所有以.foo尾的文件。
<mime-mapping>
<extension>foo</extension>
<mime-type>application/x-fubar</mime-type>
</mime-mapping>
,你的Web用希望重override准的映射。例如,下面的代将告器在送到客指定.ps文件作为纯文本(text/plain)而不是作PostScriptapplication/postscript)。
<mime-mapping>
<extension>ps</extension>
<mime-type>application/postscript</mime-type>
</mime-mapping>


13 
定位TLD

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

14 
指定用事件听程序

用事件听器程序是建立或修改servlet境或会话对通知的。它servlet范的版本2.3中的新内容。里只简单明用来向Web用注册一个听程序的web.xml的用法。
注册一个听程序及在web.xmlweb-app元素内放置一个listener元素。在listener元素内,listener-class元素列出听程序的完整的限定名,如下所示:
<listener>
<listener-class>package.ListenerClass</listener-class>
</listener>
listener元素的构很简单,但不要忘,必正确地web-app元素内的子元素的次序。listener元素位于所有的servlet 元素之前以及所有filter-mapping元素之后。此外,因为应用生存期听程序是serlvet范的2.3版本中的新内容,所以必使用 web.xml DTD2.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.
* <P>
* 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(声明一个听程序的摘
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<filter-mapping> … </filter-mapping>
<listener>
<listener-class>package.ListenerClass</listener-class>
</listener>
<servlet> ... </servlet>
<!-- ... -->
</web-app>


15 J2EE
元素

描述用作J2EE成部分的Web用的web.xml元素。里将提供一个明的介详细内容可以参http://java.sun.com/j2ee/j2ee-1_3-fr-spec.pdfJava 2 Plantform Enterprise Edition版本1.3范的第5章。
l distributable
distributable 
元素指出,Web用是以这样的方式程的:即,支持集群的服器可安全地在多个服器上分布Web用。例如,一个可分布的用必只使用 Serializable象作HttpSession象的属性,而且必避免用量(字段)来实现性。distributable元素直接出discription元素之后,并且不包含子元素或数据,它只是一个如下的志。
<distributable />
l resource-env-ref
resource -env-ref
元素声明一个与某个源有的管理象。此元素由一个可description元素、一个resource-env-ref- name元素(一个相java:comp/env境的JNDI名)以及一个resource-env-type元素(指定型的完全限定的),如下所示:
<resource-env-ref>
<resource-env-ref-name>
jms/StockQueue
</resource-env-ref-name>
<resource-env-ref-type>
javax.jms.Queue
</resource-env-ref-type>
</resource-env-ref>
l env-entry
env -entry
元素声明Web用的。它由一个可description元素、一个env-entry-name元素(一个相java: comp/envJNDI名)、一个env-entry-value元素(项值)以及一个env-entry-type元素(java.lang程序包中一个型的完全限定名,java.lang.Booleanjava.lang.String等)成。下面是一个例子:
<env-entry>
<env-entry-name>minAmout</env-entry-name>
<env-entry-value>100.00</env-entry-value>
<env-entry-type>minAmout</env-entry-type>
</env-entry>
l ejb-ref
ejb -ref
元素声明一个EJB的主目用。它由一个可description元素、一个ejb-ref-name元素(相java: comp/envEJB用)、一个ejb-ref-type元素(bean型,EntitySession)、一个home元素(bean的主目接口的完全限定名)、一个remote元素(bean程接口的完全限定名)以及一个可ejb-link元素(当前bean接的另一个 bean的名称)成。
l ejb-local-ref
ejb-local-ref
元素声明一个EJB的本地主目的引用。除了用local-home代替home外,此元素具有与ejb-ref元素相同的属性并以相同的方式使用