Servlet的配置文件详解

    技术2022-05-19  19

    1 义头和根元素部署描述符文件就像所有XML文件一,必以一个XML头开始。声明可以使用的XML版本并出文件的字符编码DOCYTPE声明必立即出在此之后。个声明告器适用的servlet范的版本(如2.22.3)并指定管理此文件其余部分内容的法的DTD(Document Type Definition,文档型定)所有部署描述符文件的顶层(根)元素web-app注意,XML元素不像HTML,他是大小写敏感的。因此,web-AppWEB-APP都是不合法的,web-app用小写。2 部署描述符文件内的元素次序XML 元素不是大小写敏感的,而且它们还对在其他元素中的次序敏感。例如,XML是文件中的第一DOCTYPE声明必是第二,而web- app元素必是第三。在web-app元素内,元素的次序也很重要。服器不一定制要求这种次序,但它实际上有些服器就是这样做的)完全拒绝执行含有次序不正确的元素的Web用。表示使用非准元素次序的web.xml文件是不可移植的。下面的列表出了所有可直接出web-app元素内的合法元素所必需的次序。例如,此列表servlet元素必在所有servlet-mapping元素之前。注意,所有些元素都是可的。因此,可以省略掉某一元素,但不能把它放于不正确的位置。l icon icon元素指出IDEGUI工具用来表示Web用的一个和两个像文件的位置。l display-name display-name元素提供GUI工具可能会用来标记这个特定的Web用的一个名称。l description description元素出与此有明性文本。l context-param context-param元素声明用范内的初始化参数。l filter 过滤器元素将一个名字与一个实现javax.servlet.Filter接口的关联l filter-mapping 一旦命名了一个过滤器,就要利用filter-mapping元素把它与一个或多个servletJSP面相关联l listener servlet API的版本2.3增加了事件听程序的支持,事件听程序在建立、修改和除会servlet得到通知。Listener元素指出事件听程序l servlet 在向servletJSP面制定初始化参数或定制URL,必首先命名servletJSP面。Servlet元素就是用来完成此的。l servlet-mapping 器一般servlet提供一个缺省的URLhttp://host/webAppPrefix/servlet/ServletName但是,常常会更改URL,以便servlet可以访问初始化参数或更容易地理相URL。在更改缺省URL,使用servlet-mapping元素。l session-config 如果某个会在一定时间内未被访问,服器可以抛弃它以省内存。可通使用HttpSessionsetMaxInactiveInterval方法明确个会话对象的超时值,或者可利用session-config元素制定缺省超时值l mime-mapping 如果Web用具有想到特殊的文件,希望能保证给分配特定的MIME型,mime-mapping元素提供这种l welcom-file-list welcome-file-list元素指示服器在收到引用一个目名而不是文件名的URL,使用哪个文件。l error-page error-page元素使得在返回特定HTTP码时,或者特定型的异常被抛出,能制定将要示的面。l taglib taglib元素对标记库描述符文件(Tag Libraryu Descriptor file)指定名。此功能使你能更改TLD文件的位置,而不用编辑使用些文件的JSP面。l resource-env-ref resource-env-ref元素声明与源相的一个管理象。l resource-ref resource-ref元素声明一个源工厂使用的外部源。l security-constraint security-constraint元素制定应该URL。它与login-config元素合使用l login-config login-config元素来指定服应该样给试图访问受保护页面的用。它与sercurity-constraint元素合使用。l security-role security-role元素出安全角色的一个列表,些角色将出servlet元素内的security-role-ref元素的role-name子元素中。地声明角色可使高IDE理安全信息更容易。l env-entry env-entry元素声明Web用的l ejb-ref ejb-ref元素声明一个EJB的主目的引用。l ejb-local-ref ejb-local-ref元素声明一个EJB的本地主目用。3 分配名称和定制的ULweb.xml中完成的一个最常的任servletJSP出名称和定制的URLservlet元素分配名称,使用servlet-mapping元素将定制的URL分配的名称相关联3.1 分配名称了提供初始化参数,servletJSP面定一个定制URL或分配一个安全角色,必首先servletJSP面一个名称。可通 servlet元素分配一个名称。最常的格式包括servlet-nameservlet-class子元素(在web-app元素内),如下所示:<servlet><servlet-name>Test</servlet-name><servlet-class>moreservlets.TestServlet</servlet-class></servlet> 表示位于WEB-INF/classes/moreservlets/TestServletservlet得到了注册名Test servlet一个名称具有两个主要的含。首先,初始化参数、定制的URL模式以及其他定制通此注册名而不是名引用此servlet。其次,可在 URL而不是名中使用此名称。因此,利用出的定URL http://host/webAppPrefix/servlet/Test可用于http://host/webAppPrefix/servlet/moreservlets.TestServlet所。请记住:XML元素不是大小写敏感的,而且定的次序也很重要。例如,web-app元素内所有servlet元素必位于所有servlet- mapping元素(下一小)之前,而且要位于5.65.11节讨论的与过滤器或文档相的元素(如果有的)之前。似地,servlet servlet-name子元素也必servlet-class之前。5.2"部署描述符文件内的元素次序"详细绍这种必需的次序。例如,程序清5-1出了一个名TestServlet简单servlet,它留在moreservlets程序包中。因servlet是扎根在一个名deployDemo的目中的Web用的成部分,所以TestServlet.class放在deployDemo/WEB- INF/classes/moreservlets中。程序清5-2出将放置在deployDemo/WEB-INF/内的web.xml文件的一部分。此web.xml文件使用servlet-nameservlet-class元素将名称TestTestServlet.class关联 5-15-2别显示利用缺省URL和注册名TestServlet果。程序清5-1 TestServlet.javapackage moreservlets;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;/** Simple servlet used to illustrate servlet naming* and custom URLs.* <P>* Taken from More Servlets and JavaServer Pages* from Prentice Hall and Sun Microsystems Press,* http://www.moreservlets.com/.* © 2002 Marty Hall; may be freely used or adapted.*/public class TestServlet extends HttpServlet {public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();String uri = request.getRequestURI();out.println(ServletUtilities.headWithTitle("Test Servlet") +"<BODY BGCOLOR=/"#FDF5E6/">/n" +"<H2>URI: " + uri + "</H2>/n" +"</BODY></HTML>");}}程序清5-2 web.xmlservlet名称的摘<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-appPUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd"><web-app><!-- … --><servlet><servlet-name>Test</servlet-name><servlet-class>moreservlets.TestServlet</servlet-class></servlet><!-- … --></web-app>3.2 定制的URL大多数服器具有一个缺省的serlvet URLhttp://host/webAppPrefix/servlet/packageName.ServletName然在开发中使用URL很方便,但是我常常会希望另一个URL用于部署。例如,可能会需要一个出Web顶层URL(如,http: //host/webAppPrefix/Anyname),并且在此URL中没有servlet。位于顶层URL化了相URL的使用。此外,对许开发顶层URL看上去比更更麻的缺省URL短。上,有需要使用定制的URL。比如,你可能想关闭缺省URL映射,以便更好地施安全限制或防止用意外地访问无初始化参数的servlet。如果你禁止了缺省的URL,那你怎样访问servlet呢?这时只有使用定制的URL了。了分配一个定制的URL,可使用servlet-mapping元素及其servlet-nameurl-pattern子元素。Servlet- name元素提供了一个任意名称,可利用此名称引用相servleturl-pattern描述了相Web用的根目URLurl- pattern元素的以斜杠(/)起始。下面出一个简单web.xml,它允使用URL http://host/webAppPrefix/UrlTest而不是http://host/webAppPrefix/servlet/Testhttp: //host/webAppPrefix/servlet/moreservlets.TestServlet注意,仍然需要XML DOCTYPE声明以及web-app元素。此外,可回一下,XML元素出地次序不是随意的。特是,需要把所有servlet元素放在所有 servlet-mapping元素之前。<servlet><servlet-name>Test</servlet-name><servlet-class>moreservlets.TestServlet</servlet-class></servlet><!-- ... --><servlet-mapping><servlet-name>Test</servlet-name><url-pattern>/UrlTest</url-pattern></servlet-mapping>URL模式可以包含通配符。例如,下面的小程序指示服送所有以Web用的URL缀开始,以..asp束的求到名BashMSservlet<servlet><servlet-name>BashMS</servlet-name><servlet-class>msUtils.ASPTranslator</servlet-class></servlet><!-- ... --><servlet-mapping><servlet-name>BashMS</servlet-name><url-pattern>/*.asp</url-pattern></servlet-mapping>3.3 命名JSPJSP面要转换sevlet,自然希望就像命名servlet命名JSP面。竟,JSP面可能会从初始化参数、安全置或定制的URL中受益,正如普通的serlvetJSP面的后台实际上是servlet是正确的,但存在一个关键的猜疑:即,你不知道JSP面的实际类名(因自己挑选这个名字)。因此,了命名JSP面,可将jsp-file元素替换为servlet-calss元素,如下所示:<servlet><servlet-name>Test</servlet-name><jsp-file>/TestPage.jsp</jsp-file></servlet>命名JSP面的原因与命名servlet的原因完全相同:即了提供一个与定制置(如,初始化参数和安全置)一起使用的名称,并且,以便能更改激活 JSP面的URL(比方,以便多个URL相同面得以理,或者从URL中去掉.jsp展名)。但是,在置初始化参数应该注意,JSP面是利用jspInit方法,而不是init方法取初始化参数的。例如,程序清5-3出一个名TestPage.jsp简单JSP面,它的工作只是打印出用来激活它的URL的本地部分。TestPage.jsp放置在deployDemo用的顶层。程序清5-4出了用来分配一个注册名PageName,然后将此注册名与http://host/webAppPrefix/UrlTest2/anything形式的URL关联web.xml文件(即,deployDemo/WEB-INF/web.xml)的一部分。程序清5-3 TestPage.jsp<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE>JSP Test Page</TITLE></HEAD><BODY BGCOLOR="#FDF5E6"><H2>URI: <%= request.getRequestURI() %></H2></BODY></HTML>程序清5-4 web.xmlJSP命名的摘<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-appPUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd"><web-app><!-- ... --><servlet><servlet-name>PageName</servlet-name><jsp-file>/TestPage.jsp</jsp-file></servlet><!-- ... --><servlet-mapping><servlet-name> PageName </servlet-name><url-pattern>/UrlTest2/*</url-pattern></servlet-mapping><!-- ... --></web-app>4 禁止激活器servletservletJSP面建立定制URL的一个原因是,这样做可以注册从 initservlet)或jspInitJSP面)方法中取得初始化参数。但是,初始化参数只在是利用定制URL模式或注册名访问 servletJSP可以使用,用缺省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.xmlJSP命名的摘<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-appPUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd"><web-app><!-- ... --><servlet><servlet-name>Sorry</servlet-name><servlet-class>moreservlets.SorryServlet</servlet-class></servlet><!-- ... --><servlet-mapping><servlet-name> Sorry </servlet-name><url-pattern>/servlet/*</url-pattern></servlet-mapping><!-- ... --></web-app>程序清5-6 SorryServlet.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.* <P>* Taken from More Servlets and JavaServer Pages* from Prentice Hall and Sun Microsystems Press,* http://www.moreservlets.com/.* © 2002 Marty Hall; may be freely used or adapted.*/public class SorryServlet extends HttpServlet {public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();String title = "Invoker Servlet Disabled.";out.println(ServletUtilities.headWithTitle(title) +"<BODY BGCOLOR=/"#FDF5E6/">/n" +"<H2>" + title + "</H2>/n" +"Sorry, access to servlets by means of/n" +"URLs that begin with/n" +"http://host/webAppPrefix/servlet//n" +"has been disabled./n" + "</BODY></HTML>");}public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}4.2 全局禁止激活器:TomcatTomcat 4中用来关闭缺省URL的方法与Tomcat 3中所用的很不相同。下面介绍这方法:1.禁止激活器: Tomcat 4Tomcat 4用与前面相同的方法关闭激活器servlet,即利用web.xml中的url-mapping元素关闭。不同之在于Tomcat使用了放在 install_dir/conf中的一个服用的全局web.xml文件,而前面使用的是存放在Web用的WEB-INF中的 web.xml文件。因此,了在Tomcat 4关闭激活器servlet,只需在install_dir/conf/web.xml简单地注/servlet/* URL映射即可,如下所示:<!-- <servlet-mapping><servlet-name>invoker</servlet-name><url-pattern>/servlet/*</url-pattern></servlet-mapping>-->再次提醒,应该注意是位于存放在install_dir/confTomcat用的web.xml文件中的,此文件不是存放在Web用的WEB-INF中的web.xml2.禁止激活器:Tomcat3Apache Tomcat的版本3中,通install_dir/conf/server.xml中注InvokerInterceptor全局禁止缺省 servlet URL。例如,下面是禁止使用缺省servlet URLserver.xml文件的一部分。<!-- <RequsetInterceptor className="org.apache.tomcat.request.InvokerInterceptor"debug="0" prefix="/servlet/" />-->5 初始化和servletJSP讨论控制servletJSP面的启的方法。特是,明了怎分配初始化参数以及怎更改服器生存期中装servletJSP面的刻。5.1 分配servlet初始化参数利用init-param元素向servlet提供初始化参数,init-param元素具有param-nameparam-value子元素。例如,在下面的例子中,如果initServlet servlet是利用它的注册名(InitTest访问的,它将能从其方法中getServletConfig(). getInitParameter("param1")"Value 1"getServletConfig().getInitParameter("param2")"2"<servlet><servlet-name>InitTest</servlet-name><servlet-class>moreservlets.InitServlet</servlet-class><init-param><param-name>param1</param-name><param-value>value1</param-value></init-param><init-param><param-name>param2</param-name><param-value>2</param-value></init-param></servlet>及初始化参数,有几点需要注意:l 返回GetInitParameter的返回值总是一个String。因此,在前一个例子中,可param2使用Integer.parseInt得一个intl JSP中的初始化。JSP面使用jspInit而不是initJSP需要使用jsp-file元素代替servlet-classl 缺省URL。初始化参数只在通的注册名或与它注册名相的定制URL模式访问Servlet可以使用。因此,在个例子中,param1 param2初始化参数将能在使用URL http://host/webAppPrefix/servlet/InitTest可用,但在使用URL http://host/webAppPrefix/servlet/myPackage.InitServlet不能使用。例如,程序清5-7出一个名InitServlet简单servlet,它使用init方法firstNameemailAddress字段。程序清5-8出分配名称InitTestservletweb.xml文件。程序清5-7 InitServlet.javapackage moreservlets;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;/** Simple servlet used to illustrate servlet* initialization parameters.* <P>* Taken from More Servlets and JavaServer Pages* from Prentice Hall and Sun Microsystems Press,* http://www.moreservlets.com/.* © 2002 Marty Hall; may be freely used or adapted.*/public class InitServlet extends HttpServlet {private String firstName, emailAddress;public void init() {ServletConfig config = getServletConfig();firstName = config.getInitParameter("firstName");emailAddress = config.getInitParameter("emailAddress");}public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();String uri = request.getRequestURI();out.println(ServletUtilities.headWithTitle("Init Servlet") +"<BODY BGCOLOR=/"#FDF5E6/">/n" +"<H2>Init Parameters:</H2>/n" +"<UL>/n" +"<LI>First name: " + firstName + "/n" +"<LI>Email address: " + emailAddress + "/n" +"</UL>/n" + "</BODY></HTML>");}}程序清5-8 web.xml明初始化参数的摘<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-appPUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd"><web-app><!-- ... --><servlet><servlet-name>InitTest</servlet-name><servlet-class>moreservlets.InitServlet</servlet-class><init-param><param-name>firstName</param-name><param-value>Larry</param-value></init-param><init-param><param-name>emailAddress</param-name><param-value>Ellison@Microsoft.com</param-value></init-param></servlet><!-- ... --></web-app>5.2 分配JSP初始化参数JSP面提供初始化参数在三个方面不同于servlet提供初始化参数。1)使用jsp-file而不是servlet-class。因此,WEB-INF/web.xml文件的servlet元素如下所示:<servlet><servlet-name>PageName</servlet-name><jsp-file>/RealPage.jsp</jsp-file><init-param><param-name>...</param-name><param-value>...</param-value></init-param>...</servlet>2) 几乎是分配一个明确的URL模式。servlet,一般相地使用以http://host/webAppPrefix/servlet/始的缺省URL。只需住,使用注册名而不是原名称即可。这对JSP面在技上也是合法的。例如,在上面出的例子中,可用URL http://host/webAppPrefix/servlet/PageName访问RealPage.jsp初始化参数具有访问权的版本。但在用于JSP多用似乎不喜欢应用常servletURL。此外,如果 JSP面位于服其提供了目的目中(如,一个既没有index.html也没有index.jsp文件的目),可能会接到此 JSP面,单击它,从而意外地激活未初始化的面。因此,好的法是使用url-pattern5.3)将JSP面的原URL与注册的 servlet名相关联这样,客机可使用JSP面的普通名称,但仍然激活定制的版本。例如,定来自1servlet,可使用下面的 servlet-mapping<servlet-mapping><servlet-name>PageName</servlet-name><url-pattern>/RealPage.jsp</url-pattern></servlet-mapping>3JSP使用jspInit而不是init。自JSP面建立的servlet使用了inti方法。因此,使用JSP声明提供一个init方法是不合法的,必制定jspInit方法。明初始化JSP面的程,程序清5-9出了一个名InitPage.jspJSP面,它包含一个jspInit方法且放置于 deployDemo Web构的顶层。一般,http://host/deployDemo/InitPage.jsp形式的URL将激活此面的不具有初始化参数访问权的版本,从而将firstNameemailAddressnull。但是, web.xml文件(程序清5-10)分配了一个注册名,然后将注册名与URL模式/InitPage.jsp关联程序清5-9 InitPage.jsp<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE>JSP Init Test</TITLE></HEAD><BODY BGCOLOR="#FDF5E6"><H2>Init Parameters:</H2><UL><LI>First name: <%= firstName %><LI>Email address: <%= emailAddress %></UL></BODY></HTML><%!private String firstName, emailAddress;public void jspInit() {ServletConfig config = getServletConfig();firstName = config.getInitParameter("firstName");emailAddress = config.getInitParameter("emailAddress");}%>程序清5-10 web.xmlJSP面的init参数的摘<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-appPUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd"><web-app><!-- ... --><servlet><servlet-name>InitPage</servlet-name><jsp-file>/InitPage.jsp</jsp-file><init-param><param-name>firstName</param-name><param-value>Bill</param-value></init-param><init-param><param-name>emailAddress</param-name><param-value>gates@oracle.com</param-value></init-param></servlet><!-- ... --> <servlet-mapping><servlet-name> InitPage</servlet-name><url-pattern>/InitPage.jsp</url-pattern></servlet-mapping><!-- ... --></web-app>5.3 提供用范内的初始化参数一般,对单个地servletJSP面分配初始化参数。指定的servletJSP面利用ServletConfiggetInitParameter方法些参数。但是,在某些情形下,希望提供可由任意servletJSP面借助ServletContextgetInitParameter方法取的系内的初始化参数。可利用context-param元素声明些系内的初始化context-param元素应该包含param-nameparam-value以及可description子元素,如下所示:<context-param><param-name>support-email</param-name><param-value>blackhole@mycompany.com</param-value></context-param>可回一下,了保可移植性,web.xml内的元素必以正确的次序声明。但应该注意,context-param元素必任意与文档有的元素(icondisplay-namedescription)之后及filterfilter-mappinglistener servlet元素之前。5.4 在服器启动时servlet假如servletJSP面有一个要花很长时间执行的init servlet)或jspInitJSP)方法。例如,假如initjspInit方法从某个数据ResourceBundle量。这种情况下,在第一个客servlet的缺省行一个客较长时间的延。因此,可利用servletload-on- startup元素定服器在第一次启动时servlet。下面是一个例子。<servlet><servlet-name> … </servlet-name><servlet-class> … </servlet-class> <!-- Or jsp-file --><load-on-startup/></servlet>可以此元素体提供一个整数而不是使用一个空的load-on-startup。想法是服应该在装载较大数目的servletJSP面之前装载较少数目的servletJSP面。例如,下面的servlet(放置在Web用的WEB-INF下的web.xml文件中的web-app元素内)将指示服器首先装和初始化SearchServlet,然后装和初始化由位于Web用的result中的index.jsp文件生的 servlet<servlet><servlet-name>Search</servlet-name><servlet-class>myPackage.SearchServlet</servlet-class> <!-- Or jsp-file --><load-on-startup>1</load-on-startup></servlet><servlet><servlet-name>Results</servlet-name><servlet-class>/results/index.jsp</servlet-class> <!-- Or jsp-file --><load-on-startup>2</load-on-startup></servlet>6 声明过滤servlet版本2.3引入了过滤器的概念。然所有支持servlet API版本2.3的服器都支持过滤器,但了使用与过滤器有的元素,必web.xml中使用版本2.3DTD过滤器可截取和修改入一个servletJSP面的求或从一个servletJSP出的相。在行一个servletJSP面之前,必须执行第一个相过滤器的doFilter方法。在该过滤FilterChaindoFilter中的下一个过滤器。如果没有其他过滤servletJSP面被行。过滤器具有到来的ServletRequest象的全部访问权,因此,它可以看客机名、找到来的cookie等。访问servletJSP面的出,过滤器可将响应对象包裹在一个替身象(stand-in object)中,比方出累加到一个冲区。在FilterChain象的doFilter方法之后,过滤器可检查缓冲区,如有必要,就行修改,然后送到客机。例如,程序清5-11帝国以了一个简单过滤器,只要访问servletJSP面,它就截取求并在出上打印一个告(开发过程中在桌面系上运行,大多数服器都可以使用过滤器)。程序清5-11 ReportFilter.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.* <P>* Taken from More Servlets and JavaServer Pages* from Prentice Hall and Sun Microsystems Press,* http://www.moreservlets.com/.* © 2002 Marty Hall; may be freely used or adapted.*/public class ReportFilter implements Filter {public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws ServletException, IOException {HttpServletRequest req = (HttpServletRequest)request;System.out.println(req.getRemoteHost() +" tried to access " +req.getRequestURL() +" on " + new Date() + ".");chain.doFilter(request,response);}public void init(FilterConfig config)throws ServletException {}public void destroy() {}}一旦建立了一个过滤器,可以在web.xml中利用filter元素以及filter-name(任意名称)、file-class(完全限定的名)和(可的)init-params子元素声明它。注意,元素在web.xmlweb-app元素中出的次序不是任意的;允器(但不是必需的)制所需的次序,并且实际中有些服器也是这样做的。但里要注意,所有filter元素必在任意filter-mapping元素之前, filter-mapping元素又必在所servletservlet-mapping元素之前。例如,定上述的ReportFilter,可在web.xml中作出下面的filter声明。它把名称Reporter实际ReportFilter(位于moreservlets程序包中)相关联<filter><filter-name>Reporter</filter-name><filter-class>moresevlets.ReportFilter</filter-class></filter>一旦命名了一个过滤器,可利用filter-mapping元素把它与一个或多个servletJSP面相关联于此工作有两种选择首先,可使用filter-nameservlet-name子元素把此过滤器与一个特定的servlet名(此servlet名必稍后在相同的 web.xml文件中使用servlet元素声明)关联。例如,下面的程序片断指示系只要利用一个定制的URL访问SomeServletName servletJSP面,就运行名Reporter过滤器。<filter-mapping><filter-name>Reporter</filter-name><servlet-name>SomeServletName</servlet-name></filter-mapping>其次,可利用filter-nameurl-pattern子元素将过滤器与一servletJSP面或静内容相关联。例如,相面的程序片段指示系只要访问Web用中的任意URL,就运行名Reporter过滤器。<filter-mapping><filter-name>Reporter</filter-name><url-pattern>/*</url-pattern></filter-mapping>例如,程序清5-12出了将ReportFilter过滤器与名PageNameservlet关联web.xml文件的一部分。名字 PageName依次又与一个名TestPage.jspJSP面以及以模式http: //host/webAppPrefix/UrlTest2/ 开头URL关联TestPage.jsp的源代JSP面命名的谈论在前面的3"分配名称和定制的URL"出。事上,程序清5- 12中的servletservlet-name该节原封不地拿来的。web.xml,可看到下面的出形式的调试报告(行是了容易阅读)。audit.irs.gov tried to access http://mycompany.com/deployDemo/UrlTest2/business/tax-plan.htmlon Tue Dec 25 13:12:29 EDT 2001.程序清5-12 Web.xmlfilter用法的摘<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-appPUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd"><web-app><filter><filter-name>Reporter</filter-name><filter-class>moresevlets.ReportFilter</filter-class></filter><!-- ... --><filter-mapping><filter-name>Reporter</filter-name><servlet-name>PageName</servlet-name></filter-mapping><!-- ... --><servlet><servlet-name>PageName</servlet-name><jsp-file>/RealPage.jsp</jsp-file></servlet><!-- ... --><servlet-mapping><servlet-name> PageName </servlet-name><url-pattern>/UrlTest2/*</url-pattern></servlet-mapping><!-- ... --></web-app>7 指定假如用提供了一个像http: //host/webAppPrefix/directoryName/ 这样的包含一个目名但没有包含文件名的URL,会生什事情呢?用能得到一个目表?一个错误准文件的内容?如果得到准文件内容,是 index.htmlindex.jspdefault.htmldefault.htm的什么东西呢?Welcome-file-list 元素及其助的welcome-file元素解决了个模糊的问题。例如,下面的web.xml指出,如果一个URL出一个目名但未出文件名,服应该首先index.jsp,然后再index.html。如果两者都没有找到,则结果有于所用的服器(如一个目列表)。<welcome-file-list><welcome-file>index.jsp</welcome-file><welcome-file>index.html</welcome-file></welcome-file-list>多服器缺省遵循这种,但不一定必须这样。因此,明确地使用welcom-file-list可移植性是一良好的习惯8 指定错误在我了解到,你在开发servletJSP从不会犯错误,而且你的所有面是那的清晰,一般的程序都不会被它的搞糊涂。但是,是人会犯错误的,用可能会提供不合定的参数,使用不正确的URL或者不能提供必需的表字段。除此之外,其它开发可能不那么细心,他们应该有些工具来克服自己的不足。error-page元素就是用来克服问题的。它有两个可能的子元素,分是:error-codeexception- type。第一个子元素error-code指出在定的HTTP错误现时使用的URL。第二个子元素excpetion-type指出在出某个定的Java异常但未捕捉到使用的URLerror-codeexception-type都利用location元素指出相URL。此 URL/始。location所指出的位置面可通过查HttpServletRequest象的两个专门的属性来访问关错误信息,两个属性分是:javax.servlet.error.status_codejavax.servlet.error.message可回一下,在web.xml内以正确的次序声明web-app的子元素很重要。里只要住,error-pageweb.xml文件的末尾附近,servletservlet-namewelcome-file-list之后即可。8.1 error-code元素了更好地了解error-code元素的,可考一下如果不正确地入文件名,大多数站点会作出什反映。这样做一般会出一个404错误信息,它表示不能找到文件,但几乎没提供更多有用的信息。另一方面,可以一下在www.microsoft.comwww.ibm.com或者特是在www.bea.com处输出未知的文件名。是会得出有用的消息,些消息提供可选择的位置,以便找感趣的面。提供这样有用的错误页Web用来是很有价得。事rm-error-page子元素)。由form-login-page出的HTML具有一个j_security_check ACTION属性、一个名j_username的用名文本字段以及一个名j_password的口令字段。例如,程序清5-19指示服器使用基于表验证Web用的顶层中的一个名login.jsp面将收集用名和口令,并且失的登将由相同目中名login-error.jsp告。程序清5-19 web.xmllogin-config的摘<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-appPUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd"><web-app><!-- ... --><security-constraint> ... </security-constraint><login-config><auth-method> FORM </auth-method><form-login-config><form-login-page>/login.jsp</form-login-page><form-error-page>/login-error.jsp</form-error-page></form-login-config></login-config><!-- ... --></web-app>9.2 限制Web源的访问在,可以指示服器使用何种验证方法了。"了不起,"道,"除非我能指定一个来收到保 URL,否没有多大用"。指出URL明他们应该得到何正是security-constriaint元素的用途。此元素在 web.xml应该login-config前面。它包含是个可能的子元素,分是:web-resource-collection auth-constraintuser-data-constraintdisplay-name。下面各小节对们进行介l web-resource-collection此元素确定应该源。所有security-constraint元素都必包含至少一个web-resource-collection。此元素由一个出任意标识名称的web-resource-name元素、一个确定应该URLurl-pattern元素、一个指出此保所适用的 HTTP命令(GETPOST等,缺省所有方法)的http-method元素和一个提供料的可description元素成。例如,下面的 Web-resource-collection(在security-constratint元素内)指出Web用的proprietary中所有文档应该受到保<security-constraint><web-resource-coolection><web-resource-name>Proprietary</web-resource-name><url-pattern>/propritary/*</url-pattern></web-resource-coolection><!-- ... --></security-constraint>重要的是应该注意到,url-pattern适用于直接访问这源的客机。特是,它不适合于通MVC体系构利用 RequestDispatcher访问面,或者不适合于利用jsp:forward的手段来访问面。这种不匀称如果利用得当的很有好。例如,servlet可利用MVC体系找数据,把它放到bean中,求到从bean中提取数据的JSP面并示它。我希望保决不直接访问受保JSP面,而只是通建立该页面将使用的beanservlet访问它。url-patternauth-contraint元素可通声明不允任何用直接访问JSP面来提供这种。但是,这种不匀称的行可能让开发放松警惕,使他偶然对应受保源提供不受限制的访问 l auth-constraint尽管web-resource-collention元素出了哪些URL应该受到保,但是auth-constraint元素却指出哪些用户应该具有受保护资源的访问权。此元素应该包含一个或多个标识具有访问权限的用户类别role- name元素,以及包含(可)一个描述角色的description元素。例如,下面web.xml中的security-constraint元素部门规定只有指定AdministratorBig Kahuna(或两者)的用具有指定源的访问权<security-constraint><web-resource-coolection> ... </web-resource-coolection><auth-constraint><role-name>administrator</role-name><role-name>kahuna</role-name></auth-constraint></security-constraint>重要的是认识到,到此止,程的可移植部分束了。服器怎确定哪些用户处于任何角色以及它怎存放用的口令,完全有于具体的系例如,Tomcat使用install_dir/conf/tomcat-users.xml将用名与角色名和口令相关联,正如下面例子中所示,它指出用joe(口令bigshot)和jane(口令enaj)属于administratorkahuna角色。<tomcat-users><user name="joe" password="bigshot" roles="administrator,kahuna" /><user name="jane" password="enaj" roles="kahuna" /></tomcat-users>l user-data-constraint个可的元素指出在访问关资使用任何传输层。它必包含一个transport-guarantee子元素(合法值为NONE INTEGRALCONFIDENTIAL),并且可地包含一个description元素。transport-guaranteeNONE所用的通讯协议不加限制。INTEGRAL表示数据必以一防止截取它的人阅读它的方式送。然原理上(并且在未来的HTTP版本中),在 INTEGRALCONFIDENTIAL可能会有差,但在当前践中,他都只是简单地要求用SSL。例如,下面指示服器只允许对关资源做 HTTPS接:<security-constraint><!-- ... --><user-data-constraint><transport-guarantee>CONFIDENTIAL</transport-guarantee></user-data-constraint></security-constraint>l display-namesecurity-constraint个很少使用的子元素予可能由GUI工具使用的安全一个名称。9.3 分配角色名迄今止,讨论集中到完全由容器(服器)理的安全问题之上了。但servlet以及JSP面也能够处理它自己的安全问题例如,容器可能允bigwigbigcheese角色访问一个示主管人员额紧贴面,但只允bigwig修改此面的参数。完成这种致的控制的一方法是HttpServletRequsetisUserInRole方法,并据此修改访问Servlet security-role-ref子元素提供出在服用口令文件中的安全角色名的一个名。例如,假如写了一个 request.isUserInRole"boss")的servlet,但后来servlet被用在了一个其口令文件用角色manager而不是boss的服器中。下面的程序段使servlet使用两个名称中的任何一个。<servlet><!-- ... --><security-role-ref><role-name>boss</role-name> <!-- New alias --><role-link>manager</role-link> <!-- Real name --></security-role-ref></servlet>也可以在web-app内利用security-role元素提供将出role-name元素中的所有安全角色的一个全局列表。分地生命角色使高IDE容易理安全信息。10 控制会如果某个会在一定的时间内未被访问,服器可把它扔掉以节约内存。可利用HttpSessionsetMaxInactiveInterval方法直接置个话对象的超时值。如果不采用这种方法,缺省的超时值由具体的服器决定。但可利用session-configsession- timeout元素来出一个适用于所有服器的明确的超时值。超时值,因此,下面的例子置缺省会时值为三个小180)。<session-config><session-timeout>180</session-timeout></session-config>11 Web用的文档化越来越多的开发环始提供servletJSP的直接支持。例子有Borland Jbuilder Enterprise EditionMacromedia UltraDevAllaire JRun Studio(写此文,已被Macromedia)以及IBM VisuaAge for Java等。大量的web.xml元素不设计的,而且视开发环设计的。它包括icondisplay-namediscription等。可回一下,在web.xml内以适当地次序声明web-app子元素很重要。不里只要icondisplay-namedescriptionweb.xmlweb-app元素内的前三个合法元素即可。l iconicon元素指出GUI工具可用来代表Web用的一个和两个像文件。可利用small-icon元素指定一幅16 x 16GIFJPEG像,用large-icon元素指定一幅32 x 32像。下面一个例子: <icon><small-icon>/images/small-book.gif</small-icon><large-icon>/images/tome.jpg</large-icon></icon>l display-namedisplay-name元素提供GUI工具可能会用来标记Web用的一个名称。下面是个例子。<display-name>Rare Books</display-name>l descriptiondescription元素提供解性文本,如下所示:<description>This Web application represents the store developed forrare-books.com, an online bookstore specializing in rareand limited-edition books.</description>12 关联文件与MIME器一般都具有一种让Web站点管理将文件展名与媒体相关联的方法。例如,将会自动给予名mom.jpg的文件一个image/jpegMIME 型。但是,假如你的Web用具有几个不常的文件,你希望保送到客分配MIME型。mime-mapping元素(具有 extensionmime-type子元素)可提供这种。例如,下面的代指示服器将application/x-fubarMIME型分配所有以.foo尾的文件。<mime-mapping><extension>foo</extension><mime-type>application/x-fubar</mime-type></mime-mapping>,你的Web用希望重override准的映射。例如,下面的代将告器在送到客指定.ps文件作为纯文本(text/plain)而不是作PostScriptapplication/postscript)。<mime-mapping><extension>ps</extension><mime-type>application/postscript</mime-type></mime-mapping>13 定位TLDJSP taglib元素具有一个必要的uri属性,它出一个TLDTag Library Descriptor)文件相Web用的根的位置。TLD文件的实际名称在布新的标签库版本可能会改,但我希望避免更改所有JSP面。此外,可能希望使用保持taglib元素的简练性的一个短的uri就是部署描述符文件的taglib元素派用的所在了。Taglib包含两个子元素:taglib-uritaglib-locationtaglib-uri元素应该与用于JSP taglib元素的uri属性的西相匹配。Taglib-location元素TLD文件的实际位置。例如,假如你将文件chart-tags- 1.3beta.tld放在WebApp/WEB-INF/tlds中。在,假如web.xmlweb-app元素内包含下列内容。<taglib><taglib-uri>/charts.tld</taglib-uri><taglib-location>/WEB-INF/tlds/chart-tags-1.3beta.tld</taglib-location></taglib>明后,JSP面可通下面的化形式使用标签库<%@ taglib uri="/charts.tld" prefix="somePrefix" %>14 指定用事件听程序用事件听器程序是建立或修改servlet境或会话对通知的。它servlet范的版本2.3中的新内容。里只简单明用来向Web用注册一个听程序的web.xml的用法。注册一个听程序及在web.xmlweb-app元素内放置一个listener元素。在listener元素内,listener-class元素列出听程序的完整的限定名,如下所示:<listener><listener-class>package.ListenerClass</listener-class></listener>listener元素的构很简单,但不要忘,必正确地web-app元素内的子元素的次序。listener元素位于所有的servlet 元素之前以及所有filter-mapping元素之后。此外,因为应用生存期听程序是serlvet范的2.3版本中的新内容,所以必使用 web.xml DTD2.3版本,而不是2.2版本。例如,程序清5-20出一个名ContextReporter简单听程序,只要Web用的Servlet-Context建立(如装Web用)或消除(如服关闭,它就在出上示一条消息。程序清5-21出此听程序注册所需要的web.xml文件的一部分。程序清5-20 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.* <P>* Taken from More Servlets and JavaServer Pages* from Prentice Hall and Sun Microsystems Press,* http://www.moreservlets.com/.* © 2002 Marty Hall; may be freely used or adapted.*/public class ContextReporter implements ServletContextListener {public void contextInitialized(ServletContextEvent event) {System.out.println("Context created on " +new Date() + ".");}public void contextDestroyed(ServletContextEvent event) {System.out.println("Context destroyed on " +new Date() + ".");}}程序清5-21 web.xml(声明一个听程序的摘<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-appPUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd"><web-app><!-- ... --><filter-mapping> … </filter-mapping><listener><listener-class>package.ListenerClass</listener-class></listener><servlet> ... </servlet><!-- ... --></web-app>15 J2EE元素描述用作J2EE成部分的Web用的web.xml元素。里将提供一个明的介详细内容可以参http://java.sun.com/j2ee/j2ee-1_3-fr-spec.pdfJava 2 Plantform Enterprise Edition版本1.3范的第5章。l distributabledistributable 元素指出,Web用是以这样的方式程的:即,支持集群的服器可安全地在多个服器上分布Web用。例如,一个可分布的用必只使用 Serializable象作HttpSession象的属性,而且必避免用量(字段)来实现性。distributable元素直接出discription元素之后,并且不包含子元素或数据,它只是一个如下的志。<distributable />l resource-env-refresource -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-entryenv -entry元素声明Web用的。它由一个可description元素、一个env-entry-name元素(一个相java: comp/envJNDI名)、一个env-entry-value元素(项值)以及一个env-entry-type元素(java.lang程序包中一个型的完全限定名,java.lang.Booleanjava.lang.String等)成。下面是一个例子:<env-entry><env-entry-name>minAmout</env-entry-name><env-entry-value>100.00</env-entry-value><env-entry-type>minAmout</env-entry-type></env-entry>l ejb-refejb -ref元素声明一个EJB的主目用。它由一个可description元素、一个ejb-ref-name元素(相java: comp/envEJB用)、一个ejb-ref-type元素(bean型,EntitySession)、一个home元素(bean的主目接口的完全限定名)、一个remote元素(bean程接口的完全限定名)以及一个可ejb-link元素(当前bean接的另一个 bean的名称)成。l ejb-local-refejb-local-ref元素声明一个EJB的本地主目的引用。除了用local-home代替home外,此元素具有与ejb-ref元素相同的属性并以相同的方式使用


    最新回复(0)