国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

用web_xml控制Web應(yīng)用的行為(上)

2019-11-18 15:22:04
字體:
供稿:網(wǎng)友

  1 定義頭和根元素

部署描述符文件就像所有xml文件一樣,必須以一個(gè)XML頭開始。這個(gè)頭聲明可以使用的XML版本并給出文件的字符編碼。
DOCYTPE聲明必須立即出現(xiàn)在此頭之后。這個(gè)聲明告訴服務(wù)器適用的servlet規(guī)范的版本(如2.2或2.3)并指定治理此文件其余部分內(nèi)容的語法的DTD(Document Type Definition,文檔類型定義)。
所有部署描述符文件的頂層(根)元素為web-app。請注重,XML元素不像Html,他們是大小寫敏感的。因此,web-App和WEB-APP都是不合法的,web-app必須用小寫。

2 部署描述符文件內(nèi)的元素次序

XML元素不僅是大小寫敏感的,而且它們還對出現(xiàn)在其他元素中的次序敏感。例如,XML頭必須是文件中的第一項(xiàng),DOCTYPE聲明必須是第二項(xiàng),而web-app元素必須是第三項(xiàng)。在web-app元素內(nèi),元素的次序也很重要。服務(wù)器不一定強(qiáng)制要求這種次序,但它們答應(yīng)(實(shí)際上有些服務(wù)器就是這樣做的)完全拒絕執(zhí)行含有次序不正確的元素的Web應(yīng)用。這表示使用非標(biāo)準(zhǔn)元素次序的web.xml文件是不可移植的。
下面的列表給出了所有可直接出現(xiàn)在web-app元素內(nèi)的合法元素所必需的次序。例如,此列表說明servlet元素必須出現(xiàn)在所有servlet-mapping元素之前。請注重,所有這些元素都是可選的。因此,可以省略掉某一元素,但不能把它放于不正確的位置。
l icon icon元素指出IDE和GUI工具用來表示W(wǎng)eb應(yīng)用的一個(gè)和兩個(gè)圖像文件的位置。
l display-name display-name元素提供GUI工具可能會(huì)用來標(biāo)記這個(gè)特定的Web應(yīng)用的一個(gè)名稱。
l description description元素給出與此有關(guān)的說明性文本。
l context-param context-param元素聲明應(yīng)用范圍內(nèi)的初始化參數(shù)。
l filter 過濾器元素將一個(gè)名字與一個(gè)實(shí)現(xiàn)javax.servlet.Filter接口的類相關(guān)聯(lián)。
l filter-mapping 一旦命名了一個(gè)過濾器,就要利用filter-mapping元素把它與一個(gè)或多個(gè)servlet或jsp頁面相關(guān)聯(lián)。
l listener servlet API的版本2.3增加了對事件監(jiān)聽程序的支持,事件監(jiān)聽程序在建立、修改和刪除會(huì)話或servlet環(huán)境時(shí)得到通知。Listener元素指出事件監(jiān)聽程序類。
l servlet 在向servlet或JSP頁面制定初始化參數(shù)或定制URL時(shí),必須首先命名servlet或JSP頁面。Servlet元素就是用來完成此項(xiàng)任務(wù)的。
l servlet-mapping 服務(wù)器一般為servlet提供一個(gè)缺省的URL:http://host/webAppPRefix/servlet/ServletName。但是,經(jīng)常會(huì)更改這個(gè)URL,以便servlet可以訪問初始化參數(shù)或更輕易地處理相對URL。在更改缺省URL時(shí),使用servlet-mapping元素。
session-config 假如某個(gè)會(huì)話在一定時(shí)間內(nèi)未被訪問,服務(wù)器可以拋棄它以節(jié)省內(nèi)存。可通過使用HttpSession的setMaxInactiveInterval方法明確設(shè)置單個(gè)會(huì)話對象的超時(shí)值,或者可利用session-config元素制定缺省超時(shí)值。
l mime-mapping 假如Web應(yīng)用具有想到非凡的文件,希望能保證給他們分配特定的MIME類型,則mime-mapping元素提供這種保證。
l welcom-file-list welcome-file-list元素指示服務(wù)器在收到引用一個(gè)目錄名而不是文件名的URL時(shí),使用哪個(gè)文件。
l error-page error-page元素使得在返回特定HTTP狀態(tài)代碼時(shí),或者特定類型的異常被拋出時(shí),能夠制定將要顯示的頁面。
l taglib taglib元素對標(biāo)記庫描述符文件(Tag Libraryu Descriptor file)指定別名。此功能使你能夠更改TLD文件的位置,而不用編輯使用這些文件的JSP頁面。
l resource-env-ref resource-env-ref元素聲明與資源相關(guān)的一個(gè)治理對象。
l resource-ref resource-ref元素聲明一個(gè)資源工廠使用的外部資源。
l security-constraint security-constraint元素制定應(yīng)該保護(hù)的URL。它與login-config元素聯(lián)合使用
l login-config 用login-config元素來指定服務(wù)器應(yīng)該怎樣給試圖訪問受保護(hù)頁面的用戶授權(quán)。它與sercurity-constraint元素聯(lián)合使用。
l security-role security-role元素給出安全角色的一個(gè)列表,這些角色將出現(xiàn)在servlet元素內(nèi)的security-role-ref元素的role-name子元素中。分別地聲明角色可使高級IDE處理安全信息更為輕易。
l env-entry env-entry元素聲明Web應(yīng)用的環(huán)境項(xiàng)。
l ejb-ref ejb-ref元素聲明一個(gè)EJB的主目錄的引用。
l ejb-local-ref ejb-local-ref元素聲明一個(gè)EJB的本地主目錄的應(yīng)用。

3 分配名稱和定制的UL

在web.xml中完成的一個(gè)最常見的任務(wù)是對servlet或JSP頁面給出名稱和定制的URL。用servlet元素分配名稱,使用servlet-mapping元素將定制的URL與剛分配的名稱相關(guān)聯(lián)。
3.1 分配名稱
為了提供初始化參數(shù),對servlet或JSP頁面定義一個(gè)定制URL或分配一個(gè)安全角色,必須首先給servlet或JSP頁面一個(gè)名稱。可通過servlet元素分配一個(gè)名稱。最常見的格式包括servlet-name和servlet-class子元素(在web-app元素內(nèi)),如下所示:
<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>moreservlets.TestServlet</servlet-class>
</servlet> 

這表示位于WEB-INF/classes/moreservlets/TestServlet的servlet已經(jīng)得到了注冊名Test。給servlet一個(gè)名稱具有兩個(gè)主要的含義。首先,初始化參數(shù)、定制的URL模式以及其他定制通過此注冊名而不是類名引用此servlet。其次,可在URL而不是類名中使用此名稱。因此,利用剛才給出的定義,URL http://host/webAppPrefix/servlet/Test 可用于 http://host/webAppPrefix/servlet/moreservlets.TestServlet 的場所。
請記住:XML元素不僅是大小寫敏感的,而且定義它們的次序也很重要。例如,web-app元素內(nèi)所有servlet元素必須位于所有servlet-mapping元素(下一小節(jié)介紹)之前,而且還要位于5.6節(jié)和5.11節(jié)討論的與過濾器或文檔相關(guān)的元素(假如有的話)之前。類似地,servlet的servlet-name子元素也必須出現(xiàn)在servlet-class之前。5.2節(jié)"部署描述符文件內(nèi)的元素次序"將具體介紹這種必需的次序。
例如,程序清單5-1給出了一個(gè)名為TestServlet的簡單servlet,它駐留在moreservlets程序包中。因?yàn)榇藄ervlet是扎根在一個(gè)名為deployDemo的目錄中的Web應(yīng)用的組成部分,所以TestServlet.class放在deployDemo/WEB-INF/classes/moreservlets中。程序清單5-2給出將放置在deployDemo/WEB-INF/內(nèi)的web.xml文件的一部分。此web.xml文件使用servlet-name和servlet-class元素將名稱Test與TestServlet.class相關(guān)聯(lián)。圖5-1和圖5-2分別顯示利用缺省URL和注冊名調(diào)用TestServlet時(shí)的結(jié)果。

程序清單5-1 TestServlet.java
package moreservlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/** Simple servlet used to illustrate servlet naming
* and custom URLs.
* <P>
* Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
* http://www.moreservlets.com/.
* ? 2002 Marty Hall; may be freely used or adapted.
*/

public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String uri = request.getRequestURI();
out.println(ServletUtilities.headWithTitle("Test Servlet") +
"<BODY BGCOLOR="#FDF5E6"> " +
"<H2>URI: " + uri + "</H2> " +
"</BODY></HTML>");
}
}

程序清單5-2 web.xml(說明servlet名稱的摘錄)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

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

3.2 定義定制的URL
大多數(shù)服務(wù)器具有一個(gè)缺省的serlvet URL:
http://host/webAppPrefix/servlet/packageName.ServletName。雖然在開發(fā)中使用這個(gè)URL很方便,但是我們經(jīng)常會(huì)希望另一個(gè)URL用于部署。例如,可能會(huì)需要一個(gè)出現(xiàn)在Web應(yīng)用頂層的URL(如,http://host/webAppPrefix/Anyname),并且在此URL中沒有servlet項(xiàng)。位于頂層的URL簡化了相對URL的使用。此外,對許多開發(fā)人員來說,頂層URL看上去比更長更麻煩的缺省URL更簡短。
事實(shí)上,有時(shí)需要使用定制的URL。比如,你可能想關(guān)閉缺省URL映射,以便更好地強(qiáng)制實(shí)施安全限制或防止用戶意外地訪問無初始化參數(shù)的servlet。假如你禁止了缺省的URL,那么你怎樣訪問servlet呢?這時(shí)只有使用定制的URL了。
為了分配一個(gè)定制的URL,可使用servlet-mapping元素及其servlet-name和url-pattern子元素。Servlet-name元素提供了一個(gè)任意名稱,可利用此名稱引用相應(yīng)的servlet;url-pattern描述了相對于Web應(yīng)用的根目錄的URL。url-pattern元素的值必須以斜杠(/)起始。
下面給出一個(gè)簡單的web.xml摘錄,它答應(yīng)使用URL http://host/webAppPrefix/UrlTest而不是http://host/webAppPrefix/servlet/Test或
http://host/webAppPrefix/servlet/moreservlets.TestServlet。請注重,仍然需要XML頭、DOCTYPE聲明以及web-app封閉元素。此外,可回憶一下,XML元素出現(xiàn)地次序不是隨意的。非凡是,需要把所有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模式還可以包含通配符。例如,下面的小程序指示服務(wù)器發(fā)送所有以Web應(yīng)用的URL前綴開始,以..asp結(jié)束的請求到名為BashMS的servlet。
<servlet>
<servlet-name>BashMS</servlet-name>
<servlet-class>msUtils.ASPTranslator</servlet-class>
</servlet>
<!-- ... -->
<servlet-mapping>
<servlet-name>BashMS</servlet-name>
<url-pattern>/*.asp</url-pattern>
</servlet-mapping>
3.3 命名JSP頁面
因?yàn)镴SP頁面要轉(zhuǎn)換成sevlet,自然希望就像命名servlet一樣命名JSP頁面。究竟,JSP頁面可能會(huì)從初始化參數(shù)、安全設(shè)置或定制的URL中受益,正如普通的serlvet那樣。雖然JSP頁面的后臺實(shí)際上是servlet這句話是正確的,但存在一個(gè)要害的猜疑:即,你不知道JSP頁面的實(shí)際類名(因?yàn)橄到y(tǒng)自己挑選這個(gè)名字)。因此,為了命名JSP頁面,可將jsp-file元素替換為servlet-calss元素,如下所示:
<servlet>
<servlet-name>Test</servlet-name>
<jsp-file>/TestPage.jsp</jsp-file>
</servlet>
命名JSP頁面的原因與命名servlet的原因完全相同:即為了提供一個(gè)與定制設(shè)置(如,初始化參數(shù)和安全設(shè)置)一起使用的名稱,并且,以便能更改激活JSP頁面的URL(比方說,以便多個(gè)URL通過相同頁面得以處理,或者從URL中去掉.jsp擴(kuò)展名)。但是,在設(shè)置初始化參數(shù)時(shí),應(yīng)該注重,JSP頁面是利用jspInit方法,而不是init方法讀取初始化參數(shù)的。
例如,程序清單5-3給出一個(gè)名為TestPage.jsp的簡單JSP頁面,它的工作只是打印出用來激活它的URL的本地部分。TestPage.jsp放置在deployDemo應(yīng)用的頂層。程序清單5-4給出了用來分配一個(gè)注冊名PageName,然后將此注冊名與http://host/webAppPrefix/UrlTest2/anything 形式的URL相關(guān)聯(lián)的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.xml(說明JSP頁命名的摘錄)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

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

4 禁止激活器servlet

對servlet或JSP頁面建立定制URL的一個(gè)原因是,這樣做可以注冊從init(servlet)或jspInit(JSP頁面)方法中讀取得初始化參數(shù)。但是,初始化參數(shù)只在是利用定制URL模式或注冊名訪問servlet或JSP頁面時(shí)可以使用,用缺省URL http://host/webAppPrefix/servlet/ServletName 訪問時(shí)不能使用。因此,你可能會(huì)希望關(guān)閉缺省URL,這樣就不會(huì)有人意外地調(diào)用初始化servlet了。這個(gè)過程有時(shí)稱為禁止激活器servlet,因?yàn)槎鄶?shù)服務(wù)器具有一個(gè)用缺省的servlet URL注冊的標(biāo)準(zhǔn)servlet,并激活缺省的URL應(yīng)用的實(shí)際servlet。
有兩種禁止此缺省URL的主要方法:
l 在每個(gè)Web應(yīng)用中重新映射/servlet/模式。
l 全局關(guān)閉激活器servlet。
重要的是應(yīng)該注重到,雖然重新映射每個(gè)Web應(yīng)用中的/servlet/模式比徹底禁止激活servlet所做的工作更多,但重新映射可以用一種完全可移植的方式來完成。相反,全局禁止激活器servlet完全是針對具體機(jī)器的,事實(shí)上有的服務(wù)器(如ServletExec)沒有這樣的選擇。下面的討論對每個(gè)Web應(yīng)用重新映射/servlet/ URL模式的策略。后面提供在Tomcat中全局禁止激活器servlet的具體內(nèi)容。
4.1 重新映射/servlet/URL模式
在一個(gè)特定的Web應(yīng)用中禁止以http://host/webAppPrefix/servlet/ 開始的URL的處理非常簡單。所需做的事情就是建立一個(gè)錯(cuò)誤消息servlet,并使用前一節(jié)討論的url-pattern元素將所有匹配請求轉(zhuǎn)向該servlet。只要簡單地使用:
<url-pattern>/servlet/*</url-pattern>
作為servlet-mapping元素中的模式即可。
例如,程序清單5-5給出了將SorryServlet servlet(程序清單5-6)與所有以http://host/webAppPrefix/servlet/ 開頭的URL相關(guān)聯(lián)的部署描述符文件的一部分。

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

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

程序清單5-6 SorryServlet.java
package moreservlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/** Simple servlet used to give error messages to
* users who try to access default servlet URLs
* (i.e., http://host/webAppPrefix/servlet/ServletName)
* in Web applications that have disabled this
* behavior.
* <P>
* Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
* http://www.moreservlets.com/.
* ? 2002 Marty Hall; may be freely used or adapted.
*/

public class SorryServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Invoker Servlet Disabled.";
out.println(ServletUtilities.headWithTitle(title) +
"<BODY BGCOLOR="#FDF5E6"> " +
"<H2>" + title + "</H2> " +
"Sorry, access to servlets by means of " +
"URLs that begin with " +
"http://host/webAppPrefix/servlet/ " +
"has been disabled. " + 
"</BODY></HTML>");
}

public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

4.2 全局禁止激活器:Tomcat
Tomcat 4中用來關(guān)閉缺省URL的方法與Tomcat 3中所用的很不相同。下面介紹這兩種方法:
1.禁止激活器: Tomcat 4
Tomcat 4用與前面相同的方法關(guān)閉激活器servlet,即利用web.xml中的url-mapping元素進(jìn)行關(guān)閉。不同之處在于Tomcat使用了放在install_dir/conf中的一個(gè)服務(wù)器專用的全局web.xml文件,而前面使用的是存放在每個(gè)Web應(yīng)用的WEB-INF目錄中的標(biāo)準(zhǔn)web.xml文件。
因此,為了在Tomcat 4中關(guān)閉激活器servlet,只需在install_dir/conf/web.xml中簡單地注釋出/servlet/* URL映射項(xiàng)即可,如下所示:
<!-- 
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
-->
再次提醒,應(yīng)該注重這個(gè)項(xiàng)是位于存放在install_dir/conf的Tomcat專用的web.xml文件中的,此文件不是存放在每個(gè)Web應(yīng)用的WEB-INF目錄中的標(biāo)準(zhǔn)web.xml。
2.禁止激活器:Tomcat3
在Apache Tomcat的版本3中,通過在install_dir/conf/server.xml中注釋出InvokerInterceptor項(xiàng)全局禁止缺省servlet URL。例如,下面是禁止使用缺省servlet URL的server.xml文件的一部分。
<!-- 
<RequsetInterceptor 
className="org.apache.tomcat.request.InvokerInterceptor"
debug="0" prefix="/servlet/" />
-->

5 初始化和預(yù)裝載servlet與JSP頁面

這里討論控制servlet和JSP頁面的啟動(dòng)行為的方法。非凡是,說明了怎樣分配初始化參數(shù)以及怎樣更改服務(wù)器生存期中裝載servlet和JSP頁面的時(shí)刻。
5.1 分配servlet初始化參數(shù)
利用init-param元素向servlet提供初始化參數(shù),init-param元素具有param-name和param-value子元素。例如,在下面的例子中,假如initServlet servlet是利用它的注冊名(InitTest)訪問的,它將能夠從其方法中調(diào)用getServletConfig().getInitParameter("param1")獲得"Value 1",調(diào)用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>
在涉及初始化參數(shù)時(shí),有幾點(diǎn)需要注重:
l 返回值。GetInitParameter的返回值總是一個(gè)String。因此,在前一個(gè)例子中,可對param2使用Integer.parseInt獲得一個(gè)int。
l JSP中的初始化。JSP頁面使用jspInit而不是init。JSP頁面還需要使用jsp-file元素代替servlet-class。
l 缺省URL。初始化參數(shù)只在通過它們的注冊名或與它們注冊名相關(guān)的定制URL模式訪問Servlet時(shí)可以使用。因此,在這個(gè)例子中,param1和param2初始化參數(shù)將能夠在使用URL http://host/webAppPrefix/servlet/InitTest 時(shí)可用,但在使用URL http://host/webAppPrefix/servlet/myPackage.InitServlet 時(shí)不能使用。
例如,程序清單5-7給出一個(gè)名為InitServlet的簡單servlet,它使用init方法設(shè)置firstName和emailAddress字段。程序清單5-8給出分配名稱InitTest給servlet的web.xml文件。
程序清單5-7 InitServlet.java
package moreservlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/** Simple servlet used to illustrate servlet
* initialization parameters.
* <P>
* Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
* http://www.moreservlets.com/.
* ? 2002 Marty Hall; may be freely used or adapted.
*/

public class InitServlet extends HttpServlet {
private String firstName, emailAddress;

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

public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String uri = request.getRequestURI();
out.println(ServletUtilities.headWithTitle("Init Servlet") +
"<BODY BGCOLOR="#FDF5E6"> " +
"<H2>Init Parameters:</H2> " +
"<UL> " +
"<LI>First name: " + firstName + " " +
"<LI>Email address: " + emailAddress + " " +
"</UL> " + 
"</BODY></HTML>");
}
}

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

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

5.2 分配JSP初始化參數(shù)
給JSP頁面提供初始化參數(shù)在三個(gè)方面不同于給servlet提供初始化參數(shù)。
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)幾乎總是分配一個(gè)明確的URL模式。對servlet,一般相應(yīng)地使用以http://host/webAppPrefix/servlet/ 開始的缺省URL。只需記住,使用注冊名而不是原名稱即可。這對于JSP頁面在技術(shù)上也是合法的。例如,在上面給出的例子中,可用URL http://host/webAppPrefix/servlet/PageName 訪問RealPage.jsp的對初始化參數(shù)具有訪問權(quán)的版本。但在用于JSP頁面時(shí),許多用戶似乎不喜歡應(yīng)用常規(guī)的servlet的URL。此外,假如JSP頁面位于服務(wù)器為其提供了目錄清單的目錄中(如,一個(gè)既沒有index.html也沒有index.jsp文件的目錄),則用戶可能會(huì)連接到此JSP頁面,單擊它,從而意外地激活未初始化的頁面。因此,好的辦法是使用url-pattern(5.3節(jié))將JSP頁面的原URL與注冊的servlet名相關(guān)聯(lián)。這樣,客戶機(jī)可使用JSP頁面的普通名稱,但仍然激活定制的版本。例如,給定來自項(xiàng)目1的servlet定義,可使用下面的servlet-mapping定義:
<servlet-mapping>
<servlet-name>PageName</servlet-name>
<url-pattern>/RealPage.jsp</url-pattern>
</servlet-mapping>
3)JSP頁使用jspInit而不是init。自動(dòng)從JSP頁面建立的servlet或許已經(jīng)使用了inti方法。因此,使用JSP聲明提供一個(gè)init方法是不合法的,必須制定jspInit方法。
為了說明初始化JSP頁面的過程,程序清單5-9給出了一個(gè)名為InitPage.jsp的JSP頁面,它包含一個(gè)jspInit方法且放置于deployDemo Web應(yīng)用層次結(jié)構(gòu)的頂層。一般,http://host/deployDemo/InitPage.jsp 形式的URL將激活此頁面的不具有初始化參數(shù)訪問權(quán)的版本,從而將對firstName和emailAddress變量顯示null。但是,web.xml文件(程序清單5-10)分配了一個(gè)注冊名,然后將該注冊名與URL模式/InitPage.jsp相關(guān)聯(lián)。

程序清單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.xml(說明JSP頁面的init參數(shù)的摘錄)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

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

供更多有用的信息。另一方面,可以試一下在www.microsoft.com、www.ibm.com 處或者非凡是在www.bea.com 處輸出未知的文件名。這是會(huì)得出有用的消息,這些消息提供可選擇的位置,以便查找感愛好的頁面。提供這樣有用的錯(cuò)誤頁面對于Web應(yīng)用來說是很有價(jià)值得。事實(shí)上,http://www.plinko.net/404/ 就是把整個(gè)站點(diǎn)專門用于404錯(cuò)誤頁面這個(gè)內(nèi)容。這個(gè)站點(diǎn)包含來自全世界最好、最糟和最搞笑的404頁面。
程序清單5-13給出一個(gè)JSP頁面,此頁面可返回給提供位置程序名的客戶機(jī)。程序清單5-14給出指定程序清單5-13作為返回404錯(cuò)誤代碼時(shí)顯示的頁面的web.xml。請注重,瀏覽器中顯示的URL仍然是客戶機(jī)所提供的。錯(cuò)誤頁面是一種后臺實(shí)現(xiàn)技術(shù)。
最后一點(diǎn),請記住IE5的缺省配置顯然不符合HTTP規(guī)范,它忽略了服務(wù)器生成的錯(cuò)誤消息,而是顯示自己的標(biāo)準(zhǔn)出錯(cuò)信息。可轉(zhuǎn)到其Tools菜單,選擇Internet Options,單擊Advanced,取消Show Friendly HTTP Error Message來解決此問題。

程序清單5-13 NotFound.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD><TITLE>404: Not Found</TITLE></HEAD>
<BODY BGCOLOR="#FDF5E6">
<H2>Error!</H2>
I'm sorry, but I cannot find a page that matches
<%= request.getRequestURI() %> on the system. Maybe you should
try one of the following:
<UL>
<LI>Go to the server's <A HREF="/">home page</A>.
<LI>Search for relevant pages.<BR>
<FORM ACTION="http://www.Google.com/search">
<CENTER>
KeyWords: <INPUT TYPE="TEXT" NAME="q"><BR>
<INPUT TYPE="SUBMIT" VALUE="Search">
</CENTER>
</FORM>
<LI>Admire a random multiple of 404:
<%= 404*((int)(1000*Math.random())) %>.
<LI>Try a <A 
TARGET="_blank">
random 404 error message</A>. From the amazing and
amusing plinko.net <A >
404 archive</A>.
</UL>
</BODY></HTML>

程序清單5-14 web.xml(指出HTTP錯(cuò)誤代碼的錯(cuò)誤頁面的摘錄)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<error-page>
<error-code>404</error-code>
<location>/NotFound.jsp</location>
</error-page>
<!-- ... -->
</web-app>

8.2 exception-type元素
error-code元素處理某個(gè)請求產(chǎn)生一個(gè)特定的HTTP狀態(tài)代碼時(shí)的情況。然而,對于servlet或JSP頁面返回200但產(chǎn)生運(yùn)行時(shí)異常這種同樣是常見的情況怎么辦呢?這正是exception-type元素要處理的情況。只需提供兩樣?xùn)|西即可:即提供如下的一個(gè)完全限定的異常類和一個(gè)位置:
<error-page>
<exception-type>packageName.className</exception-type>
<location>/SomeURL</location>
</error-page>
這樣,假如Web應(yīng)用中的任何servlet或JSP頁面產(chǎn)生一個(gè)特定類型的未捕捉到的異常,則使用指定的URL。此異常類型可以是一個(gè)標(biāo)準(zhǔn)類型,如javax.ServletException或java.lang.OutOfMemoryError,或者是一個(gè)專門針對你的應(yīng)用的異常。
例如,程序清單5-15給出了一個(gè)名為DumbDeveloperException的異常類,可用它來非凡標(biāo)記經(jīng)驗(yàn)較少的程序員(不是說你的開發(fā)組中一定有這種人)所犯的錯(cuò)誤。這個(gè)類還包含一個(gè)名為dangerousComputation的靜態(tài)方法,它時(shí)不時(shí)地生成這種類型的異常。程序清單5-16給出對隨機(jī)整數(shù)值調(diào)用dangerousCompution的一個(gè)JSP頁面。在拋出此異常時(shí),如程序清單5-18的web.xml版本中所給出的exception-type所指出的那樣,對客戶機(jī)顯示DDE.jsp(程序清單5-17)。圖5-16和圖5-17分別給出幸運(yùn)和不幸的結(jié)果。

程序清單5-15 DumbDeveloperException.java
package moreservlets;

/** Exception used to flag particularly oNerous
programmer blunders. Used to illustrate the
exception-type web.xml element.
* <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 DumbDeveloperException extends Exception {
public DumbDeveloperException() {
super("Duh. What was I *thinking*?");
}

public static int dangerousComputation(int n)
throws DumbDeveloperException {
if (n < 5) {
return(n + 10);
} else {
throw(new DumbDeveloperException());
}
}
}

程序清單5-16 RiskyPage.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD><TITLE>Risky JSP Page</TITLE></HEAD>
<BODY BGCOLOR="#FDF5E6">
<H2>Risky Calculations</H2>
<%@ page import="moreservlets.*" %>
<% int n = ((int)(10 * Math.random())); %>
<UL>
<LI>n: <%= n %>
<LI>dangerousComputation(n): 
<%= DumbDeveloperException.dangerousComputation(n) %>
</UL>
</BODY></HTML>

程序清單5-17 DDE.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD><TITLE>Dumb</TITLE></HEAD>
<BODY BGCOLOR="#FDF5E6">
<H2>Dumb Developer</H2>
We're brain dead. Consider using our competitors.
</BODY></HTML>

程序清單5-18 web.xml(為異常指定錯(cuò)誤頁面的摘錄)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<servlet> … </servlet>
<!-- ... -->
<error-page>
<exception-type>
moreservlets.DumbDeveloperException
</exception-type>
<location>/DDE.jsp</location>
</error-page>
<!-- ... -->
</web-app>

9 提供安全性

利用web.xml中的相關(guān)元素為服務(wù)器的內(nèi)建功能提供安全性。
9.1 指定驗(yàn)證的方法
使用login-confgi元素規(guī)定服務(wù)器應(yīng)該怎樣驗(yàn)證試圖訪問受保護(hù)頁面的用戶。它包含三個(gè)可能的子元素,分別是:auth-method、realm-name和form-login-config。login-config元素應(yīng)該出現(xiàn)在web.xml部署描述符文件的結(jié)尾四周,緊跟在security-constraint元素之后。
l auth-method
login-config的這個(gè)子元素列出服務(wù)器將要使用的特定驗(yàn)證機(jī)制。有效值為BASIC、DIGEST、FORM和CLIENT-CERT。服務(wù)器只需要支持BASIC和FORM。
BASIC指出應(yīng)該使用標(biāo)準(zhǔn)的HTTP驗(yàn)證,在此驗(yàn)證中服務(wù)器檢查Authorization頭。假如缺少這個(gè)頭則返回一個(gè)401狀態(tài)代碼和一個(gè)WWW-Authenticate頭。這導(dǎo)致客戶機(jī)彈出一個(gè)用來填寫Authorization頭的對話框。此機(jī)制很少或不提供對攻擊者的防范,這些攻擊者在Internet連接上進(jìn)行窺探(如通過在客戶機(jī)的子網(wǎng)上執(zhí)行一個(gè)信息包探測裝置),因?yàn)橛脩裘涂诹钍怯煤唵蔚目赡鎎ase64編碼發(fā)送的,他們很輕易得手。所有兼容的服務(wù)器都需要支持BASIC驗(yàn)證。
DIGEST指出客戶機(jī)應(yīng)該利用加密Digest Authentication形式傳輸用戶名和口令。這提供了比BASIC驗(yàn)證更高的防范網(wǎng)絡(luò)截取得的安全性,但這種加密比SSL(HTTPS)所用的方法更輕易破解。不過,此結(jié)論有時(shí)沒有意義,因?yàn)楫?dāng)前很少有瀏覽器支持Digest Authentication,所以servlet容器不需要支持它。
FORM指出服務(wù)器應(yīng)該檢查保留的會(huì)話cookie并且把不具有它的用戶重定向到一個(gè)指定的登陸頁。此登陸頁應(yīng)該包含一個(gè)收集用戶名和口令的常規(guī)HTML表單。在登陸之后,利用保留會(huì)話級的cookie跟蹤用戶。雖然很復(fù)雜,但FORM驗(yàn)證防范網(wǎng)絡(luò)窺探并不比BASIC驗(yàn)證更安全,假如有必要可以在頂層安排諸如SSL或網(wǎng)絡(luò)層安全(如IPSEC或VPN)等額外的保護(hù)。所有兼容的服務(wù)器都需要支持FORM驗(yàn)證。
CLIENT-CERT規(guī)定服務(wù)器必須使用HTTPS(SSL之上的HTTP)并利用用戶的公開密鑰證書(Pulic Key Certificat)對用戶進(jìn)行驗(yàn)證。這提供了防范網(wǎng)絡(luò)截取的很強(qiáng)的安全性,但只有兼容J2EE的服務(wù)器需要支持它。
l realm-name
此元素只在auth-method為BASIC時(shí)使用。它指出瀏覽器在相應(yīng)對話框標(biāo)題使用的、并作為Authorization頭組成部分的安全域的名稱。
l form-login-config
此元素只在auth-method為FORM時(shí)適用。它指定兩個(gè)頁面,分別是:包含收集用戶名及口令的HTML表單的頁面(利用form-login-page子元素),用來指示驗(yàn)證失敗的頁面(利用form-error-page子元素)。由form-login-page給出的HTML表單必須具有一個(gè)j_security_check的ACTION屬性、一個(gè)名為j_username的用戶名文本字段以及一個(gè)名為j_password的口令字段。
例如,程序清單5-19指示服務(wù)器使用基于表單的驗(yàn)證。Web應(yīng)用的頂層目錄中的一個(gè)名為login.jsp的頁面將收集用戶名和口令,并且失敗的登陸將由相同目錄中名為login-error.jsp的頁面報(bào)告。

程序清單5-19 web.xml(說明login-config的摘錄)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

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

未完待續(xù).

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 峨眉山市| 明星| 通海县| 海阳市| 河津市| 青阳县| 确山县| 迁安市| 即墨市| 无为县| 建瓯市| 白朗县| 昭苏县| 寻乌县| 武胜县| 监利县| 安乡县| 栖霞市| 望都县| 叙永县| 石景山区| 河津市| 乐东| 尚志市| 北京市| 耿马| 武乡县| 洛扎县| 云林县| 绥阳县| 囊谦县| 桦川县| 阜平县| 南昌县| 永兴县| 宿松县| 榆林市| 望江县| 兰溪市| 安福县| 渝北区|