关于web.xml配置的详细说明(二)

/n" +" /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页面时,许多用户似乎不喜欢应用常规的servlet的URL。此外,如果 JSP页面位于服务器为其提供了目录清单的目录中(如,一个既没有 index.html也没有index.jsp文件的目录),则用户可能会连接到此 JSP页面,单击它,从而意外地激活未初始化的页面。因此,好的办法是使用url-pattern(5.3节)将JSP页面的原URL与注册的 servlet名相关联。这样,客户机可使用JSP页面的普通名称,但仍然激活定制的版本。例如,给定来自项目1的servlet定义,可使用下面的 servlet-mapping定义:<servlet-mapping><servlet-name>PageName</servlet-name><url-pattern>/RealPage.jsp</url-pattern></servlet-mapping>3)JSP页使用jspInit而不是init。自动从JSP页面建立的servlet或许已经使用了inti方法。因此,使用JSP声明提供一个init方法是不合法的,必须制定jspInit方法。为了说明初始化JSP页面的过程,程序清单5-9给出了一个名为InitPage.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"></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 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 提供应用范围内的初始化参数一般,对单个地servlet或JSP页面分配初始化参数。指定的servlet或JSP页面利用ServletConfig的 getInitParameter方法读取这些参数。但是,在某些情形下,希望提供可由任意servlet或JSP页面借助ServletContext 的getInitParameter方法读取的系统范围内的初始化参数。可利用context-param元素声明这些系统范围内的初始化值。context-param元素应该包含param-name、param-value以及可选的descrīption子元素,如下所示:<context-param><param-name>support-email</param-name><param-value>blackhole@mycompany.com</param-value></context-param>可回忆一下,为了保证可移植性,web.xml内的元素必须以正确的次序声明。但这里应该注意,context-param元素必须出现任意与文档有关的元素(icon、display-name或descrīption)之后及filter、filter-mapping、listener或 servlet元素之前。5.4 在服务器启动时装载servlet假如servlet或JSP页面有一个要花很长时间执行的 init (servlet)或jspInit(JSP)方法。例如,假如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-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.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.*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值