公司网站建设企划书,wordpress 全部头像无法显示,北京发布最新公告,优秀网站1 定义头和根元素 部署描述符文件就像所有XML文件一样#xff0c;必须以一个XML头开始。这个头声明可以使用的XML版本并给出文件的字符编码。 DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用的servlet规范的版本#xff08;如2.2或2.3#xff09;并指定管理此…1 定义头和根元素 部署描述符文件就像所有XML文件一样必须以一个XML头开始。这个头声明可以使用的XML版本并给出文件的字符编码。 DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用的servlet规范的版本如2.2或2.3并指定管理此文件其余部分内容的语法的DTD(Document Type Definition文档类型定义)。
所有部署描述符文件的顶层根元素为web-app。请注意XML元素不像HTML他们是大小写敏感的。因此web-App和WEB-APP都是不合法的web-app必须用小写。
2 部署描述符文件内的元素次序 XML 元素不仅是大小写敏感的而且它们还对出现在其他元素中的次序敏感。例如XML头必须是文件中的第一项DOCTYPE声明必须是第二项而web- app元素必须是第三项。在web-app元素内元素的次序也很重要。服务器不一定强制要求这种次序但它们允许实际上有些服务器就是这样做的完全 拒绝执行含有次序不正确的元素的Web应用。这表示使用非标准元素次序的web.xml文件是不可移植的。 下面的列表给出了所有可直接出现在web-app元素内的合法元素所必需的次序。例如此列表说明servlet元素必须出现在所有servlet-mapping元素之前。请注意所有这些元素都是可选的。因此可以省略掉某一元素但不能把它放于不正确的位置。 l icon icon元素指出IDE和GUI工具用来表示Web应用的一个和两个图像文件的位置。 l display-name display-name元素提供GUI工具可能会用来标记这个特定的Web应用的一个名称。 l description description元素给出与此有关的说明性文本。 l context-param context-param元素声明应用范围内的初始化参数。 l filter 过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。 l filter-mapping 一旦命名了一个过滤器就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。 l listener servlet API的版本2.3增加了对事件监听程序的支持事件监听程序在建立、修改和删除会话或servlet环境时得到通知。Listener元素指出事件监听程序类。 l servlet 在向servlet或JSP页面制定初始化参数或定制URL时必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。 l servlet-mapping 服务器一般为servlet提供一个缺省的URLhttp://host/webAppPrefix/servlet/ServletName。但是 常常会更改这个URL以便servlet可以访问初始化参数或更容易地处理相对URL。在更改缺省URL时使用servlet-mapping元素。 l session -config 如果某个会话在一定时间内未被访问服务器可以抛弃它以节省内存。可通过使用HttpSession的 setMaxInactiveInterval方法明确设置单个会话对象的超时值或者可利用session-config元素制定缺省超时值。 l mime-mapping 如果Web应用具有想到特殊的文件希望能保证给他们分配特定的MIME类型则mime-mapping元素提供这种保证。 l welcom-file-list welcome-file-list元素指示服务器在收到引用一个目录名而不是文件名的URL时使用哪个文件。 l error-page error-page元素使得在返回特定HTTP状态代码时或者特定类型的异常被抛出时能够制定将要显示的页面。 l taglib taglib元素对标记库描述符文件Tag Libraryu Descriptor file指定别名。此功能使你能够更改TLD文件的位置而不用编辑使用这些文件的JSP页面。 l resource-env-ref resource-env-ref元素声明与资源相关的一个管理对象。 l resource-ref resource-ref元素声明一个资源工厂使用的外部资源。 l security-constraint security-constraint元素制定应该保护的URL。它与login-config元素联合使用 l login-config 用login-config元素来指定服务器应该怎样给试图访问受保护页面的用户授权。它与sercurity-constraint元素联合使用。 l security-role security-role元素给出安全角色的一个列表这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为容易。 l env-entry env-entry元素声明Web应用的环境项。 l ejb-ref ejb-ref元素声明一个EJB的主目录的引用。 l ejb-local-ref ejb-local-ref元素声明一个EJB的本地主目录的应用。
3 分配名称和定制的UL 在web.xml中完成的一个最常见的任务是对servlet或JSP页面给出名称和定制的URL。用servlet元素分配名称使用servlet-mapping元素将定制的URL与刚分配的名称相关联。 3.1 分配名称 为 了提供初始化参数对servlet或JSP页面定义一个定制URL或分配一个安全角色必须首先给servlet或JSP页面一个名称。可通过 servlet元素分配一个名称。最常见的格式包括servlet-name和servlet-class子元素在web-app元素内如下所示 servlet servlet-nameTest/servlet-name servlet-classmoreservlets.TestServlet/servlet-class /servlet 这 表示位于WEB-INF/classes/moreservlets/TestServlet的servlet已经得到了注册名Test。给 servlet一个名称具有两个主要的含义。首先初始化参数、定制的URL模式以及其他定制通过此注册名而不是类名引用此servlet。其次,可在 URL而不是类名中使用此名称。因此利用刚才给出的定义URL http://host/webAppPrefix/servlet/Test 可用于 http://host/webAppPrefix/servlet/moreservlets.TestServlet的场所。 请 记住XML元素不仅是大小写敏感的而且定义它们的次序也很重要。例如web-app元素内所有servlet元素必须位于所有servlet- mapping元素下一小节介绍之前而且还要位于5.6节和5.11节讨论的与过滤器或文档相关的元素如果有的话之前。类似地 servlet 的servlet-name子元素也必须出现在servlet-class之前。5.2节部署描述符文件内的元素次序将详细介绍这种必需的次序。 例 如程序清单5-1给出了一个名为TestServlet的简单servlet它驻留在moreservlets程序包中。因为此servlet是扎根 在一个名为deployDemo的目录中的Web应用的组成部分所以TestServlet.class放在 deployDemo/WEB- INF/classes/moreservlets中。程序清单5-2给出将放置在deployDemo/WEB- INF/内的web.xml文件的一部分。此web.xml文件使用servlet-name和servlet-class元素将名称Test与 TestServlet.class相关联。图 5-1和图5-2分别显示利用缺省URL和注册名调用TestServlet时的结果。
程序清单5-1 TestServlet.java package moreservlets;import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;/** Simple servlet used to illustrate servlet naming
* and custom URLs.
** Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
* http://www.moreservlets.com/.
* © 2002 Marty Hall; may be freely used or adapted.
*/public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType(text/html);PrintWriter out response.getWriter();String uri request.getRequestURI();out.println(ServletUtilities.headWithTitle(Test Servlet) BODY BGCOLOR/#FDF5E6//n URI: uri /n /BODY/HTML);
}
}
程序清单5-2 web.xml说明servlet名称的摘录 ?xml version1.0 encodingISO-8859-1?
!DOCTYPE web-app
PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN
http://java.sun.com/dtd/web-app_2_3.dtdweb-app
!-- … --
servlet
servlet-nameTest/servlet-name
servlet-classmoreservlets.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-name和url-pattern子元素。Servlet- name元素提供了一个任意名称可利用此名称引用相应的servleturl-pattern描述了相对于Web应用的根目录的URL。url- pattern元素的值必须以斜杠/起始。 下面给出一个简单的web.xml摘录它允许使用URL http://host/webAppPrefix/UrlTest而不是http://host/webAppPrefix/servlet/Test或 http: //host/webAppPrefix/servlet/moreservlets.TestServlet。请注意仍然需要XML头、 DOCTYPE声明以及web-app封闭元素。此外可回忆一下XML元素出现地次序不是随意的。特别是需要把所有servlet元素放在所有 servlet-mapping元素之前。servlet
servlet-nameTest/servlet-name
servlet-classmoreservlets.TestServlet/servlet-class
/servlet
!-- ... --
servlet-mapping
servlet-nameTest/servlet-name
url-pattern/UrlTest/url-pattern
/servlet-mapping
URL模式还可以包含通配符。例如下面的小程序指示服务器发送所有以Web应用的URL前缀开始以..asp结束的请求到名为BashMS的servlet。servlet
servlet-nameBashMS/servlet-name
servlet-classmsUtils.ASPTranslator/servlet-class
/servlet
!-- ... --
servlet-mapping
servlet-nameBashMS/servlet-name
url-pattern/*.asp/url-pattern
/servlet-mapping
3.3 命名JSP页面 因 为JSP页面要转换成sevlet自然希望就像命名servlet一样命名JSP页面。毕竟JSP页面可能会从初始化参数、安全设置或定制的URL中 受益正如普通的serlvet那样。虽然JSP页面的后台实际上是servlet这句话是正确的但存在一个关键的猜疑即你不知道JSP页面的实际 类名因为系统自己挑选这个名字。因此为了命名JSP页面可将jsp-file元素替换为servlet-calss元素如下所示 servlet servlet-nameTest/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/HEAD
BODY BGCOLOR#FDF5E6
URI: % request.getRequestURI() %/BODY
/HTML
程序清单5-4 web.xml说明JSP页命名的摘录?xml version1.0 encodingISO-8859-1?
!DOCTYPE web-app
PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN
http://java.sun.com/dtd/web-app_2_3.dtdweb-app
!-- ... --
servlet
servlet-namePageName/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
4 禁止激活器servlet 对servlet 或JSP页面建立定制URL的一个原因是这样做可以注册从 initservlet或jspInitJSP页面方法中读取得初始化参数。但是初始化参数只在是利用定制URL模式或注册名访问 servlet或JSP页面时可以使用用缺省URL http: //host/webAppPrefix/servlet/ServletName 访问时不能使用。因此你可能会希望关闭缺省URL这样就不会有人意外地调用初始化servlet了。这个过程有时称为禁止激活器servlet因为 多数服务器具有一个用缺省的servlet URL注册的标准 servlet并激活缺省的URL应用的实际servlet。 有两种禁止此缺省URL的主要方法 l 在每个Web应用中重新映射/servlet/模式。 l 全局关闭激活器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.xml说明JSP页命名的摘录?xml version1.0 encodingISO-8859-1?
!DOCTYPE web-app
PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN
http://java.sun.com/dtd/web-app_2_3.dtdweb-app
!-- ... --
servlet
servlet-nameSorry/servlet-name
servlet-classmoreservlets.SorryServlet/servlet-class
/servlet
!-- ... --
servlet-mapping
servlet-name Sorry /servlet-name
url-pattern/servlet/*/url-pattern
/servlet-mapping
!-- ... --
/web-app
程序清单5-6 SorryServlet.javapackage moreservlets;import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;/** Simple servlet used to give error messages to
* users who try to access default servlet URLs
* (i.e., http://host/webAppPrefix/servlet/ServletName)
* in Web applications that have disabled this
* behavior.
** Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
* http://www.moreservlets.com/.
* © 2002 Marty Hall; may be freely used or adapted.
*/public class SorryServlet extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {response.setContentType(text/html);PrintWriter out response.getWriter();String title Invoker Servlet Disabled.;out.println(ServletUtilities.headWithTitle(title) BODY BGCOLOR/#FDF5E6//n title /n Sorry, access to servlets by means of/n URLs that begin with/n http://host/webAppPrefix/servlet//n has been disabled./n /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-nameinvoker/servlet-name
url-pattern/servlet/*/url-pattern
/servlet-mapping
--
再次提醒应该注意这个项是位于存放在install_dir/conf的Tomcat专用的web.xml文件中的此文件不是存放在每个Web应用的WEB-INF目录中的标准web.xml。 2禁止激活器Tomcat3 在Apache Tomcat 的版本3中通过在install_dir/conf/server.xml中注释出InvokerInterceptor项全局禁止缺省 servlet URL。例如下面是禁止使用缺省servlet URL的server.xml文件的一部分。!--
RequsetInterceptor
classNameorg.apache.tomcat.request.InvokerInterceptor
debug0 prefix/servlet/ /
--
5 初始化和预装载servlet与JSP页面 这里讨论控制servlet和JSP页面的启动行为的方法。特别是说明了怎样分配初始化参数以及怎样更改服务器生存期中装载servlet和JSP页面的时刻。 5.1 分配servlet初始化参数 利 用init-param元素向servlet提供初始化参数init-param元素具有param-name和param-value子元素。例如 在下面的例子中如果initServlet servlet是利用它的注册名InitTest访问的它将能够从其方法中调用 getServletConfig(). getInitParameter(param1)获得Value 1调用 getServletConfig().getInitParameter(param2)获得2。servlet
servlet-nameInitTest/servlet-name
servlet-classmoreservlets.InitServlet/servlet-class
init-param
param-nameparam1/param-name
param-valuevalue1/param-value
/init-param
init-param
param-nameparam2/param-name
param-value2/param-value
/init-param
/servlet
在涉及初始化参数时有几点需要注意 l 返回值。GetInitParameter的返回值总是一个String。因此在前一个例子中可对param2使用Integer.parseInt获得一个int。 l JSP中的初始化。JSP页面使用jspInit而不是init。JSP页面还需要使用jsp-file元素代替servlet-class。 l 缺省URL。初始化参数只在通过它们的注册名或与它们注册名相关的定制URL模式访问Servlet时可以使用。因此在这个例子中param1和 param2初始化参数将能够在使用URL http://host/webAppPrefix/servlet/InitTest 时可用但在使用 URLhttp://host/webAppPrefix/servlet/myPackage.InitServlet 时不能使用。 例如程序清单5-7给出一个名为InitServlet的简单servlet它使用init方法设置firstName和emailAddress字段。程序清单5-8给出分配名称InitTest给servlet的web.xml文件。 程序清单5-7 InitServlet.javapackage moreservlets;import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;/** Simple servlet used to illustrate servlet
* initialization parameters.
** Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
* http://www.moreservlets.com/.
* © 2002 Marty Hall; may be freely used or adapted.
*/public class InitServlet extends HttpServlet {
private String firstName, emailAddress;public void init() {ServletConfig config getServletConfig();firstName config.getInitParameter(firstName);emailAddress config.getInitParameter(emailAddress);
}public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {response.setContentType(text/html);PrintWriter out response.getWriter();String uri request.getRequestURI();out.println(ServletUtilities.headWithTitle(Init Servlet) BODY BGCOLOR/#FDF5E6//n Init Parameters:/n /n First name: firstName /n Email address: emailAddress /n /n /BODY/HTML);
}
}
程序清单5-8 web.xml说明初始化参数的摘录?xml version1.0 encodingISO-8859-1?
!DOCTYPE web-app
PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN
http://java.sun.com/dtd/web-app_2_3.dtdweb-app
!-- ... --
servlet
servlet-nameInitTest/servlet-name
servlet-classmoreservlets.InitServlet/servlet-class
init-param
param-namefirstName/param-name
param-valueLarry/param-value
/init-param
init-param
param-nameemailAddress/param-name
param-valueEllisonMicrosoft.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-namePageName/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页面时许多用户似乎不喜欢应用常规的servlet的URL。此外如果 JSP页面位于服务器为其提供了目录清单的目录中如一个既没有 index.html也没有index.jsp文件的目录则用户可能会连接到此 JSP页面单击它从而意外地激活未初始化的页面。因此好的办法是使用url-pattern5.3节将JSP页面的原URL与注册的 servlet名相关联。这样客户机可使用JSP页面的普通名称但仍然激活定制的版本。例如给定来自项目1的servlet定义可使用下面的 servlet-mapping定义servlet-mapping
servlet-namePageName/servlet-name
url-pattern/RealPage.jsp/url-pattern
/servlet-mapping
3JSP页使用jspInit而不是init。自动从JSP页面建立的servlet或许已经使用了inti方法。因此使用JSP声明提供一个init方法是不合法的必须制定jspInit方法。 为 了说明初始化JSP页面的过程程序清单5-9给出了一个名为InitPage.jsp的JSP页面它包含一个jspInit方法且放置于 deployDemo Web应用层次结构的顶层。一般http://host/deployDemo/InitPage.jsp 形式的URL将激活此页面的不具有初始化参数访问权的版本从而将对firstName和emailAddress变量显示null。但是 web.xml文件程序清单5-10分配了一个注册名然后将该注册名与URL模式/InitPage.jsp相关联。 程序清单5-9 InitPage.jsp!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.0 Transitional//EN
HTML
HEAD/HEAD
BODY BGCOLOR#FDF5E6
Init Parameters:First name: % firstName %
Email address: % emailAddress %/BODY/HTML
%!
private String firstName, emailAddress;public void jspInit() {
ServletConfig config getServletConfig();
firstName config.getInitParameter(firstName);
emailAddress config.getInitParameter(emailAddress);
}
%
程序清单5-10 web.xml说明JSP页面的init参数的摘录?xml version1.0 encodingISO-8859-1?
!DOCTYPE web-app
PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN
http://java.sun.com/dtd/web-app_2_3.dtdweb-app
!-- ... --
servlet
servlet-nameInitPage/servlet-name
jsp-file/InitPage.jsp/jsp-file
init-param
param-namefirstName/param-name
param-valueBill/param-value
/init-param
init-param
param-nameemailAddress/param-name
param-valuegatesoracle.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 提供应用范围内的初始化参数 一 般对单个地servlet或JSP页面分配初始化参数。指定的servlet或JSP页面利用ServletConfig的 getInitParameter方法读取这些参数。但是在某些情形下希望提供可由任意servlet或JSP页面借助ServletContext 的getInitParameter方法读取的系统范围内的初始化参数。 可利用context-param元素声明这些系统范围内的初始化值。context-param元素应该包含param-name、param-value以及可选的description子元素如下所示context-param
param-namesupport-email/param-name
param-valueblackholemycompany.com/param-value
/context-param
可 回忆一下为了保证可移植性web.xml内的元素必须以正确的次序声明。但这里应该注意context-param元素必须出现任意与文档有关的元 素icon、display-name或description之后及filter、filter-mapping、listener或 servlet元素之前。 5.4 在服务器启动时装载servlet 假如servlet或JSP页面有一个要花很长时间执行的 init servlet或jspInitJSP方法。例如假如init或jspInit方法从某个数据库或ResourceBundle查找产量。这种 情况下在第一个客户机请求时装载servlet的缺省行为将对第一个客户机产生较长时间的延迟。因此可利用servlet的load-on - startup元素规定服务器在第一次启动时装载servlet。下面是一个例子。servlet
servlet-name … /servlet-name
servlet-class … /servlet-class !-- Or jsp-file --
load-on-startup/
/servlet
可 以为此元素体提供一个整数而不是使用一个空的load-on-startup。想法是服务器应该在装载较大数目的servlet或JSP页面之前装载较少 数目的servlet或JSP页面。例如下面的servlet项放置在Web应用的WEB-INF目录下的web.xml文件中的web-app元素 内将指示服务器首先装载和初始化SearchServlet然后装载和初始化由位于Web应用的result目录中的index.jsp文件产生的 servlet。servlet
servlet-nameSearch/servlet-name
servlet-classmyPackage.SearchServlet/servlet-class !-- Or jsp-file --
load-on-startup1/load-on-startup
/servlet
servlet
servlet-nameResults/servlet-name
servlet-class/results/index.jsp/servlet-class !-- Or jsp-file --
load-on-startup2/load-on-startup
/servlet
6 声明过滤器 servlet版本2.3引入了过滤器的概念。虽然所有支持servlet API版本2.3的服务器都支持过滤器但为了使用与过滤器有关的元素必须在web.xml中使用版本2.3的DTD。 过 滤器可截取和修改进入一个servlet或JSP页面的请求或从一个servlet或JSP页面发出的相应。在执行一个servlet或JSP页面之前 必须执行第一个相关的过滤器的doFilter方法。在该过滤器对其FilterChain对象调用doFilter时执行链中的下一个过滤器。如果没 有其他过滤器servlet或JSP页面被执行。过滤器具有对到来的ServletRequest对象的全部访问权因此它们可以查看客户机名、查找 到来的cookie等。为了访问servlet或JSP页面的输出过滤器可将响应对象包裹在一个替身对象stand-in object中比方说把输出累加到一个缓冲区。在调用FilterChain对象的doFilter方法之后过滤器可检查缓冲区如有必要就对它 进行修改然后传送到客户机。 例如程序清单5-11帝国难以了一个简单的过滤器只要访问相关的servlet或JSP页面它就截取请求并在标准输出上打印一个报告开发过程中在桌面系统上运行时大多数服务器都可以使用这个过滤器。 程序清单5-11 ReportFilter.javapackage moreservlets;import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;/** Simple filter that prints a report on the standard output
* whenever the associated servlet or JSP page is accessed.
** Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
* http://www.moreservlets.com/.
* © 2002 Marty Hall; may be freely used or adapted.
*/public class ReportFilter implements Filter {
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws ServletException, IOException {HttpServletRequest req (HttpServletRequest)request;System.out.println(req.getRemoteHost() tried to access req.getRequestURL() on new Date() .);chain.doFilter(request,response);
}public void init(FilterConfig config)throws ServletException {
}public void destroy() {}
}
一 旦建立了一个过滤器可以在web.xml中利用filter元素以及filter-name任意名称、file-class完全限定的类名和 可选的init-params子元素声明它。请注意元素在web.xml的web-app元素中出现的次序不是任意的允许服务器但不是必需的 强制所需的次序并且实际中有些服务器也是这样做的。但这里要注意所有filter元素必须出现在任意filter-mapping元素之前 filter-mapping元素又必须出现在所有servlet或servlet-mapping元素之前。 例如给定上述的ReportFilter类可在web.xml中作出下面的filter声明。它把名称Reporter与实际的类ReportFilter位于moreservlets程序包中相关联。filter
filter-nameReporter/filter-name
filter-classmoresevlets.ReportFilter/filter-class
/filter
一旦命名了一个过滤器可利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。关于此项工作有两种选择。 首 先可使用filter-name和servlet-name子元素把此过滤器与一个特定的servlet名此servlet名必须稍后在相同的 web.xml文件中使用servlet元素声明关联。例如下面的程序片断指示系统只要利用一个定制的URL访问名为 SomeServletName 的servlet或JSP页面就运行名为Reporter的过滤器。filter-mapping
filter-nameReporter/filter-name
servlet-nameSomeServletName/servlet-name
/filter-mapping
其次可利用filter-name和url-pattern子元素将过滤器与一组servlet、JSP页面或静态内容相关联。例如相面的程序片段指示系统只要访问Web应用中的任意URL就运行名为Reporter的过滤器。filter-mapping
filter-nameReporter/filter-name
url-pattern/*/url-pattern
/filter-mapping
例 如程序清单5-12给出了将ReportFilter过滤器与名为PageName的servlet相关联的web.xml文件的一部分。名字 PageName依次又与一个名为TestPage.jsp的JSP页面以及以模式http: //host/webAppPrefix/UrlTest2/ 开头的URL相关联。TestPage.jsp的源代码已经JSP页面命名的谈论在前面的3节分配名称和定制的URL中给出。事实上程序清单5- 12中的servlet和servlet-name项从该节原封不动地拿过来的。给定这些web.xml项可看到下面的标准输出形式的调试报告换行是 为了容易阅读。 audit.irs.gov tried to access http://mycompany.com/deployDemo/UrlTest2/business/tax-plan.html on Tue Dec 25 13:12:29 EDT 2001. 程序清单5-12 Web.xml说明filter用法的摘录?xml version1.0 encodingISO-8859-1?
!DOCTYPE web-app
PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN
http://java.sun.com/dtd/web-app_2_3.dtdweb-app
filter
filter-nameReporter/filter-name
filter-classmoresevlets.ReportFilter/filter-class
/filter
!-- ... --
filter-mapping
filter-nameReporter/filter-name
servlet-namePageName/servlet-name
/filter-mapping
!-- ... --
servlet
servlet-namePageName/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
7 指定欢迎页 假 如用户提供了一个像http: //host/webAppPrefix/directoryName/ 这样的包含一个目录名但没有包含文件名的 URL会发生什么事情呢用户能得到一个目录表一个错误还是标准文件的内容如果得到标准文件内容是 index.html、 index.jsp、default.html、default.htm或别的什么东西呢 Welcome-file-list 元素及其辅助的 welcome-file元素解决了这个模糊的问题。例如下面的web.xml项指出如果一个URL给出一个目录名但未给出文件名服务器应该首先试 用index.jsp然后再试用index.html。如果两者都没有找到则结果有赖于所用的服务器如一个目录列表。welcome-file-list
welcome-fileindex.jsp/welcome-file
welcome-fileindex.html/welcome-file
/welcome-file-list
虽然许多服务器缺省遵循这种行为但不一定必须这样。因此明确地使用welcom-file-list保证可移植性是一种良好的习惯。 8 指定处理错误的页面 现 在我了解到你在开发servlet和JSP页面时从不会犯错误而且你的所有页面是那样的清晰一般的程序员都不会被它们的搞糊涂。但是是人总会犯错 误的用户可能会提供不合规定的参数使用不正确的URL或者不能提供必需的表单字段值。除此之外其它开发人员可能不那么细心他们应该有些工具来克服 自己的不足。 error-page元素就是用来克服这些问题的。它有两个可能的子元素分别是error-code和exception- type。第一个子元素error-code指出在给定的HTTP错误代码出现时使用的URL。第二个子元素excpetion-type指出在出现某个 给定的Java异常但未捕捉到时使用的URL。error-code和exception-type都利用location元素指出相应的URL。此 URL必须以/开始。location所指出的位置处的页面可通过查找HttpServletRequest对象的两个专门的属性来访问关于错误的信息 这两个属性分别是javax.servlet.error.status_code和javax.servlet.error.message。 可回忆一下在web.xml内以正确的次序声明web-app的子元素很重要。这里只要记住error-page出现在web.xml文件的末尾附近servlet、servlet-name和welcome-file-list之后即可。 8.1 error-code元素 为 了更好地了解error-code元素的值可考虑一下如果不正确地输入文件名大多数站点会作出什么反映。这样做一般会出现一个404错误信息它表示 不能找到该文件但几乎没提供更多有用的信息。另一方面可以试一下在www.microsoft.com、www.ibm.com 处或者特别是在 www.bea.com 处输出未知的文件名。这是会得出有用的消息这些消息提供可选择的位置以便查找感兴趣的页面。提供这样有用的错误页面对于 Web应用来说是很有价值得。事实上rm-error-page子元素。由form-login-page给出的HTML表单必须具有一个 j_security_check的 ACTION属性、一个名为j_username的用户名文本字段以及一个名为j_password的口令字段。 例如程序清单5-19指示服务器使用基于表单的验证。Web应用的顶层目录中的一个名为login.jsp的页面将收集用户名和口令并且失败的登陆将由相同目录中名为login-error.jsp的页面报告。 程序清单5-19 web.xml说明login-config的摘录?xml version1.0 encodingISO-8859-1?
!DOCTYPE web-app
PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN
http://java.sun.com/dtd/web-app_2_3.dtdweb-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-constraint、user-data- constraint和display-name。下面各小节对它们进行介绍。 l web-resource-collection 此 元素确定应该保护的资源。所有security-constraint元素都必须包含至少一个web-resource-collection项。此元素 由一个给出任意标识名称的web-resource-name元素、一个确定应该保护的URL的url-pattern元素、一个指出此保护所适用的 HTTP命令GET、POST等缺省为所有方法的http-method元素和一个提供资料的可选description元素组成。例如下面的 Web-resource-collection项在security-constratint元素内指出Web应用的proprietary目录中 所有文档应该受到保护。security-constraint
web-resource-coolection
web-resource-nameProprietary/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页面而只是通过建立该页面将使用的bean的servlet来访问它。url-pattern和auth-contraint元素 可通过声明不允许任何用户直接访问JSP页面来提供这种保证。但是这种不匀称的行为可能让开发人员放松警惕使他们偶然对应受保护的资源提供不受限制的 访问。 l auth-constraint 尽管web-resource-collention元素质出了哪些URL应该受到保护 但是auth-constraint元素却指出哪些用户应该具有受保护资源的访问权。此元素应该包含一个或多个标识具有访问权限的用户类别role- name元素以及包含可选一个描述角色的description元素。例如下面web.xml中的security-constraint元素部 门规定只有指定为Administrator或Big Kahuna或两者的用户具有指定资源的访问权。security-constraint
web-resource-coolection ... /web-resource-coolection
auth-constraint
role-nameadministrator/role-name
role-namekahuna/role-name
/auth-constraint
/security-constraint
重要的是认识到到此为止这个过程的可移植部分结束了。服务器怎样确定哪些用户处于任何角色以及它怎样存放用户的口令完全有赖于具体的系统。 例如Tomcat使用install_dir/conf/tomcat-users.xml将用户名与角色名和口令相关联正如下面例子中所示它指出用户joe口令bigshot和jane口令enaj属于administrator和kahuna角色。tomcat-users
user namejoe passwordbigshot rolesadministrator,kahuna /
user namejane passwordenaj roleskahuna /
/tomcat-users
l user-data-constraint 这 个可选的元素指出在访问相关资源时使用任何传输层保护。它必须包含一个transport-guarantee子元素合法值为NONE、 INTEGRAL或CONFIDENTIAL并且可选地包含一个description元素。transport-guarantee为NONE值将 对所用的通讯协议不加限制。INTEGRAL值表示数据必须以一种防止截取它的人阅读它的方式传送。虽然原理上并且在未来的HTTP版本中在 INTEGRAL和CONFIDENTIAL之间可能会有差别但在当前实践中他们都只是简单地要求用SSL。例如下面指示服务器只允许对相关资源做 HTTPS连接security-constraint
!-- ... --
user-data-constraint
transport-guaranteeCONFIDENTIAL/transport-guarantee
/user-data-constraint
/security-constraint
l display-name security-constraint的这个很少使用的子元素给予可能由GUI工具使用的安全约束项一个名称。 9.3 分配角色名 迄今为止讨论已经集中到完全由容器服务器处理的安全问题之上了。但servlet以及JSP页面也能够处理它们自己的安全问题。 例 如容器可能允许用户从bigwig或bigcheese角色访问一个显示主管人员额外紧贴的页面但只允许bigwig用户修改此页面的参数。完成这种 更细致的控制的一种常见方法是调用HttpServletRequset的isUserInRole方法并据此修改访问。 Servlet的 security-role-ref子元素提供出现在服务器专用口令文件中的安全角色名的一个别名。例如假如编写了一个调用 request.isUserInRoleboss的servlet但后来该servlet被用在了一个其口令文件调用角色manager而不 是boss的服务器中。下面的程序段使该servlet能够使用这两个名称中的任何一个。servlet
!-- ... --
security-role-ref
role-nameboss/role-name !-- New alias --
role-linkmanager/role-link !-- Real name --
/security-role-ref
/servlet
也可以在web-app内利用security-role元素提供将出现在role-name元素中的所有安全角色的一个全局列表。分别地生命角色使高级IDE容易处理安全信息。 10 控制会话超时 如 果某个会话在一定的时间内未被访问服务器可把它扔掉以节约内存。可利用HttpSession的setMaxInactiveInterval方法直接 设置个别会话对象的超时值。如果不采用这种方法则缺省的超时值由具体的服务器决定。但可利用session-config和session- timeout元素来给出一个适用于所有服务器的明确的超时值。超时值的单位为分钟因此下面的例子设置缺省会话超时值为三个小时180分钟。session-config
session-timeout180/session-timeout
/session-config
11 Web应用的文档化 越 来越多的开发环境开始提供servlet和JSP的直接支持。例子有Borland Jbuilder Enterprise Edition、 Macromedia UltraDev、Allaire JRun Studio写此文时已被Macromedia收购以及 IBM VisuaAge for Java等。 大量的web.xml元素不仅是为服务器设计的而且还是为可视开发环境设计的。它们包括icon、display-name和discription等。 可回忆一下在web.xml内以适当地次序声明web-app子元素很重要。不过这里只要记住icon、display-name和description是web.xml的web-app元素内的前三个合法元素即可。 l icon icon元素指出GUI工具可用来代表Web应用的一个和两个图像文件。可利用small-icon元素指定一幅16 x 16的GIF或JPEG图像用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-nameRare 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/jpeg的 MIME 类型。但是假如你的Web应用具有几个不寻常的文件你希望保证它们在发送到客户机时分配为某种MIME类型。mime-mapping元素具有 extension和mime-type子元素可提供这种保证。例如下面的代码指示服务器将application/x-fubar的 MIME类型分配给所有以.foo结尾的文件。mime-mapping
extensionfoo/extension
mime-typeapplication/x-fubar/mime-type
/mime-mapping
或许你的Web应用希望重载override标准的映射。例如下面的代码将告诉服务器在发送到客户机时指定.ps文件作为纯文本text/plain而不是作为PostScriptapplication/postscript。mime-mapping
extensionps/extension
mime-typeapplication/postscript/mime-type
/mime-mapping
13 定位TLD JSP taglib 元素具有一个必要的uri属性它给出一个TLDTag Library Descriptor文件相对于Web应用的根的位置。TLD文件的实际名称在发布新的标签库版本时可能会改变但我们希望避免更改所有现有JSP页 面。此外可能还希望使用保持taglib元素的简练性的一个简短的uri。这就是部署描述符文件的taglib元素派用场的所在了。Taglib包含两 个子元素taglib-uri和taglib-location。 taglib-uri元素应该与用于JSP taglib元素的uri属性的东西相匹配。Taglib-location元素给出TLD文件的实际位置。例如假如你将文件chart-tags- 1.3beta.tld放在WebApp/WEB-INF/tlds中。现在假如web.xml在web- app元素内包含下列内容。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 prefixsomePrefix %
14 指定应用事件监听程序 应用事件监听器程序是建立或修改servlet环境或会话对象时通知的类。它们是servlet规范的版本2.3中的新内容。这里只简单地说明用来向Web应用注册一个监听程序的web.xml的用法。 注册一个监听程序涉及在web.xml的web-app元素内放置一个listener元素。在listener元素内listener-class元素列出监听程序的完整的限定类名如下所示listener
listener-classpackage.ListenerClass/listener-class
/listener
虽 然listener元素的结构很简单但请不要忘记必须正确地给出web-app元素内的子元素的次序。listener元素位于所有的 servlet 元素之前以及所有filter-mapping元素之后。此外因为应用生存期监听程序是serlvet规范的2.3版本中的新内容所以必须使用 web.xml DTD的2.3版本而不是2.2版本。 例如程序清单5-20给出一个名为ContextReporter的简单的监听程序 只要Web应用的Servlet-Context建立如装载Web应用或消除如服务器关闭时它就在标准输出上显示一条消息。程序清单5-21给 出此监听程序注册所需要的web.xml文件的一部分。 程序清单5-20 ContextReporterjavapackage moreservlets;import javax.servlet.*;
import java.util.*;/** Simple listener that prints a report on the standard output
* when the ServletContext is created or destroyed.
** Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
* http://www.moreservlets.com/.
* © 2002 Marty Hall; may be freely used or adapted.
*/public class ContextReporter implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {System.out.println(Context created on new Date() .);
}public void contextDestroyed(ServletContextEvent event) {System.out.println(Context destroyed on new Date() .);
}
}
程序清单5-21 web.xml声明一个监听程序的摘录?xml version1.0 encodingISO-8859-1?
!DOCTYPE web-app
PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN
http://java.sun.com/dtd/web-app_2_3.dtdweb-app
!-- ... --
filter-mapping … /filter-mapping
listener
listener-classpackage.ListenerClass/listener-class
/listener
servlet ... /servlet
!-- ... --
/web-app
15 J2EE元素 本 节描述用作J2EE环境组成部分的Web应用的web.xml元素。这里将提供一个简明的介绍详细内容可以参阅http: //java.sun.com/j2ee/j2ee-1_3-fr-spec.pdf的 Java 2 Plantform Enterprise Edition版本1.3规范的第5章。 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/env环境JNDI名、一个env-entry-value元素项值以及一个env-entry-type元素java.lang程序 包中一个类型的完全限定类名java.lang.Boolean、java.lang.String等组成。下面是一个例子env-entry
env-entry-nameminAmout/env-entry-name
env-entry-value100.00/env-entry-value
env-entry-typeminAmout/env-entry-type
/env-entry
l ejb-ref ejb -ref元素声明对一个EJB的主目录的应用。它由一个可选的description元素、一个ejb-ref-name元素相对于java: comp/env的EJB应用、一个ejb-ref-type元素bean的类型Entity或Session、一个home元素bean的主 目录接口的完全限定名、一个remote元素bean的远程接口的完全限定名以及一个可选的ejb-link元素当前bean链接的另一个 bean的名称组成。 l ejb-local-ref ejb-local-ref元素声明一个EJB的本地主目录的引用。除了用local-home代替home外此元素具有与ejb-ref元素相同的属性并以相同的方式使用 来源http://blog.csdn.net/cocojiji5/article/details/1601496