﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-D盘-随笔分类-Tomcat</title><link>http://www.cnitblog.com/wufajiaru/category/6669.html</link><description>workspace</description><language>zh-cn</language><lastBuildDate>Thu, 07 Jun 2012 07:06:41 GMT</lastBuildDate><pubDate>Thu, 07 Jun 2012 07:06:41 GMT</pubDate><ttl>60</ttl><item><title>tomcat web.xml详解 [转]</title><link>http://www.cnitblog.com/wufajiaru/archive/2008/09/25/49525.html</link><dc:creator>巴西木</dc:creator><author>巴西木</author><pubDate>Thu, 25 Sep 2008 05:58:00 GMT</pubDate><guid>http://www.cnitblog.com/wufajiaru/archive/2008/09/25/49525.html</guid><description><![CDATA[<div class=postTitle>web.xml元素介绍 <br>每一个站的WEB-INF下都有一个web.xml的设定文件，它提供了我们站台的配置设定. <br><br>web.xml定义： <br>.站台的名称和说明 <br>.针对环境参数(Context)做初始化工作 <br>.Servlet的名称和映射 <br>.Session的设定 <br>.Tag library的对映 <br>.JSP网页设定 <br>.Mime Type处理 <br>.错误处理 <br>.利用JDNI取得站台资源 <br><br>要了解web.xml的设定值，必须了解它的schema,从web.xml中知道它的schema是由Sum Microsystems公司定制的，如果你想更为详细的了解它， <br>可以到http://java.sun.com/xml/ns/j2ee/web-mapp_2_4.xsd网页，那里有更为详细的介绍。<a class=postTitle2 id=viewpost1_TitleUrl href="http://www.blogjava.net/balajinima/articles/157673.html"><u><font color=#800080><br><br><br>tomcat web.xml详解</font></u></a> </div>
1 定义头和根元素<br>部署描述符文件就像所有XML文件一样，必须以一个XML头开始。这个头声明可以使用的XML版本并给出文件的字符编码。
<p>DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用的servlet规范的版本（如2.2或2.3）并指定管理此文件其余部分内容的语法的DTD(Document Type Definition，</p>
<p>文档类型定义)。</p>
<p>所有部署描述符文件的顶层（根）元素为web-app。请注意，XML元素不像HTML，他们是大小写敏感的。因此，web-App和WEB-APP都是不合法的，web-app必须用小写。</p>
<p>2 部署描述符文件内的元素次序<br>XML 元素不仅是大小写敏感的，而且它们还对出现在其他元素中的次序敏感。例如，XML头必须是文件中的第一项，DOCTYPE声明必须是第二项，而web- app元素必须是第三项。在</p>
<p>web-app元素内，元素的次序也很重要。服务器不一定强制要求这种次序，但它们允许（实际上有些服务器就是这样做的）完全拒绝执行含有次序不正确的元素的Web应用。这表示</p>
<p>使用非标准元素次序的web.xml文件是不可移植的。</p>
<p>下面的列表给出了所有可直接出现在web-app元素内的合法元素所必需的次序。例如，此列表说明servlet元素必须出现在所有servlet-mapping元素之前。请注意，所有这些元素都</p>
<p>是可选的。因此，可以省略掉某一元素，但不能把它放于不正确的位置。</p>
<p>2.1 Icon&nbsp;&nbsp;&nbsp;<br>icon元素指出IDE和GUI工具用来表示Web应用的一个和两个图像文件的位置。</p>
<p>2.2 display-name&nbsp;&nbsp;<br>display-name元素提供GUI工具可能会用来标记这个特定的Web应用的一个名称。</p>
<p>2.3 description <br>description元素给出与此有关的说明性文本。</p>
<p>2.4 context-param&nbsp;&nbsp;&nbsp;<br>context-param元素声明应用范围内的初始化参数。</p>
<p>2.5 filter <br>过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。</p>
<p>2.6 filter-mapping <br>一旦命名了一个过滤器，就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。</p>
<p>2.7 listener <br>servlet API的版本2.3增加了对事件监听程序的支持，事件监听程序在建立、修改和删除会话或servlet环境时得到通知。Listener元素指出事件监听程序类。</p>
<p>2.8 servlet <br>在向servlet或JSP页面制定初始化参数或定制URL时，必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。</p>
<p>2.9 servlet-mapping <br>服务器一般为servlet提供一个缺省的URL：<a href="http://host/webAppPrefix/servlet/ServletName"><u><font color=#0000ff>http://host/webAppPrefix/servlet/ServletName</font></u></a>。但是，常常会更改这个URL，以便servlet可以访问初始化参数或更容易地处理相对</p>
<p>URL。在更改缺省URL时，使用servlet-mapping元素。</p>
<p>2.10 session-config <br>如果某个会话在一定时间内未被访问，服务器可以抛弃它以节省内存。可通过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对象的超时值，或者可利用</p>
<p>session-config元素制定缺省超时值。</p>
<p>2.11 mime-mapping <br>如果Web应用具有想到特殊的文件，希望能保证给他们分配特定的MIME类型，则mime-mapping元素提供这种保证。</p>
<p>2.12 welcom-file-list <br>welcome-file-list元素指示服务器在收到引用一个目录名而不是文件名的URL时，使用哪个文件。</p>
<p>2.13 error-page <br>error-page元素使得在返回特定HTTP状态代码时，或者特定类型的异常被抛出时，能够制定将要显示的页面。</p>
<p>2.14 taglib <br>taglib元素对标记库描述符文件（Tag Libraryu Descriptor file）指定别名。此功能使你能够更改TLD文件的位置，而不用编辑使用这些文件的JSP页面。</p>
<p>2.15 resource-env-ref <br>resource-env-ref元素声明与资源相关的一个管理对象。</p>
<p>2.16 resource-ref<br>resource-ref元素声明一个资源工厂使用的外部资源。</p>
<p>2.17 security-constraint<br>security-constraint元素制定应该保护的URL。它与login-config元素联合使用</p>
<p>2.18 login-config <br>用login-config元素来指定服务器应该怎样给试图访问受保护页面的用户授权。它与sercurity-constraint元素联合使用。</p>
<p>2.19 security-role<br>security-role元素给出安全角色的一个列表，这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为</p>
<p>容易。</p>
<p>2.20 env-entry <br>env-entry元素声明Web应用的环境项。</p>
<p>2.21 ejb-ref <br>ejb-ref元素声明一个EJB的主目录的引用。</p>
<p>2.22 ejb-local-ref<br>ejb-local-ref元素声明一个EJB的本地主目录的应用。</p>
<p>3 分配名称和定制的UL<br>在web.xml中完成的一个最常见的任务是对servlet或JSP页面给出名称和定制的URL。用servlet元素分配名称，使用servlet-mapping元素将定制的URL与刚分配的名称相关联。</p>
<p>3.1 分配名称<br>为了提供初始化参数，对servlet或JSP页面定义一个定制URL或分配一个安全角色，必须首先给servlet或JSP页面一个名称。可通过 servlet元素分配一个名称。最常见的格式包括</p>
<p>servlet-name和servlet-class子元素（在web-app元素内），如下所示：</p>
<p>&lt;servlet&gt;</p>
<p>&lt;servlet-name&gt;Test&lt;/servlet-name&gt;</p>
<p>&lt;servlet-class&gt;moreservlets.TestServlet&lt;/servlet-class&gt;</p>
<p>&lt;/servlet&gt;</p>
<p>这表示位于WEB-INF/classes/moreservlets/TestServlet的servlet已经得到了注册名Test。给 servlet一个名称具有两个主要的含义。首先，初始化参数、定制的URL模式以及其</p>
<p>他定制通过此注册名而不是类名引用此servlet。其次,可在 URL而不是类名中使用此名称。因此，利用刚才给出的定义，URL <a href="http://host/webAppPrefix/servlet/Test"><u><font color=#0000ff>http://host/webAppPrefix/servlet/Test</font></u></a> 可用于 </p>
<p><a href="http://host/webAppPrefix/servlet/moreservlets.TestServlet"><u><font color=#0000ff>http://host/webAppPrefix/servlet/moreservlets.TestServlet</font></u></a> 的场所。</p>
<p>请记住：XML元素不仅是大小写敏感的，而且定义它们的次序也很重要。例如，web-app元素内所有servlet元素必须位于所有servlet- mapping元素（下一小节介绍）之前，而且还</p>
<p>要位于5.6节和5.11节讨论的与过滤器或文档相关的元素（如果有的话）之前。类似地，servlet 的servlet-name子元素也必须出现在servlet-class之前。5.2节&#8221;部署描述符文件</p>
<p>内的元素次序&#8221;将详细介绍这种必需的次序。</p>
<p>例如，程序清单5-1给出了一个名为TestServlet的简单servlet，它驻留在moreservlets程序包中。因为此servlet是扎根在一个名为deployDemo的目录中的Web应用的组成部分，所</p>
<p>以TestServlet.class放在deployDemo/WEB- INF/classes/moreservlets中。程序清单5-2给出将放置在deployDemo/WEB-INF/内的web.xml文件的一部分。此web.xml文件使用</p>
<p>servlet-name和servlet-class元素将名称Test与TestServlet.class相关联。图 5-1和图5-2分别显示利用缺省URL和注册名调用TestServlet时的结果。</p>
<p>程序清单5-1 TestServlet.java</p>
<p>package moreservlets;</p>
<p>import java.io.*;</p>
<p>import javax.servlet.*;</p>
<p>import javax.servlet.http.*;</p>
<p>/** Simple servlet used to illustrate servlet naming</p>
<p>* and custom URLs.</p>
<p>* &lt;P&gt;</p>
<p>* Taken from More Servlets and JavaServer Pages</p>
<p>* from Prentice Hall and Sun Microsystems Press,</p>
<p>* <a href="http://www.moreservlets.com/"><u><font color=#0000ff>http://www.moreservlets.com/</font></u></a>.</p>
<p>* ? 2002 Marty Hall; may be freely used or adapted.</p>
<p>*/</p>
<p>public class TestServlet extends HttpServlet {</p>
<p>public void doGet(HttpServletRequest request,</p>
<p>HttpServletResponse response)</p>
<p>throws ServletException, IOException {</p>
<p>response.setContentType("text/html");</p>
<p>PrintWriter out = response.getWriter();</p>
<p>String uri = request.getRequestURI();</p>
<p>out.println(ServletUtilities.headWithTitle("Test Servlet") +</p>
<p>"&lt;BODY BGCOLOR=\"#FDF5E6\"&gt;\n" +</p>
<p>"&lt;H2&gt;URI: " + uri + "&lt;/H2&gt;\n" +</p>
<p>"&lt;/BODY&gt;&lt;/HTML&gt;");</p>
<p>}</p>
<p>}</p>
<p>程序清单5-2 web.xml（说明servlet名称的摘录）</p>
<p>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</p>
<p>&lt;!DOCTYPE web-app</p>
<p>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</p>
<p>"<a href="http://java.sun.com/dtd/web-app_2_3.dtd"><u><font color=#0000ff>http://java.sun.com/dtd/web-app_2_3.dtd</font></u></a>"&gt;</p>
<p>&lt;web-app&gt;</p>
<p>&lt;!-- &#8230; --&gt;</p>
<p>&lt;servlet&gt;</p>
<p>&lt;servlet-name&gt;Test&lt;/servlet-name&gt;</p>
<p>&lt;servlet-class&gt;moreservlets.TestServlet&lt;/servlet-class&gt;</p>
<p>&lt;/servlet&gt;</p>
<p>&lt;!-- &#8230; --&gt;</p>
<p>&lt;/web-app&gt;</p>
<p>3.2 定义定制的URL<br>大多数服务器具有一个缺省的serlvet URL：</p>
<p><a href="http://host/webAppPrefix/servlet/packageName.ServletName"><u><font color=#0000ff>http://host/webAppPrefix/servlet/packageName.ServletName</font></u></a>。虽然在开发中使用这个URL很方便，但是我们常常会希望另一个URL用于部署。例如，可能会需要一个出现在Web应</p>
<p>用顶层的URL（如，http: //host/webAppPrefix/Anyname），并且在此URL中没有servlet项。位于顶层的URL简化了相对URL的使用。此外，对许多开发人员来说，顶层URL看上去比</p>
<p>更长更麻烦的缺省URL更简短。</p>
<p>事实上，有时需要使用定制的URL。比如，你可能想关闭缺省URL映射，以便更好地强制实施安全限制或防止用户意外地访问无初始化参数的servlet。如果你禁止了缺省的URL，那</p>
<p>么你怎样访问servlet呢？这时只有使用定制的URL了。</p>
<p>为了分配一个定制的URL，可使用servlet-mapping元素及其servlet-name和url-pattern子元素。Servlet- name元素提供了一个任意名称，可利用此名称引用相应的servlet；url</p>
<p>-pattern描述了相对于Web应用的根目录的URL。url- pattern元素的值必须以斜杠（/）起始。</p>
<p>下面给出一个简单的web.xml摘录，它允许使用URL <a href="http://host/webAppPrefix/UrlTest"><u><font color=#0000ff>http://host/webAppPrefix/UrlTest</font></u></a>而不是<a href="http://host/webAppPrefix/servlet/Test"><u><font color=#0000ff>http://host/webAppPrefix/servlet/Test</font></u></a>或</p>
<p>http: //host/webAppPrefix/servlet/moreservlets.TestServlet。请注意，仍然需要XML头、 DOCTYPE声明以及web-app封闭元素。此外，可回忆一下，XML元素出现地次序不是随</p>
<p>意的。特别是，需要把所有servlet元素放在所有 servlet-mapping元素之前。</p>
<p>&nbsp;</p>
<p>&lt;servlet&gt;</p>
<p>&lt;servlet-name&gt;Test&lt;/servlet-name&gt;</p>
<p>&lt;servlet-class&gt;moreservlets.TestServlet&lt;/servlet-class&gt;</p>
<p>&lt;/servlet&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;servlet-mapping&gt;</p>
<p>&lt;servlet-name&gt;Test&lt;/servlet-name&gt;</p>
<p>&lt;url-pattern&gt;/UrlTest&lt;/url-pattern&gt;</p>
<p>&lt;/servlet-mapping&gt;</p>
<p>URL模式还可以包含通配符。例如，下面的小程序指示服务器发送所有以Web应用的URL前缀开始，以..asp结束的请求到名为BashMS的servlet。</p>
<p>&lt;servlet&gt;</p>
<p>&lt;servlet-name&gt;BashMS&lt;/servlet-name&gt;</p>
<p>&lt;servlet-class&gt;msUtils.ASPTranslator&lt;/servlet-class&gt;</p>
<p>&lt;/servlet&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;servlet-mapping&gt;</p>
<p>&lt;servlet-name&gt;BashMS&lt;/servlet-name&gt;</p>
<p>&lt;url-pattern&gt;/*.asp&lt;/url-pattern&gt;</p>
<p>&lt;/servlet-mapping&gt;</p>
<p>3.3 命名JSP页面<br>因为JSP页面要转换成sevlet，自然希望就像命名servlet一样命名JSP页面。毕竟，JSP页面可能会从初始化参数、安全设置或定制的URL中受益，正如普通的serlvet那样。虽然JSP</p>
<p>页面的后台实际上是servlet这句话是正确的，但存在一个关键的猜疑：即，你不知道JSP页面的实际类名（因为系统自己挑选这个名字）。因此，为了命名JSP页面，可将jsp-file</p>
<p>元素替换为servlet-calss元素，如下所示：</p>
<p>&lt;servlet&gt;</p>
<p>&lt;servlet-name&gt;Test&lt;/servlet-name&gt;</p>
<p>&lt;jsp-file&gt;/TestPage.jsp&lt;/jsp-file&gt;</p>
<p>&lt;/servlet&gt;</p>
<p>命名JSP页面的原因与命名servlet的原因完全相同：即为了提供一个与定制设置（如，初始化参数和安全设置）一起使用的名称，并且，以便能更改激活 JSP页面的URL（比方说，</p>
<p>以便多个URL通过相同页面得以处理，或者从URL中去掉.jsp扩展名）。但是，在设置初始化参数时，应该注意，JSP页面是利用jspInit方法，而不是init方法读取初始化参数的。</p>
<p>例如，程序清单5-3给出一个名为TestPage.jsp的简单JSP页面，它的工作只是打印出用来激活它的URL的本地部分。TestPage.jsp放置在deployDemo应用的顶层。程序清单5-4给出</p>
<p>了用来分配一个注册名PageName，然后将此注册名与<a href="http://host/webAppPrefix/UrlTest2/anything"><u><font color=#0000ff>http://host/webAppPrefix/UrlTest2/anything</font></u></a> 形式的URL相关联的web.xml文件（即，deployDemo/WEB-INF/web.xml）的一部</p>
<p>分。</p>
<p>程序清单5-3 TestPage.jsp</p>
<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt;</p>
<p>&lt;HTML&gt;</p>
<p>&lt;HEAD&gt;</p>
<p>&lt;TITLE&gt;</p>
<p>JSP Test Page</p>
<p>&lt;/TITLE&gt;</p>
<p>&lt;/HEAD&gt;</p>
<p>&lt;BODY BGCOLOR="#FDF5E6"&gt;</p>
<p>&lt;H2&gt;URI: &lt;%= request.getRequestURI() %&gt;&lt;/H2&gt;</p>
<p>&lt;/BODY&gt;</p>
<p>&lt;/HTML&gt;</p>
<p>程序清单5-4 web.xml（说明JSP页命名的摘录）</p>
<p>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</p>
<p>&lt;!DOCTYPE web-app</p>
<p>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</p>
<p>"<a href="http://java.sun.com/dtd/web-app_2_3.dtd"><u><font color=#0000ff>http://java.sun.com/dtd/web-app_2_3.dtd</font></u></a>"&gt;</p>
<p>&nbsp;</p>
<p>&lt;web-app&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;servlet&gt;</p>
<p>&lt;servlet-name&gt;PageName&lt;/servlet-name&gt;</p>
<p>&lt;jsp-file&gt;/TestPage.jsp&lt;/jsp-file&gt;</p>
<p>&lt;/servlet&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;servlet-mapping&gt;</p>
<p>&lt;servlet-name&gt; PageName &lt;/servlet-name&gt;</p>
<p>&lt;url-pattern&gt;/UrlTest2/*&lt;/url-pattern&gt;</p>
<p>&lt;/servlet-mapping&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;/web-app&gt;</p>
<p>4 禁止激活器servlet<br>对servlet 或JSP页面建立定制URL的一个原因是，这样做可以注册从 init（servlet）或jspInit（JSP页面）方法中读取得初始化参数。但是，初始化参数只在是利用定制URL模式</p>
<p>或注册名访问 servlet或JSP页面时可以使用，用缺省URL <a href="http://host/webAppPrefix/servlet/ServletName"><u><font color=#0000ff>http://host/webAppPrefix/servlet/ServletName</font></u></a> 访问时不能使用。因此，你可能会希望关闭缺省URL，这样就不会有人</p>
<p>意外地调用初始化servlet了。这个过程有时称为禁止激活器servlet，因为多数服务器具有一个用缺省的servlet URL注册的标准servlet，并激活缺省的URL应用的实际servlet。</p>
<p>有两种禁止此缺省URL的主要方法：</p>
<p>l 在每个Web应用中重新映射/servlet/模式。</p>
<p>4.1 全局关闭激活器servlet。<br>重要的是应该注意到，虽然重新映射每个Web应用中的/servlet/模式比彻底禁止激活servlet所做的工作更多，但重新映射可以用一种完全可移植的方式来完成。相反，全局禁止激</p>
<p>活器servlet完全是针对具体机器的，事实上有的服务器（如ServletExec）没有这样的选择。下面的讨论对每个Web应用重新映射/servlet/ URL模式的策略。后面提供在Tomcat中</p>
<p>全局禁止激活器servlet的详细内容。</p>
<p>4.2 重新映射/servlet/URL模式<br>在一个特定的Web应用中禁止以<a href="http://host/webAppPrefix/servlet/"><u><font color=#0000ff>http://host/webAppPrefix/servlet/</font></u></a> 开始的URL的处理非常简单。所需做的事情就是建立一个错误消息servlet，并使用前一节讨论的url-pattern</p>
<p>元素将所有匹配请求转向该 servlet。只要简单地使用：</p>
<p>&lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;</p>
<p>作为servlet-mapping元素中的模式即可。</p>
<p>例如，程序清单5-5给出了将SorryServlet servlet（程序清单5-6）与所有以<a href="http://host/webAppPrefix/servlet/"><u><font color=#0000ff>http://host/webAppPrefix/servlet/</font></u></a> 开头的URL相关联的部署描述符文件的一部分。</p>
<p>程序清单5-5 web.xml（说明JSP页命名的摘录）</p>
<p>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</p>
<p>&lt;!DOCTYPE web-app</p>
<p>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</p>
<p>"<a href="http://java.sun.com/dtd/web-app_2_3.dtd"><u><font color=#0000ff>http://java.sun.com/dtd/web-app_2_3.dtd</font></u></a>"&gt;</p>
<p>&lt;web-app&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;servlet&gt;</p>
<p>&lt;servlet-name&gt;Sorry&lt;/servlet-name&gt;</p>
<p>&lt;servlet-class&gt;moreservlets.SorryServlet&lt;/servlet-class&gt;</p>
<p>&lt;/servlet&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;servlet-mapping&gt;</p>
<p>&lt;servlet-name&gt; Sorry &lt;/servlet-name&gt;</p>
<p>&lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;</p>
<p>&lt;/servlet-mapping&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;/web-app&gt;</p>
<p>程序清单5-6 SorryServlet.java</p>
<p>package moreservlets;</p>
<p>import java.io.*;</p>
<p>import javax.servlet.*;</p>
<p>import javax.servlet.http.*;</p>
<p>/** Simple servlet used to give error messages to</p>
<p>* users who try to access default servlet URLs</p>
<p>* (i.e., <a href="http://host/webAppPrefix/servlet/ServletName"><u><font color=#0000ff>http://host/webAppPrefix/servlet/ServletName</font></u></a>)</p>
<p>* in Web applications that have disabled this</p>
<p>* behavior.</p>
<p>* &lt;P&gt;</p>
<p>* Taken from More Servlets and JavaServer Pages</p>
<p>* from Prentice Hall and Sun Microsystems Press,</p>
<p>* <a href="http://www.moreservlets.com/"><u><font color=#0000ff>http://www.moreservlets.com/</font></u></a>.</p>
<p>* ? 2002 Marty Hall; may be freely used or adapted.</p>
<p>*/</p>
<p>public class SorryServlet extends HttpServlet {</p>
<p>public void doGet(HttpServletRequest request,</p>
<p>HttpServletResponse response)</p>
<p>throws ServletException, IOException {</p>
<p>response.setContentType("text/html");</p>
<p>PrintWriter out = response.getWriter();</p>
<p>String title = "Invoker Servlet Disabled.";</p>
<p>out.println(ServletUtilities.headWithTitle(title) +</p>
<p>"&lt;BODY BGCOLOR=\"#FDF5E6\"&gt;\n" +</p>
<p>"&lt;H2&gt;" + title + "&lt;/H2&gt;\n" +</p>
<p>"Sorry, access to servlets by means of\n" +</p>
<p>"URLs that begin with\n" +</p>
<p>"<a href="http://host/webAppPrefix/servlet/%20n"><u><font color=#0000ff>http://host/webAppPrefix/servlet/\n</font></u></a>" +</p>
<p>"has been disabled.\n" +</p>
<p>"&lt;/BODY&gt;&lt;/HTML&gt;");</p>
<p>}</p>
<p>public void doPost(HttpServletRequest request,</p>
<p>HttpServletResponse response)</p>
<p>throws ServletException, IOException {</p>
<p>doGet(request, response);</p>
<p>}</p>
<p>}</p>
<p>4.3 全局禁止激活器：Tomcat<br>Tomcat 4中用来关闭缺省URL的方法与Tomcat 3中所用的很不相同。下面介绍这两种方法：</p>
<p>4.3.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 禁止激活器： Tomcat 4Tomcat 4用与前面相同的方法关闭激活器servlet，即利用web.xml中的url-mapping元素进行关闭。不同之处在于Tomcat使用了放在 </p>
<p>install_dir/conf中的一个服务器专用的全局web.xml文件，而前面使用的是存放在每个Web应用的WEB-INF目录中的标准 web.xml文件。</p>
<p>因此，为了在Tomcat 4中关闭激活器servlet，只需在install_dir/conf/web.xml中简单地注释出/servlet/* URL映射项即可，如下所示：</p>
<p>&nbsp;</p>
<p>&lt;!--</p>
<p>&lt;servlet-mapping&gt;</p>
<p>&lt;servlet-name&gt;invoker&lt;/servlet-name&gt;</p>
<p>&lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;</p>
<p>&lt;/servlet-mapping&gt;</p>
<p>--&gt;</p>
<p>再次提醒，应该注意这个项是位于存放在install_dir/conf的Tomcat专用的web.xml文件中的，此文件不是存放在每个Web应用的WEB-INF目录中的标准web.xml。</p>
<p>4.3.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 禁止激活器：Tomcat3在Apache Tomcat的版本3中，通过在install_dir/conf/server.xml中注释出InvokerInterceptor项全局禁止缺省 servlet URL。例如，下面是禁止</p>
<p>使用缺省servlet URL的server.xml文件的一部分。</p>
<p>&lt;!--</p>
<p>&lt;RequsetInterceptor</p>
<p>className="org.apache.tomcat.request.InvokerInterceptor"</p>
<p>debug="0" prefix="/servlet/" /&gt;</p>
<p>--&gt;</p>
<p>5 初始化和预装载servlet与JSP页面<br>这里讨论控制servlet和JSP页面的启动行为的方法。特别是，说明了怎样分配初始化参数以及怎样更改服务器生存期中装载servlet和JSP页面的时刻。</p>
<p>5.1 分配servlet初始化参数<br>利用init-param元素向servlet提供初始化参数，init-param元素具有param-name和param-value子元素。例如，在下面的例子中，如果initServlet servlet是利用它的注册名</p>
<p>（InitTest）访问的，它将能够从其方法中调用getServletConfig(). getInitParameter(&#8221;param1&#8243;)获得&#8221;Value 1&#8243;，调用getServletConfig().getInitParameter(&#8221;param2&#8243;</p>
<p>)获得&#8221;2&#8243;。</p>
<p>&lt;servlet&gt;</p>
<p>&lt;servlet-name&gt;InitTest&lt;/servlet-name&gt;</p>
<p>&lt;servlet-class&gt;moreservlets.InitServlet&lt;/servlet-class&gt;</p>
<p>&lt;init-param&gt;</p>
<p>&lt;param-name&gt;param1&lt;/param-name&gt;</p>
<p>&lt;param-value&gt;value1&lt;/param-value&gt;</p>
<p>&lt;/init-param&gt;</p>
<p>&lt;init-param&gt;</p>
<p>&lt;param-name&gt;param2&lt;/param-name&gt;</p>
<p>&lt;param-value&gt;2&lt;/param-value&gt;</p>
<p>&lt;/init-param&gt;</p>
<p>&lt;/servlet&gt;</p>
<p>在涉及初始化参数时，有几点需要注意：</p>
<p>&#252;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回值。GetInitParameter的返回值总是一个String。因此，在前一个例子中，可对param2使用Integer.parseInt获得一个int。</p>
<p>&#252;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSP中的初始化。JSP页面使用jspInit而不是init。JSP页面还需要使用jsp-file元素代替servlet-class。</p>
<p>&#252;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 缺省URL。初始化参数只在通过它们的注册名或与它们注册名相关的定制URL模式访问Servlet时可以使用。因此，在这个例子中，param1和 param2初始化参数将能够在使用URL </p>
<p><a href="http://host/webAppPrefix/servlet/InitTest"><u><font color=#0000ff>http://host/webAppPrefix/servlet/InitTest</font></u></a> 时可用，但在使用URL <a href="http://host/webAppPrefix/servlet/myPackage.InitServlet"><u><font color=#0000ff>http://host/webAppPrefix/servlet/myPackage.InitServlet</font></u></a> 时不能使用。</p>
<p>例如，程序清单5-7给出一个名为InitServlet的简单servlet，它使用init方法设置firstName和emailAddress字段。程序清单5-8给出分配名称InitTest给servlet的web.xml文件。</p>
<p>程序清单5-7 InitServlet.java</p>
<p>package moreservlets;</p>
<p>import java.io.*;</p>
<p>import javax.servlet.*;</p>
<p>import javax.servlet.http.*;</p>
<p>/** Simple servlet used to illustrate servlet</p>
<p>* initialization parameters.</p>
<p>* &lt;P&gt;</p>
<p>* Taken from More Servlets and JavaServer Pages</p>
<p>* from Prentice Hall and Sun Microsystems Press,</p>
<p>* <a href="http://www.moreservlets.com/"><u><font color=#0000ff>http://www.moreservlets.com/</font></u></a>.</p>
<p>* ? 2002 Marty Hall; may be freely used or adapted.</p>
<p>*/</p>
<p>public class InitServlet extends HttpServlet {</p>
<p>private String firstName, emailAddress;</p>
<p>public void init() {</p>
<p>ServletConfig config = getServletConfig();</p>
<p>firstName = config.getInitParameter("firstName");</p>
<p>emailAddress = config.getInitParameter("emailAddress");</p>
<p>}</p>
<p>public void doGet(HttpServletRequest request,</p>
<p>HttpServletResponse response)</p>
<p>throws ServletException, IOException {</p>
<p>response.setContentType("text/html");</p>
<p>PrintWriter out = response.getWriter();</p>
<p>String uri = request.getRequestURI();</p>
<p>out.println(ServletUtilities.headWithTitle("Init Servlet") +</p>
<p>"&lt;BODY BGCOLOR=\"#FDF5E6\"&gt;\n" +</p>
<p>"&lt;H2&gt;Init Parameters:&lt;/H2&gt;\n" +</p>
<p>"&lt;UL&gt;\n" +</p>
<p>"&lt;LI&gt;First name: " + firstName + "\n" +</p>
<p>"&lt;LI&gt;Email address: " + emailAddress + "\n" +</p>
<p>"&lt;/UL&gt;\n" +</p>
<p>"&lt;/BODY&gt;&lt;/HTML&gt;");</p>
<p>}</p>
<p>}</p>
<p>程序清单5-8 web.xml（说明初始化参数的摘录）</p>
<p>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</p>
<p>&lt;!DOCTYPE web-app</p>
<p>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</p>
<p>"<a href="http://java.sun.com/dtd/web-app_2_3.dtd"><u><font color=#0000ff>http://java.sun.com/dtd/web-app_2_3.dtd</font></u></a>"&gt;</p>
<p>&lt;web-app&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;servlet&gt;</p>
<p>&lt;servlet-name&gt;InitTest&lt;/servlet-name&gt;</p>
<p>&lt;servlet-class&gt;moreservlets.InitServlet&lt;/servlet-class&gt;</p>
<p>&lt;init-param&gt;</p>
<p>&lt;param-name&gt;firstName&lt;/param-name&gt;</p>
<p>&lt;param-value&gt;Larry&lt;/param-value&gt;</p>
<p>&lt;/init-param&gt;</p>
<p>&lt;init-param&gt;</p>
<p>&lt;param-name&gt;emailAddress&lt;/param-name&gt;</p>
<p>&lt;param-value&gt;Ellison@Microsoft.com&lt;/param-value&gt;</p>
<p>&lt;/init-param&gt;</p>
<p>&lt;/servlet&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;/web-app&gt;</p>
<p>5.2 分配JSP初始化参数<br>给JSP页面提供初始化参数在三个方面不同于给servlet提供初始化参数。</p>
<p>1）使用jsp-file而不是servlet-class。因此，WEB-INF/web.xml文件的servlet元素如下所示：</p>
<p>&lt;servlet&gt;</p>
<p>&lt;servlet-name&gt;PageName&lt;/servlet-name&gt;</p>
<p>&lt;jsp-file&gt;/RealPage.jsp&lt;/jsp-file&gt;</p>
<p>&lt;init-param&gt;</p>
<p>&lt;param-name&gt;...&lt;/param-name&gt;</p>
<p>&lt;param-value&gt;...&lt;/param-value&gt;</p>
<p>&lt;/init-param&gt;</p>
<p>...</p>
<p>&lt;/servlet&gt;</p>
<p>2) 几乎总是分配一个明确的URL模式。对servlet，一般相应地使用以<a href="http://host/webAppPrefix/servlet/"><u><font color=#0000ff>http://host/webAppPrefix/servlet/</font></u></a> 开始的缺省URL。只需记住，使用注册名而不是原名称即可。这对于JSP</p>
<p>页面在技术上也是合法的。例如，在上面给出的例子中，可用URL <a href="http://host/webAppPrefix/servlet/PageName"><u><font color=#0000ff>http://host/webAppPrefix/servlet/PageName</font></u></a> 访问RealPage.jsp的对初始化参数具有访问权的版本。但在用于</p>
<p>JSP页面时，许多用户似乎不喜欢应用常规的servlet的URL。此外，如果 JSP页面位于服务器为其提供了目录清单的目录中（如，一个既没有index.html也没有index.jsp文件的目</p>
<p>录），则用户可能会连接到此 JSP页面，单击它，从而意外地激活未初始化的页面。因此，好的办法是使用url-pattern（5.3节）将JSP页面的原URL与注册的 servlet名相关联。</p>
<p>这样，客户机可使用JSP页面的普通名称，但仍然激活定制的版本。例如，给定来自项目1的servlet定义，可使用下面的 servlet-mapping定义：</p>
<p>&lt;servlet-mapping&gt;</p>
<p>&lt;servlet-name&gt;PageName&lt;/servlet-name&gt;</p>
<p>&lt;url-pattern&gt;/RealPage.jsp&lt;/url-pattern&gt;</p>
<p>&lt;/servlet-mapping&gt;</p>
<p>3）JSP页使用jspInit而不是init。自动从JSP页面建立的servlet或许已经使用了inti方法。因此，使用JSP声明提供一个init方法是不合法的，必须制定jspInit方法。</p>
<p>为了说明初始化JSP页面的过程，程序清单5-9给出了一个名为InitPage.jsp的JSP页面，它包含一个jspInit方法且放置于 deployDemo Web应用层次结构的顶层。一般，</p>
<p><a href="http://host/deployDemo/InitPage.jsp"><u><font color=#0000ff>http://host/deployDemo/InitPage.jsp</font></u></a> 形式的URL将激活此页面的不具有初始化参数访问权的版本，从而将对firstName和emailAddress变量显示null。但是， web.xml文件（程</p>
<p>序清单5-10）分配了一个注册名，然后将该注册名与URL模式/InitPage.jsp相关联。</p>
<p>程序清单5-9 InitPage.jsp</p>
<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt;</p>
<p>&lt;HTML&gt;</p>
<p>&lt;HEAD&gt;&lt;TITLE&gt;JSP Init Test&lt;/TITLE&gt;&lt;/HEAD&gt;</p>
<p>&lt;BODY BGCOLOR="#FDF5E6"&gt;</p>
<p>&lt;H2&gt;Init Parameters:&lt;/H2&gt;</p>
<p>&lt;UL&gt;</p>
<p>&lt;LI&gt;First name: &lt;%= firstName %&gt;</p>
<p>&lt;LI&gt;Email address: &lt;%= emailAddress %&gt;</p>
<p>&lt;/UL&gt;</p>
<p>&lt;/BODY&gt;&lt;/HTML&gt;<br></p>
<p><br>&lt;%!</p>
<p>private String firstName, emailAddress;</p>
<p>public void jspInit() {</p>
<p>ServletConfig config = getServletConfig();</p>
<p>firstName = config.getInitParameter("firstName");</p>
<p>emailAddress = config.getInitParameter("emailAddress");</p>
<p>}</p>
<p>%&gt;</p>
<p>程序清单5-10 web.xml（说明JSP页面的init参数的摘录）</p>
<p>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</p>
<p>&lt;!DOCTYPE web-app</p>
<p>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</p>
<p>"<a href="http://java.sun.com/dtd/web-app_2_3.dtd"><u><font color=#0000ff>http://java.sun.com/dtd/web-app_2_3.dtd</font></u></a>"&gt;</p>
<p>&nbsp;</p>
<p>&lt;web-app&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;servlet&gt;</p>
<p>&lt;servlet-name&gt;InitPage&lt;/servlet-name&gt;</p>
<p>&lt;jsp-file&gt;/InitPage.jsp&lt;/jsp-file&gt;</p>
<p>&lt;init-param&gt;</p>
<p>&lt;param-name&gt;firstName&lt;/param-name&gt;</p>
<p>&lt;param-value&gt;Bill&lt;/param-value&gt;</p>
<p>&lt;/init-param&gt;</p>
<p>&lt;init-param&gt;</p>
<p>&lt;param-name&gt;emailAddress&lt;/param-name&gt;</p>
<p>&lt;param-value&gt;gates@oracle.com&lt;/param-value&gt;</p>
<p>&lt;/init-param&gt;</p>
<p>&lt;/servlet&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;servlet-mapping&gt;</p>
<p>&lt;servlet-name&gt; InitPage&lt;/servlet-name&gt;</p>
<p>&lt;url-pattern&gt;/InitPage.jsp&lt;/url-pattern&gt;</p>
<p>&lt;/servlet-mapping&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;/web-app&gt;<br></p>
<p>5.3 提供应用范围内的初始化参数<br>一般，对单个地servlet或JSP页面分配初始化参数。指定的servlet或JSP页面利用ServletConfig的 getInitParameter方法读取这些参数。但是，在某些情形下，希望提供可由任</p>
<p>意servlet或JSP页面借助ServletContext 的getInitParameter方法读取的系统范围内的初始化参数。</p>
<p>可利用context-param元素声明这些系统范围内的初始化值。context-param元素应该包含param-name、param-value以及可选的description子元素，如下所示：</p>
<p>&lt;context-param&gt;</p>
<p>&lt;param-name&gt;support-email&lt;/param-name&gt;</p>
<p>&lt;param-value&gt;blackhole@mycompany.com&lt;/param-value&gt;</p>
<p>&lt;/context-param&gt;</p>
<p>可回忆一下，为了保证可移植性，web.xml内的元素必须以正确的次序声明。但这里应该注意，context-param元素必须出现任意与文档有关的元素（icon、display-name或</p>
<p>description）之后及filter、filter-mapping、listener或 servlet元素之前。</p>
<p>5.4 在服务器启动时装载servlet<br>假如servlet或JSP页面有一个要花很长时间执行的init （servlet）或jspInit（JSP）方法。例如，假如init或jspInit方法从某个数据库或ResourceBundle查找产量。这种情况下</p>
<p>，在第一个客户机请求时装载servlet的缺省行为将对第一个客户机产生较长时间的延迟。因此，可利用servlet的load-on- startup元素规定服务器在第一次启动时装载servlet。</p>
<p>下面是一个例子。</p>
<p>&lt;servlet&gt;</p>
<p>&lt;servlet-name&gt; &#8230; &lt;/servlet-name&gt;</p>
<p>&lt;servlet-class&gt; &#8230; &lt;/servlet-class&gt; &lt;!-- Or jsp-file --&gt;</p>
<p>&lt;load-on-startup/&gt;</p>
<p>&lt;/servlet&gt;</p>
<p>可以为此元素体提供一个整数而不是使用一个空的load-on-startup。想法是服务器应该在装载较大数目的servlet或JSP页面之前装载较少数目的servlet或JSP页面。例如，下面的</p>
<p>servlet项（放置在Web应用的WEB-INF目录下的web.xml文件中的web-app元素内）将指示服务器首先装载和初始化SearchServlet，然后装载和初始化由位于Web应用的result目录中</p>
<p>的index.jsp文件产生的 servlet。</p>
<p>&lt;servlet&gt;</p>
<p>&lt;servlet-name&gt;Search&lt;/servlet-name&gt;</p>
<p>&lt;servlet-class&gt;myPackage.SearchServlet&lt;/servlet-class&gt; &lt;!-- Or jsp-file --&gt;</p>
<p>&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;</p>
<p>&lt;/servlet&gt;</p>
<p>&lt;servlet&gt;</p>
<p>&lt;servlet-name&gt;Results&lt;/servlet-name&gt;</p>
<p>&lt;servlet-class&gt;/results/index.jsp&lt;/servlet-class&gt; &lt;!-- Or jsp-file --&gt;</p>
<p>&lt;load-on-startup&gt;2&lt;/load-on-startup&gt;</p>
<p>&lt;/servlet&gt;</p>
<p>6 声明过滤器<br>servlet版本2.3引入了过滤器的概念。虽然所有支持servlet API版本2.3的服务器都支持过滤器，但为了使用与过滤器有关的元素，必须在web.xml中使用版本2.3的DTD。</p>
<p>过滤器可截取和修改进入一个servlet或JSP页面的请求或从一个servlet或JSP页面发出的相应。在执行一个servlet或JSP页面之前，必须执行第一个相关的过滤器的doFilter方法</p>
<p>。在该过滤器对其FilterChain对象调用doFilter时，执行链中的下一个过滤器。如果没有其他过滤器，servlet或JSP页面被执行。过滤器具有对到来的ServletRequest对象的全部</p>
<p>访问权，因此，它们可以查看客户机名、查找到来的cookie等。为了访问servlet或JSP页面的输出，过滤器可将响应对象包裹在一个替身对象（stand-in object）中，比方说把输</p>
<p>出累加到一个缓冲区。在调用FilterChain对象的doFilter方法之后，过滤器可检查缓冲区，如有必要，就对它进行修改，然后传送到客户机。</p>
<p>例如，程序清单5-11帝国难以了一个简单的过滤器，只要访问相关的servlet或JSP页面，它就截取请求并在标准输出上打印一个报告（开发过程中在桌面系统上运行时，大多数服</p>
<p>务器都可以使用这个过滤器）。</p>
<p>程序清单5-11 ReportFilter.java</p>
<p>package moreservlets;</p>
<p>import java.io.*;</p>
<p>import javax.servlet.*;</p>
<p>import javax.servlet.http.*;</p>
<p>import java.util.*;</p>
<p>/** Simple filter that prints a report on the standard output</p>
<p>* whenever the associated servlet or JSP page is accessed.</p>
<p>* &lt;P&gt;</p>
<p>* Taken from More Servlets and JavaServer Pages</p>
<p>* from Prentice Hall and Sun Microsystems Press,</p>
<p>* <a href="http://www.moreservlets.com/"><u><font color=#0000ff>http://www.moreservlets.com/</font></u></a>.</p>
<p>* ? 2002 Marty Hall; may be freely used or adapted.</p>
<p>*/</p>
<p>public class ReportFilter implements Filter {</p>
<p>public void doFilter(ServletRequest request,</p>
<p>ServletResponse response,</p>
<p>FilterChain chain)</p>
<p>throws ServletException, IOException {</p>
<p>HttpServletRequest req = (HttpServletRequest)request;</p>
<p>System.out.println(req.getRemoteHost() +</p>
<p>" tried to access " +</p>
<p>req.getRequestURL() +</p>
<p>" on " + new Date() + ".");</p>
<p>chain.doFilter(request,response);</p>
<p>}</p>
<p>public void init(FilterConfig config)</p>
<p>throws ServletException {</p>
<p>}</p>
<p>public void destroy() {}</p>
<p>}</p>
<p>一旦建立了一个过滤器，可以在web.xml中利用filter元素以及filter-name（任意名称）、file-class（完全限定的类名）和（可选的）init-params子元素声明它。请注意，元素</p>
<p>在web.xml的web-app元素中出现的次序不是任意的；允许服务器（但不是必需的）强制所需的次序，并且实际中有些服务器也是这样做的。但这里要注意，所有filter元素必须出</p>
<p>现在任意filter-mapping元素之前， filter-mapping元素又必须出现在所有servlet或servlet-mapping元素之前。</p>
<p>例如，给定上述的ReportFilter类，可在web.xml中作出下面的filter声明。它把名称Reporter与实际的类ReportFilter（位于moreservlets程序包中）相关联。</p>
<p>&nbsp;</p>
<p>&lt;filter&gt;</p>
<p>&lt;filter-name&gt;Reporter&lt;/filter-name&gt;</p>
<p>&lt;filter-class&gt;moresevlets.ReportFilter&lt;/filter-class&gt;</p>
<p>&lt;/filter&gt;</p>
<p>一旦命名了一个过滤器，可利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。关于此项工作有两种选择。</p>
<p>首先，可使用filter-name和servlet-name子元素把此过滤器与一个特定的servlet名（此servlet名必须稍后在相同的 web.xml文件中使用servlet元素声明）关联。例如，下面的</p>
<p>程序片断指示系统只要利用一个定制的URL访问名为SomeServletName 的servlet或JSP页面，就运行名为Reporter的过滤器。</p>
<p>&lt;filter-mapping&gt;</p>
<p>&lt;filter-name&gt;Reporter&lt;/filter-name&gt;</p>
<p>&lt;servlet-name&gt;SomeServletName&lt;/servlet-name&gt;</p>
<p>&lt;/filter-mapping&gt;</p>
<p>其次，可利用filter-name和url-pattern子元素将过滤器与一组servlet、JSP页面或静态内容相关联。例如，相面的程序片段指示系统只要访问Web应用中的任意URL，就运行名为</p>
<p>Reporter的过滤器。</p>
<p>&lt;filter-mapping&gt;</p>
<p>&lt;filter-name&gt;Reporter&lt;/filter-name&gt;</p>
<p>&lt;url-pattern&gt;/*&lt;/url-pattern&gt;</p>
<p>&lt;/filter-mapping&gt;</p>
<p>例如，程序清单5-12给出了将ReportFilter过滤器与名为PageName的servlet相关联的web.xml文件的一部分。名字 PageName依次又与一个名为TestPage.jsp的JSP页面以及以模式</p>
<p>http: //host/webAppPrefix/UrlTest2/ 开头的URL相关联。TestPage.jsp的源代码已经JSP页面命名的谈论在前面的3节&#8221;分配名称和定制的URL&#8221;中给出。事实上，程序清单5- 12</p>
<p>中的servlet和servlet-name项从该节原封不动地拿过来的。给定这些web.xml项，可看到下面的标准输出形式的调试报告（换行是为了容易阅读）。</p>
<p>audit.irs.gov tried to access</p>
<p>mycompany.com/deployDemo/UrlTest2/business/tax-plan.html</p>
<p>on Tue Dec 25 13:12:29 EDT 2001.</p>
<p>程序清单5-12 Web.xml（说明filter用法的摘录）</p>
<p>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</p>
<p>&lt;!DOCTYPE web-app</p>
<p>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</p>
<p>"<a href="http://java.sun.com/dtd/web-app_2_3.dtd"><u><font color=#0000ff>http://java.sun.com/dtd/web-app_2_3.dtd</font></u></a>"&gt;</p>
<p>&lt;web-app&gt;</p>
<p>&lt;filter&gt;</p>
<p>&lt;filter-name&gt;Reporter&lt;/filter-name&gt;</p>
<p>&lt;filter-class&gt;moresevlets.ReportFilter&lt;/filter-class&gt;</p>
<p>&lt;/filter&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;filter-mapping&gt;</p>
<p>&lt;filter-name&gt;Reporter&lt;/filter-name&gt;</p>
<p>&lt;servlet-name&gt;PageName&lt;/servlet-name&gt;</p>
<p>&lt;/filter-mapping&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;servlet&gt;</p>
<p>&lt;servlet-name&gt;PageName&lt;/servlet-name&gt;</p>
<p>&lt;jsp-file&gt;/RealPage.jsp&lt;/jsp-file&gt;</p>
<p>&lt;/servlet&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;servlet-mapping&gt;</p>
<p>&lt;servlet-name&gt; PageName &lt;/servlet-name&gt;</p>
<p>&lt;url-pattern&gt;/UrlTest2/*&lt;/url-pattern&gt;</p>
<p>&lt;/servlet-mapping&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;/web-app&gt;</p>
<p>7 指定欢迎页<br>假如用户提供了一个像http: //host/webAppPrefix/directoryName/ 这样的包含一个目录名但没有包含文件名的URL，会发生什么事情呢？用户能得到一个目录表？一个错误？还</p>
<p>是标准文件的内容？如果得到标准文件内容，是 index.html、index.jsp、default.html、default.htm或别的什么东西呢？</p>
<p>Welcome-file-list 元素及其辅助的welcome-file元素解决了这个模糊的问题。例如，下面的web.xml项指出，如果一个URL给出一个目录名但未给出文件名，服务器应该首先试用</p>
<p>index.jsp，然后再试用index.html。如果两者都没有找到，则结果有赖于所用的服务器（如一个目录列表）。</p>
<p>&lt;welcome-file-list&gt;</p>
<p>&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;</p>
<p>&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;</p>
<p>&lt;/welcome-file-list&gt;</p>
<p>虽然许多服务器缺省遵循这种行为，但不一定必须这样。因此，明确地使用welcom-file-list保证可移植性是一种良好的习惯</p>
<p><br>8 指定处理错误的页面<br>现在我了解到，你在开发servlet和JSP页面时从不会犯错误，而且你的所有页面是那样的清晰，一般的程序员都不会被它们的搞糊涂。但是，是人总会犯错误的，用户可能会提供</p>
<p>不合规定的参数，使用不正确的URL或者不能提供必需的表单字段值。除此之外，其它开发人员可能不那么细心，他们应该有些工具来克服自己的不足。</p>
<p>error-page元素就是用来克服这些问题的。它有两个可能的子元素，分别是：error-code和exception- type。第一个子元素error-code指出在给定的HTTP错误代码出现时使用的</p>
<p>URL。第二个子元素excpetion-type指出在出现某个给定的Java异常但未捕捉到时使用的URL。error-code和exception-type都利用location元素指出相应的URL。此 URL必须以/开</p>
<p>始。location所指出的位置处的页面可通过查找HttpServletRequest对象的两个专门的属性来访问关于错误的信息，这两个属性分别是：javax.servlet.error.status_code和</p>
<p>javax.servlet.error.message。</p>
<p>可回忆一下，在web.xml内以正确的次序声明web-app的子元素很重要。这里只要记住，error-page出现在web.xml文件的末尾附近，servlet、servlet-name和welcome-file-list之</p>
<p>后即可。</p>
<p>9 error-code元素<br>为了更好地了解error-code元素的值，可考虑一下如果不正确地输入文件名，大多数站点会作出什么反映。这样做一般会出现一个404错误信息，它表示不能找到该文件，但几乎没</p>
<p>提供更多有用的信息。另一方面，可以试一下在<a href="http://www.microsoft.com/"><u><font color=#0000ff>www.microsoft.com</font></u></a>、<a href="http://www.ibm.com/"><u><font color=#0000ff>www.ibm.com</font></u></a> 处或者特别是在<a href="http://www.bea.com/"><u><font color=#0000ff>www.bea.com</font></u></a> 处输出未知的文件名。这是会得出有用的消息，这些消息提供可选</p>
<p>择的位置，以便查找感兴趣的页面。提供这样有用的错误页面对于Web应用来说是很有价值得。事实上rm-error-page子元素）。由form-login-page给出的HTML表单必须具有一个</p>
<p>j_security_check的 ACTION属性、一个名为j_username的用户名文本字段以及一个名为j_password的口令字段。</p>
<p>例如，程序清单5-19指示服务器使用基于表单的验证。Web应用的顶层目录中的一个名为login.jsp的页面将收集用户名和口令，并且失败的登陆将由相同目录中名为login-</p>
<p>error.jsp的页面报告。</p>
<p>程序清单5-19 web.xml（说明login-config的摘录）</p>
<p>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</p>
<p>&lt;!DOCTYPE web-app</p>
<p>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</p>
<p>"<a href="http://java.sun.com/dtd/web-app_2_3.dtd"><u><font color=#0000ff>http://java.sun.com/dtd/web-app_2_3.dtd</font></u></a>"&gt;</p>
<p>&nbsp;</p>
<p>&lt;web-app&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;security-constraint&gt; ... &lt;/security-constraint&gt;</p>
<p>&lt;login-config&gt;</p>
<p>&lt;auth-method&gt; FORM &lt;/auth-method&gt;</p>
<p>&lt;form-login-config&gt;</p>
<p>&lt;form-login-page&gt;/login.jsp&lt;/form-login-page&gt;</p>
<p>&lt;form-error-page&gt;/login-error.jsp&lt;/form-error-page&gt;</p>
<p>&lt;/form-login-config&gt;</p>
<p>&lt;/login-config&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;/web-app&gt;</p>
<p>9.1 限制对Web资源的访问<br>现在，可以指示服务器使用何种验证方法了。&#8221;了不起，&#8221;你说道，&#8221;除非我能指定一个来收到保护的 URL，否则没有多大用处。&#8221;没错。指出这些URL并说明他们应该得到何种保</p>
<p>护正是security-constriaint元素的用途。此元素在 web.xml中应该出现在login-config的紧前面。它包含是个可能的子元素，分别是：web-resource-collection、 auth-</p>
<p>constraint、user-data-constraint和display-name。下面各小节对它们进行介绍。</p>
<p>&#252;&nbsp;&nbsp;&nbsp;&nbsp; web-resource-collection</p>
<p>此元素确定应该保护的资源。所有security-constraint元素都必须包含至少一个web-resource-collection项。此元素由一个给出任意标识名称的web-resource-name元素、一个确</p>
<p>定应该保护的URL的url-pattern元素、一个指出此保护所适用的 HTTP命令（GET、POST等，缺省为所有方法）的http-method元素和一个提供资料的可选description元素组成。例</p>
<p>如，下面的 Web-resource-collection项（在security-constratint元素内）指出Web应用的proprietary目录中所有文档应该受到保护。</p>
<p>&nbsp;</p>
<p>&lt;security-constraint&gt;</p>
<p>&lt;web-resource-coolection&gt;</p>
<p>&lt;web-resource-name&gt;Proprietary&lt;/web-resource-name&gt;</p>
<p>&lt;url-pattern&gt;/propritary/*&lt;/url-pattern&gt;</p>
<p>&lt;/web-resource-coolection&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;/security-constraint&gt;</p>
<p>重要的是应该注意到，url-pattern仅适用于直接访问这些资源的客户机。特别是，它不适合于通过MVC体系结构利用 RequestDispatcher来访问的页面，或者不适合于利用类似</p>
<p>jsp:forward的手段来访问的页面。这种不匀称如果利用得当的话很有好处。例如，servlet可利用MVC体系结构查找数据，把它放到bean中，发送请求到从bean中提取数据的JSP页</p>
<p>面并显示它。我们希望保证决不直接访问受保护的JSP页面，而只是通过建立该页面将使用的bean的servlet来访问它。url-pattern和auth-contraint元素可通过声明不允许任何用</p>
<p>户直接访问JSP页面来提供这种保证。但是，这种不匀称的行为可能让开发人员放松警惕，使他们偶然对应受保护的资源提供不受限制的访问。</p>
<p>&#252;&nbsp;&nbsp;&nbsp;&nbsp; auth-constraint</p>
<p>尽管web-resource-collention元素质出了哪些URL应该受到保护，但是auth-constraint元素却指出哪些用户应该具有受保护资源的访问权。此元素应该包含一个或多个标识具有访</p>
<p>问权限的用户类别role- name元素，以及包含（可选）一个描述角色的description元素。例如，下面web.xml中的security-constraint元素部门规定只有指定为Administrator或</p>
<p>Big Kahuna（或两者）的用户具有指定资源的访问权。</p>
<p>&nbsp;</p>
<p>&lt;security-constraint&gt;</p>
<p>&lt;web-resource-coolection&gt; ... &lt;/web-resource-coolection&gt;</p>
<p>&lt;auth-constraint&gt;</p>
<p>&lt;role-name&gt;administrator&lt;/role-name&gt;</p>
<p>&lt;role-name&gt;kahuna&lt;/role-name&gt;</p>
<p>&lt;/auth-constraint&gt;</p>
<p>&lt;/security-constraint&gt;</p>
<p>重要的是认识到，到此为止，这个过程的可移植部分结束了。服务器怎样确定哪些用户处于任何角色以及它怎样存放用户的口令，完全有赖于具体的系统。</p>
<p>例如，Tomcat使用install_dir/conf/tomcat-users.xml将用户名与角色名和口令相关联，正如下面例子中所示，它指出用户joe（口令bigshot）和jane（口令enaj）属于</p>
<p>administrator和kahuna角色。</p>
<p>&nbsp;</p>
<p>&lt;tomcat-users&gt;</p>
<p>&lt;user name="joe" password="bigshot" roles="administrator,kahuna" /&gt;</p>
<p>&lt;user name="jane" password="enaj" roles="kahuna" /&gt;</p>
<p>&lt;/tomcat-users&gt;</p>
<p>&#252;&nbsp;&nbsp;&nbsp;&nbsp; user-data-constraint</p>
<p>这个可选的元素指出在访问相关资源时使用任何传输层保护。它必须包含一个transport-guarantee子元素（合法值为NONE、 INTEGRAL或CONFIDENTIAL），并且可选地包含一个</p>
<p>description元素。transport-guarantee为NONE值将对所用的通讯协议不加限制。INTEGRAL值表示数据必须以一种防止截取它的人阅读它的方式传送。虽然原理上（并且在未来的</p>
<p>HTTP版本中），在 INTEGRAL和CONFIDENTIAL之间可能会有差别，但在当前实践中，他们都只是简单地要求用SSL。例如，下面指示服务器只允许对相关资源做 HTTPS连接：</p>
<p>&nbsp;</p>
<p>&lt;security-constraint&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;user-data-constraint&gt;</p>
<p>&lt;transport-guarantee&gt;CONFIDENTIAL&lt;/transport-guarantee&gt;</p>
<p>&lt;/user-data-constraint&gt;</p>
<p>&lt;/security-constraint&gt;</p>
<p>&#252;&nbsp;&nbsp;&nbsp;&nbsp; display-name</p>
<p>security-constraint的这个很少使用的子元素给予可能由GUI工具使用的安全约束项一个名称。</p>
<p>9.2 分配角色名<br>迄今为止，讨论已经集中到完全由容器（服务器）处理的安全问题之上了。但servlet以及JSP页面也能够处理它们自己的安全问题。</p>
<p>例如，容器可能允许用户从bigwig或bigcheese角色访问一个显示主管人员额外紧贴的页面，但只允许bigwig用户修改此页面的参数。完成这种更细致的控制的一种常见方法是调用</p>
<p>HttpServletRequset的isUserInRole方法，并据此修改访问。</p>
<p>Servlet的 security-role-ref子元素提供出现在服务器专用口令文件中的安全角色名的一个别名。例如，假如编写了一个调用 request.isUserInRole（&#8221;boss&#8221;）的servlet，但</p>
<p>后来该servlet被用在了一个其口令文件调用角色manager而不是boss的服务器中。下面的程序段使该servlet能够使用这两个名称中的任何一个。</p>
<p>&nbsp;</p>
<p>&lt;servlet&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;security-role-ref&gt;</p>
<p>&lt;role-name&gt;boss&lt;/role-name&gt; &lt;!-- New alias --&gt;</p>
<p>&lt;role-link&gt;manager&lt;/role-link&gt; &lt;!-- Real name --&gt;</p>
<p>&lt;/security-role-ref&gt;</p>
<p>&lt;/servlet&gt;</p>
<p>也可以在web-app内利用security-role元素提供将出现在role-name元素中的所有安全角色的一个全局列表。分别地生命角色使高级IDE容易处理安全信息。</p>
<p>&nbsp;</p>
<p>10控制会话超时<br>如果某个会话在一定的时间内未被访问，服务器可把它扔掉以节约内存。可利用HttpSession的setMaxInactiveInterval方法直接设置个别会话对象的超时值。如果不采用这种方法</p>
<p>，则缺省的超时值由具体的服务器决定。但可利用session-config和session- timeout元素来给出一个适用于所有服务器的明确的超时值。超时值的单位为分钟，因此，下面的例</p>
<p>子设置缺省会话超时值为三个小时（180分钟）。</p>
<p>&lt;session-config&gt;</p>
<p>&lt;session-timeout&gt;180&lt;/session-timeout&gt;</p>
<p>&lt;/session-config&gt;</p>
<p>11Web应用的文档化<br>越来越多的开发环境开始提供servlet和JSP的直接支持。例子有Borland Jbuilder Enterprise Edition、Macromedia UltraDev、Allaire JRun Studio（写此文时，已被</p>
<p>Macromedia收购）以及IBM VisuaAge for Java等。</p>
<p>大量的web.xml元素不仅是为服务器设计的，而且还是为可视开发环境设计的。它们包括icon、display-name和discription等。</p>
<p>可回忆一下，在web.xml内以适当地次序声明web-app子元素很重要。不过，这里只要记住icon、display-name和description是web.xml的web-app元素内的前三个合法元素即可。</p>
<p>&#252;&nbsp;&nbsp;&nbsp;&nbsp; icon</p>
<p>icon元素指出GUI工具可用来代表Web应用的一个和两个图像文件。可利用small-icon元素指定一幅16 x 16的GIF或JPEG图像，用large-icon元素指定一幅32 x 32的图像。下面举一</p>
<p>个例子：</p>
<p>&nbsp;</p>
<p>&lt;icon&gt;</p>
<p>&lt;small-icon&gt;/images/small-book.gif&lt;/small-icon&gt;</p>
<p>&lt;large-icon&gt;/images/tome.jpg&lt;/large-icon&gt;</p>
<p>&lt;/icon&gt;</p>
<p>&#252;&nbsp;&nbsp;&nbsp;&nbsp; display-name</p>
<p>display-name元素提供GUI工具可能会用来标记此Web应用的一个名称。下面是个例子。</p>
<p>&nbsp;</p>
<p>&lt;display-name&gt;Rare Books&lt;/display-name&gt;</p>
<p>&nbsp;</p>
<p>&#252;&nbsp;&nbsp;&nbsp;&nbsp; description</p>
<p>description元素提供解释性文本，如下所示：</p>
<p>&nbsp;</p>
<p>&lt;description&gt;</p>
<p>This Web application represents the store developed for</p>
<p>rare-books.com, an online bookstore specializing in rare</p>
<p>and limited-edition books.</p>
<p>&lt;/description&gt;</p>
<p>12关联文件与MIME类型<br>服务器一般都具有一种让Web站点管理员将文件扩展名与媒体相关联的方法。例如，将会自动给予名为mom.jpg的文件一个image/jpeg的MIME 类型。但是，假如你的Web应用具有几</p>
<p>个不寻常的文件，你希望保证它们在发送到客户机时分配为某种MIME类型。mime-mapping元素（具有 extension和mime-type子元素）可提供这种保证。例如，下面的代码指示服务</p>
<p>器将application/x-fubar的MIME类型分配给所有以.foo结尾的文件。</p>
<p>&lt;mime-mapping&gt;</p>
<p>&lt;extension&gt;foo&lt;/extension&gt;</p>
<p>&lt;mime-type&gt;application/x-fubar&lt;/mime-type&gt;</p>
<p>&lt;/mime-mapping&gt;</p>
<p>或许，你的Web应用希望重载（override）标准的映射。例如，下面的代码将告诉服务器在发送到客户机时指定.ps文件作为纯文本（text/plain）而不是作为PostScript</p>
<p>（application/postscript）。</p>
<p>&lt;mime-mapping&gt;</p>
<p>&lt;extension&gt;ps&lt;/extension&gt;</p>
<p>&lt;mime-type&gt;application/postscript&lt;/mime-type&gt;</p>
<p>&lt;/mime-mapping&gt;</p>
<p>13定位TLD<br>JSP taglib元素具有一个必要的uri属性，它给出一个TLD（Tag Library Descriptor）文件相对于Web应用的根的位置。TLD文件的实际名称在发布新的标签库版本时可能会改变，</p>
<p>但我们希望避免更改所有现有JSP页面。此外，可能还希望使用保持taglib元素的简练性的一个简短的uri。这就是部署描述符文件的taglib元素派用场的所在了。Taglib包含两个</p>
<p>子元素：taglib-uri和taglib-location。taglib-uri元素应该与用于JSP taglib元素的uri属性的东西相匹配。Taglib-location元素给出TLD文件的实际位置。例如，假如你将文</p>
<p>件chart-tags- 1.3beta.tld放在WebApp/WEB-INF/tlds中。现在，假如web.xml在web-app元素内包含下列内容。</p>
<p>&lt;taglib&gt;</p>
<p>&lt;taglib-uri&gt;/charts.tld&lt;/taglib-uri&gt;</p>
<p>&lt;taglib-location&gt;</p>
<p>/WEB-INF/tlds/chart-tags-1.3beta.tld</p>
<p>&lt;/taglib-location&gt;</p>
<p>&lt;/taglib&gt;</p>
<p>给出这个说明后，JSP页面可通过下面的简化形式使用标签库。</p>
<p>&lt;%@ taglib uri="/charts.tld" prefix="somePrefix" %&gt;</p>
<p>14指定应用事件监听程序<br>应用事件监听器程序是建立或修改servlet环境或会话对象时通知的类。它们是servlet规范的版本2.3中的新内容。这里只简单地说明用来向Web应用注册一个监听程序的web.xml的</p>
<p>用法。</p>
<p>注册一个监听程序涉及在web.xml的web-app元素内放置一个listener元素。在listener元素内，listener-class元素列出监听程序的完整的限定类名，如下所示：</p>
<p>&lt;listener&gt;</p>
<p>&lt;listener-class&gt;package.ListenerClass&lt;/listener-class&gt;</p>
<p>&lt;/listener&gt;</p>
<p>虽然listener元素的结构很简单，但请不要忘记，必须正确地给出web-app元素内的子元素的次序。listener元素位于所有的servlet 元素之前以及所有filter-mapping元素之后。</p>
<p>此外，因为应用生存期监听程序是serlvet规范的2.3版本中的新内容，所以必须使用 web.xml DTD的2.3版本，而不是2.2版本。</p>
<p>例如，程序清单5-20给出一个名为ContextReporter的简单的监听程序，只要Web应用的Servlet-Context建立（如装载Web应用）或消除（如服务器关闭）时，它就在标准输出上显</p>
<p>示一条消息。程序清单5-21给出此监听程序注册所需要的web.xml文件的一部分。</p>
<p>程序清单5-20 ContextReporterjava</p>
<p>package moreservlets;</p>
<p>import javax.servlet.*;</p>
<p>import java.util.*;</p>
<p>/** Simple listener that prints a report on the standard output</p>
<p>* when the ServletContext is created or destroyed.</p>
<p>* &lt;P&gt;</p>
<p>* Taken from More Servlets and JavaServer Pages</p>
<p>* from Prentice Hall and Sun Microsystems Press,</p>
<p>* <a href="http://www.moreservlets.com/"><u><font color=#0000ff>http://www.moreservlets.com/</font></u></a>.</p>
<p>* ? 2002 Marty Hall; may be freely used or adapted.</p>
<p>*/</p>
<p>public class ContextReporter implements ServletContextListener {</p>
<p>public void contextInitialized(ServletContextEvent event) {</p>
<p>System.out.println("Context created on " +</p>
<p>new Date() + ".");</p>
<p>}</p>
<p>&nbsp;</p>
<p>public void contextDestroyed(ServletContextEvent event) {</p>
<p>System.out.println("Context destroyed on " +</p>
<p>new Date() + ".");</p>
<p>}</p>
<p>}</p>
<p>&nbsp;</p>
<p>程序清单5-21 web.xml（声明一个监听程序的摘录）</p>
<p>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</p>
<p>&lt;!DOCTYPE web-app</p>
<p>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</p>
<p>"<a href="http://java.sun.com/dtd/web-app_2_3.dtd"><u><font color=#0000ff>http://java.sun.com/dtd/web-app_2_3.dtd</font></u></a>"&gt;</p>
<p>&nbsp;</p>
<p>&lt;web-app&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;filter-mapping&gt; &#8230; &lt;/filter-mapping&gt;</p>
<p>&lt;listener&gt;</p>
<p>&lt;listener-class&gt;package.ListenerClass&lt;/listener-class&gt;</p>
<p>&lt;/listener&gt;</p>
<p>&lt;servlet&gt; ... &lt;/servlet&gt;</p>
<p>&lt;!-- ... --&gt;</p>
<p>&lt;/web-app&gt;</p>
<p>15J2EE元素<br>本节描述用作J2EE环境组成部分的Web应用的web.xml元素。这里将提供一个简明的介绍，详细内容可以参阅<a href="http://java.sun.com/j2ee/j2ee-1_3-fr-spec.pdf"><u><font color=#0000ff>http://java.sun.com/j2ee/j2ee-1_3-fr-spec.pdf</font></u></a>的Java 2 Plantform </p>
<p>Enterprise Edition版本1.3规范的第5章。</p>
<p>15.1 distributable<br>distributable 元素指出，Web应用是以这样的方式编程的：即，支持集群的服务器可安全地在多个服务器上分布Web应用。例如，一个可分布的应用必须只使用 Serializable对象</p>
<p>作为其HttpSession对象的属性，而且必须避免用实例变量（字段）来实现持续性。distributable元素直接出现在discription元素之后，并且不包含子元素或数据，它只是一个如</p>
<p>下的标志。</p>
<p>&lt;distributable /&gt;</p>
<p>15.2 resource-env-ref<br>resource -env-ref元素声明一个与某个资源有关的管理对象。此元素由一个可选的description元素、一个resource-env-ref- name元素（一个相对于java:comp/env环境的JNDI名</p>
<p>）以及一个resource-env-type元素（指定资源类型的完全限定的类），如下所示：</p>
<p>&lt;resource-env-ref&gt;</p>
<p>&lt;resource-env-ref-name&gt;</p>
<p>jms/StockQueue</p>
<p>&lt;/resource-env-ref-name&gt;</p>
<p>&lt;resource-env-ref-type&gt;</p>
<p>javax.jms.Queue</p>
<p>&lt;/resource-env-ref-type&gt;</p>
<p>&lt;/resource-env-ref&gt;</p>
<p>15.3 env-entry<br>env -entry元素声明Web应用的环境项。它由一个可选的description元素、一个env-entry-name元素（一个相对于java: comp/env环境JNDI名）、一个env-entry-value元素（项值</p>
<p>）以及一个env-entry-type元素（java.lang程序包中一个类型的完全限定类名，java.lang.Boolean、java.lang.String等）组成。下面是一个例子：</p>
<p>&lt;env-entry&gt;</p>
<p>&lt;env-entry-name&gt;minAmout&lt;/env-entry-name&gt;</p>
<p>&lt;env-entry-value&gt;100.00&lt;/env-entry-value&gt;</p>
<p>&lt;env-entry-type&gt;minAmout&lt;/env-entry-type&gt;</p>
<p>&lt;/env-entry&gt;</p>
<p>15.4 ejb-ref<br>ejb -ref元素声明对一个EJB的主目录的应用。它由一个可选的description元素、一个ejb-ref-name元素（相对于java: comp/env的EJB应用）、一个ejb-ref-type元素（bean的类</p>
<p>型，Entity或Session）、一个home元素（bean的主目录接口的完全限定名）、一个remote元素（bean的远程接口的完全限定名）以及一个可选的ejb-link元素（当前bean链接的另</p>
<p>一个 bean的名称）组成。</p>
<p>15.5 ejb-local-ref<br>ejb-local-ref元素声明一个EJB的本地主目录的引用。除了用local-home代替home外，此元素具有与ejb-ref元素相同的属性并以相同的方式使用</p>
 <img src ="http://www.cnitblog.com/wufajiaru/aggbug/49525.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/wufajiaru/" target="_blank">巴西木</a> 2008-09-25 13:58 <a href="http://www.cnitblog.com/wufajiaru/archive/2008/09/25/49525.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何指定tomcat中session过期时间并在失效后，转移到另一个页面？</title><link>http://www.cnitblog.com/wufajiaru/archive/2008/09/24/49507.html</link><dc:creator>巴西木</dc:creator><author>巴西木</author><pubDate>Wed, 24 Sep 2008 08:28:00 GMT</pubDate><guid>http://www.cnitblog.com/wufajiaru/archive/2008/09/24/49507.html</guid><wfw:comment>http://www.cnitblog.com/wufajiaru/comments/49507.html</wfw:comment><comments>http://www.cnitblog.com/wufajiaru/archive/2008/09/24/49507.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/wufajiaru/comments/commentRss/49507.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/wufajiaru/services/trackbacks/49507.html</trackback:ping><description><![CDATA[<div class=cnt>原文： http://rainbow686.javaeye.com/blog/98123<br><br>如何指定tomcat中session过期时间<br><br>1. 在server.xml中定义context时采用如下定义：
<div class=code_title>xml 代码</div>
<div class=dp-highlighter>
<ol class=dp-xml>
    <li class=alt><span><span class=tag>&lt;</span><span class=tag-name>Context</span><span> </span><span class=attribute>path</span><span>=</span><span class=attribute-value>"/livsorder"</span><span> </span><span class=attribute>docBase</span><span>=</span><span class=attribute-value>"/home/httpd/html/livsorder"</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span>
    <li><span>　　</span><span class=attribute>defaultSessionTimeOut</span><span>=</span><span class=attribute-value>"3600"</span><span> </span><span class=attribute>isWARExpanded</span><span>=</span><span class=attribute-value>"true"</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=alt><span>　　</span><span class=attribute>isWARValidated</span><span>=</span><span class=attribute-value>"false"</span><span> </span><span class=attribute>isInvokerEnabled</span><span>=</span><span class=attribute-value>"true"</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>　　</span><span class=attribute>isWorkDirPersistent</span><span>=</span><span class=attribute-value>"false"</span><span class=tag>/&gt;</span><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>2. 在web.xml中通过参数指定：</p>
<div class=code_title>xml 代码</div>
<div class=dp-highlighter>
<ol class=dp-xml>
    <li class=alt><span><span class=tag>&lt;</span><span class=tag-name>session-config</span><span class=tag>&gt;</span><span> &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=tag>&lt;</span><span class=tag-name>session-timeout</span><span class=tag>&gt;</span><span>30</span><span class=tag>&lt;/</span><span class=tag-name>session-timeout</span><span class=tag>&gt;</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=alt><span></span><span class=tag>&lt;/</span><span class=tag-name>session-config</span><span class=tag>&gt;</span><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>其中30表示30分钟</p>
<p>3. 在程序中通过servlet api直接修改</p>
<div class=code_title>java 代码</div>
<div class=dp-highlighter>
<ol class=dp-j>
    <li class=alt><span><span>HttpSession ses = request.getSession(); &nbsp;&nbsp;</span></span>
    <li><span>ses.setMaxInactiveInterval(</span><span class=number>10</span><span>);&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<br><br>第二个问题，有人这样回答，但是我们的做法是在filter里面判断session里面的值并根据情况跳转<br>在 &nbsp; web.xml中添上下面的代码 &nbsp; <br>&nbsp; &lt;error-page&gt; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;error-code&gt;404&lt;/error-code&gt; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;location&gt;/error.jsp&lt;/location&gt; &nbsp; <br>&nbsp; &nbsp; &nbsp; &lt;/error-page&gt; &nbsp; <br>&nbsp; &nbsp; &nbsp; &lt;error-page&gt; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;error-code&gt;500&lt;/error-code&gt; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;location&gt;/error.jsp&lt;/location&gt; &nbsp; <br>&nbsp; &nbsp; &nbsp; &lt;/error-page&gt; &nbsp; <br>&nbsp; &nbsp; &nbsp; &lt;error-page&gt; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;error-code&gt;505&lt;/error-code&gt; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;location&gt;/error.jsp&lt;/location&gt; &nbsp; <br>&nbsp; &nbsp; &nbsp; &lt;/error-page&gt; &nbsp; <br>&nbsp; 在error.jsp中设置 &nbsp; <br>&nbsp; &lt;meta &nbsp; http-equiv="refresh" &nbsp; content="3;url=http://你的网页名"&gt;<br><br><br><br>注：关于session的概念和相关知识可以参考这个链接： <a href="http://www.hbjjrb.com/Jishu/jsp/200704/7625.html">http://www.hbjjrb.com/Jishu/jsp/200704/7625.html</a>
<img src ="http://www.cnitblog.com/wufajiaru/aggbug/49507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/wufajiaru/" target="_blank">巴西木</a> 2008-09-24 16:28 <a href="http://www.cnitblog.com/wufajiaru/archive/2008/09/24/49507.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决tomcat下中文乱码问题 </title><link>http://www.cnitblog.com/wufajiaru/archive/2007/12/31/38327.html</link><dc:creator>巴西木</dc:creator><author>巴西木</author><pubDate>Mon, 31 Dec 2007 06:55:00 GMT</pubDate><guid>http://www.cnitblog.com/wufajiaru/archive/2007/12/31/38327.html</guid><wfw:comment>http://www.cnitblog.com/wufajiaru/comments/38327.html</wfw:comment><comments>http://www.cnitblog.com/wufajiaru/archive/2007/12/31/38327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/wufajiaru/comments/commentRss/38327.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/wufajiaru/services/trackbacks/38327.html</trackback:ping><description><![CDATA[今天遇到一个中文问题，从1.jsp传参数到2.jsp，中文显示乱码，查阅资料后解决，使用了下面文章中<font color=#336666>public String toGb(String uniStr)<span style="COLOR: #000000">函数的内容：</span></font><br><br><iframe style="MARGIN-TOP: 0px; FLOAT: left" border=0 marginWidth=0 frameSpacing=0 marginHeight=0 src="http://wz.csdn.net/vote.aspx?t=%u89E3%u51B3tomcat%u4E0B%u4E2D%u6587%u4E71%u7801%u95EE%u9898%20-%20Sammy_chan%u7684%u4E13%u680F%20-%20CSDNBlog&amp;u=http%3A//blog.csdn.net/sammy_chan/archive/2006/07/15/925532.aspx" frameBorder=0 noResize width=54 scrolling=no height=75></iframe><a href="http://blog.csdn.net/Sammy_chan/archive/2006/07/15/925532.aspx"><img height=13 src="http://blog.csdn.net/images/zhuan.gif" width=15 border=0><u><font color=#0000ff>&nbsp;解决tomcat下中文乱码问题</font></u></a>&nbsp;&nbsp;
<script src="http://blog.csdn.net/count.aspx?ID=925532&amp;Type=Rank"></script>
<span title=文章指数:67><img src="http://blog.csdn.net/images/star.gif" border=0><img src="http://blog.csdn.net/images/star.gif" border=0><img src="http://blog.csdn.net/images/star.gif" border=0><img src="http://blog.csdn.net/images/star_half.gif" border=0></span>&nbsp;&nbsp;<img title="CSDN Blog推出文章指数概念，文章指数是对Blog文章综合评分后推算出的，综合评分项分别是该文章的点击量，回复次数，被网摘收录数量，文章长度和文章类型；满分100，每月更新一次。" alt="CSDN Blog推出文章指数概念，文章指数是对Blog文章综合评分后推算出的，综合评分项分别是该文章的点击量，回复次数，被网摘收录数量，文章长度和文章类型；满分100，每月更新一次。" src="http://blog.csdn.net/images/ask.gif" border=0>
<div class=postText>
<table class="fixedTable blogpost" cellSpacing=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=ellipse><span class=bvTitle id=subjcns!A61254301E5C703E!133><strong><font size=3>Tomcat</font></strong></span></td>
        </tr>
        <tr>
            <td class=bvh8><strong><font size=3></font></strong></td>
        </tr>
        <tr>
            <td id=msgcns!A61254301E5C703E!133>
            <div>
            <h2>解决tomcat下中文乱码问题</h2>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            <p><font color=#336666>(一) JSP页面上是中文，但是看的是后是乱码： <br>解决的办法就是在JSP页面的编码的地方&lt;%@ page language="java" contentType="text/html;charset=GBK" %&gt;，因为Jsp转成Java文件时的编码问题，默认的话有的服务器是ISO-8859-1，如果一个JSP中直接输入了中文，Jsp把它当作ISO8859-1来处理是肯定有问题的，这一点，我们可以通过查看Jasper所生成的Java中间文件来确认 <br><br>(二) 当用Request对象获取客户提交的汉字代码的时候，会出现乱码： <br>解决的办法是：要配置一个filter,也就是一个Servelet的过滤器，代码如下： <br>import java.io.IOException; <br>import javax.servlet.Filter; <br>import javax.servlet.FilterChain; <br>import javax.servlet.FilterConfig; <br>import javax.servlet.ServletException; <br>import javax.servlet.ServletRequest; <br>import javax.servlet.ServletResponse; <br>import javax.servlet.UnavailableException; <br><br>/** <br>* Example filter that sets the character encoding to be used in parsing the <br>* incoming request <br>*/ <br>public class SetCharacterEncodingFilter implements Filter { <br><br>/** <br>* Take this filter out of service. <br>*/ <br>public void destroy() { <br>} <br>/** <br>* Select and set (if specified) the character encoding to be used to <br>* interpret request parameters for this request. <br>*/ <br>public void doFilter(ServletRequest request, ServletResponse response, <br>FilterChain chain)throws IOException, ServletException { <br><br>request.setCharacterEncoding("GBK"); <br><br>// 传递控制到下一个过滤器 <br>chain.doFilter(request, response); <br>} <br><br>public void init(FilterConfig filterConfig) throws ServletException { <br>} <br>} <br>配置web.xml <br>&lt;filter&gt; <br>&lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt; <br>&lt;filter-class&gt;SetCharacterEncodingFilter&lt;/filter-class&gt; <br>&lt;/filter&gt; <br>&lt;filter-mapping&gt; <br>&lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt; <br>&lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br>&lt;/filter-mapping&gt; <br>如果你的还是出现这种情况的话你就往下看看是不是你出现了第四中情况，你的Form提交的数据是不是用get提交的，一般来说用post提交的话是没有问题的，如果是的话，你就看看第四中解决的办法。 <br>还有就是对含有汉字字符的信息进行处理，处理的代码是： <br>package dbJavaBean; <br><br>public class CodingConvert <br>{ <br>public CodingConvert() <br>{ <br>// <br>} <br>public String toGb(String uniStr){ <br>String gbStr = ""; <br>if(uniStr == null){ <br>uniStr = ""; <br>} <br>try{ <br>byte[] tempByte = uniStr.getBytes("ISO8859_1"); <br>gbStr = new String(tempByte,"GB2312"); <br>} <br>catch(Exception ex){ <br>} <br>return gbStr; <br>} <br><br>public String toUni(String gbStr){ <br>String uniStr = ""; <br>if(gbStr == null){ <br>gbStr = ""; <br>} <br>try{ <br>byte[] tempByte = gbStr.getBytes("GB2312"); <br>uniStr = new String(tempByte,"ISO8859_1"); <br>}catch(Exception ex){ <br>} <br>return uniStr; <br>} <br>} <br>你也可以在直接的转换，首先你将获取的字符串用ISO-8859-1进行编码，然后将这个编码存放到一个字节数组中，然后将这个数组转化成字符串对象就可以了，例如： <br>String str=request.getParameter(&#8220;girl&#8221;); <br>Byte B[]=str.getBytes(&#8220;ISO-8859-1&#8221;); <br>Str=new String(B); <br>通过上述转换的话，提交的任何信息都能正确的显示。 <br>(三) 在Formget请求在服务端用request. getParameter(&#8220;name&#8221;)时返回的是乱码；按tomcat的做法设置Filter也没有用或者用request.setCharacterEncoding("GBK");也不管用问题是出在处理参数传递的方法上：如果在servlet中用doGet(HttpServletRequest request, HttpServletResponse response)方法进行处理的话前面即使是写了： <br>request.setCharacterEncoding("GBK"); <br>response.setContentType("text/html;charset=GBK"); <br>也是不起作用的，返回的中文还是乱码！！！如果把这个函数改成doPost(HttpServletRequest request, HttpServletResponse response)一切就OK了。 <br>同样，在用两个JSP页面处理表单输入之所以能显示中文是因为用的是post方法传递的，改成get方法依旧不行。 <br>由此可见在servlet中用doGet()方法或是在JSP中用get方法进行处理要注意。这毕竟涉及到要通过浏览器传递参数信息，很有可能引起常用字符集的冲突或是不匹配。 <br>解决的办法是： <br>1) 打开tomcat的server.xml文件，找到区块，加入如下一行： <br>URIEncoding=&#8221;GBK&#8221; <br>完整的应如下： <br>&lt;Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/&gt; <br><br>2)重启tomcat,一切OK。 <br>需要加入的原因大家可以去研究 $TOMCAT_HOME/webapps/tomcat-docs/config/http.html下的这个文件就可以知道原因了。需要注意的是：这个地方如果你要是用UTF-8的时候在传递的过程中在Tomcat中也是要出现乱码的情况，如果不行的话就换别的字符集。 <br><br>(四) JSP页面上有中文，按钮上面也有中文，但是通过服务器查看页面的时候出现乱码： <br>解决的办法是：首先在JSP文件中不应该直接包含本地化的消息文本，而是应该通过&lt;bean:message&gt;标签从Resource Bundle中获得文本。应该把你的中文文本放到Application.properties文件中，这个文件放在WEB-INF/classes/*下，例如我在页面里有姓名，年龄两个label,我首先就是要建一个Application.properties，里面的内容应该是name=&#8221;姓名&#8221; age=&#8221;年龄&#8221;,然后我把这个文件放到WEB-INF/classes/properties/下，接下来根据Application.properties文件，对他进行编码转化，创建一个中文资源文件，假定名字是Application_cn.properties。在JDK中提供了native2ascii命令，他能够实现字符编码的转换。在DOS环境中找到你放置Application.properties的这个文件的目录，在DOS环境中执行一下命令，将生成按GBK编码的中文资源文件Application_cn.properties：native2ascii ?encoding gbk Application.properties Application_cn.properties执行以上命令以后将生成如下内容的Application_cn.properties文件：name=u59d3u540d age=u5e74u9f84,在Struts-config.xml中配置：&lt;message-resources parameter="properties.Application_cn"/&gt;。到这一步，基本上完成了一大半，接着你就要在JSP页面上写&lt;%@ page language="java" contentType="text/html;charset=GBK" %&gt;,到名字的那个label是要写&lt;bean:message key=&#8221;name&#8221;&gt;,这样的化在页面上出现的时候就会出现中文的姓名，年龄这个也是一样，按钮上汉字的处理也是同样的。 <br>(五) 写入到数据库是乱码： <br>解决的方法：要配置一个filter,也就是一个Servelet的过滤器，代码如同第二种时候一样。 <br>如果你是通过JDBC直接链接数据库的时候，配置的代码如下：jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&amp;characterEncoding=GBK，这样保证到数据库中的代码是不是乱码。 <br>如果你是通过数据源链接的化你不能按照这样的写法了，首先你就要写在配置文件中，在tomcat 5.0.19中配置数据源的地方是在C:Tomcat 5.0confCatalinalocalhost这个下面，我建立的工程是workshop，放置的目录是webapp下面,workshop.xml的配置文件如下： <br>&lt;!-- insert this Context element into server.xml --&gt; <br><br>&lt;Context path="/workshop" docBase="workshop" debug="0" <br>reloadable="true" &gt; <br><br>&lt;Resource name="jdbc/WorkshopDB" <br>auth="Container" <br>type="javax.sql.DataSource" /&gt; <br><br>&lt;ResourceParams name="jdbc/WorkshopDB"&gt; <br>&lt;parameter&gt; <br>&lt;name&gt;factory&lt;/name&gt; <br>&lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt; <br>&lt;/parameter&gt; <br>&lt;parameter&gt; <br>&lt;name&gt;maxActive&lt;/name&gt; <br>&lt;value&gt;100&lt;/value&gt; <br>&lt;/parameter&gt; <br>&lt;parameter&gt; <br>&lt;name&gt;maxIdle&lt;/name&gt; <br>&lt;value&gt;30&lt;/value&gt; <br>&lt;/parameter&gt; <br><br><br>&lt;parameter&gt; <br>&lt;name&gt;maxWait&lt;/name&gt; <br>&lt;value&gt;10000&lt;/value&gt; <br>&lt;/parameter&gt; <br><br>&lt;parameter&gt; <br>&lt;name&gt;username&lt;/name&gt; <br>&lt;value&gt;root&lt;/value&gt; <br>&lt;/parameter&gt; <br>&lt;parameter&gt; <br>&lt;name&gt;password&lt;/name&gt; <br>&lt;value&gt;&lt;/value&gt; <br>&lt;/parameter&gt; <br><br>&lt;!-- Class name for mm.mysql JDBC driver --&gt; <br>&lt;parameter&gt; <br>&lt;name&gt;driverClassName&lt;/name&gt; <br>&lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt; <br>&lt;/parameter&gt; <br>&lt;parameter&gt; <br>&lt;name&gt;url&lt;/name&gt; <br>&lt;value&gt;&lt;![CDATA[jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&amp;characterEncoding=GBK]]&gt;&lt;/value&gt; <br>&lt;/parameter&gt; <br>&lt;/ResourceParams&gt; <br><br>&lt;/Context&gt; <br>粗体的地方要特别的注意，和JDBC直接链接的时候是有区别的，如果你是配置正确的化，当你输入中文的时候到数据库中就是中文了，有一点要注意的是你在显示数据的页面也是要用&lt;%@ page language="java" contentType="text/html;charset=GBK" %&gt;这行代码的。需要注意的是有的前台的人员在写代码的是后用Dreamver写的，写了一个Form的时候把他改成了一个jsp，这样有一个地方要注意了，那就是在Dreamver中Action的提交方式是request的，你需要把他该过来，因为在jsp的提交的过程中紧紧就是POST和GET两种方式，但是这两种方式提交的代码在编码方面还是有很大不同的，这个在后面的地方进行说明。3 <br><br>以上就是我在开发系统中解决中文的问题，不知道能不能解决大家的问题，时间匆忙，没有及时完善，文笔也不是很好，有些地方估计是词不达意。大家可以给我意见，希望能共同进步。</font></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=925532</p>
<br></div>
<div class=postFoot>
<script src="http://localhost:82/PromoteIcon.aspx?id=925532"></script>
[<a title=功能强大的网络收藏夹，一秒钟操作就可以轻松实现保存带来的价值、分享带来的快乐 href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(saveit=window.open('http://wz.csdn.net/storeit.aspx?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t),'keyit','scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes'));saveit.focus();"><u><font color=#0000ff>收藏到我的网摘</font></u></a>]&nbsp;&nbsp; [<a href="http://tb.blog.csdn.net/TrackBack.aspx?PostId=925532"><u><font color=#0000ff>发送Trackback]</font></u></a>&nbsp;&nbsp;Sammy_chan发表于 2006年07月15日 15:35:00 </div>
<img src ="http://www.cnitblog.com/wufajiaru/aggbug/38327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/wufajiaru/" target="_blank">巴西木</a> 2007-12-31 14:55 <a href="http://www.cnitblog.com/wufajiaru/archive/2007/12/31/38327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Error filterStart</title><link>http://www.cnitblog.com/wufajiaru/archive/2007/12/12/37630.html</link><dc:creator>巴西木</dc:creator><author>巴西木</author><pubDate>Wed, 12 Dec 2007 07:24:00 GMT</pubDate><guid>http://www.cnitblog.com/wufajiaru/archive/2007/12/12/37630.html</guid><wfw:comment>http://www.cnitblog.com/wufajiaru/comments/37630.html</wfw:comment><comments>http://www.cnitblog.com/wufajiaru/archive/2007/12/12/37630.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/wufajiaru/comments/commentRss/37630.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/wufajiaru/services/trackbacks/37630.html</trackback:ping><description><![CDATA[今天部署A系统的时候遇到这样的错误：<br>Error filterStart<br>查了很多资料，结果发现，自己的classes目录下的文件全部都没有拷贝到tomcat的相关目录下，手动拷贝搞定。<br>
<img src ="http://www.cnitblog.com/wufajiaru/aggbug/37630.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/wufajiaru/" target="_blank">巴西木</a> 2007-12-12 15:24 <a href="http://www.cnitblog.com/wufajiaru/archive/2007/12/12/37630.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>