web.xml配置的詳細說明

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 提供一個缺省的 URL [url]http://host/webAppPrefix/servlet/ServletName[/url] 。可是,經常會更改這個 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-name>Test</servlet-name>
<servlet-class>moreservlets.TestServlet</servlet-class>
</servlet>
這表示位於 WEB-INF/classes/moreservlets/TestServlet servlet 已經獲得了註冊名 Test 。給 servlet 一個名稱具備兩個主要的含義。首先,初始化參數、定製的 URL 模式以及其餘定製經過此註冊名而不是類名引用此 servlet 。其次 , 可在 URL 而不是類名中使用此名稱。所以,利用剛纔給出的定義, URL [url]http://host/webAppPrefix/servlet/Test[/url] 可用於 [url]http://host/webAppPrefix/servlet/moreservlets.TestServlet[/url] 的場所。
請記住: 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.
* <P>
* Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
*
[url]http://www.moreservlets.com/.[/url]
* © 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.xml (說明 servlet 名稱的摘錄)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
[url]http://java.sun.com/dtd/web-app_2_3.dtd[/url] ">

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

3.2
定義定製的 URL
大多數服務器具備一個缺省的 serlvet URL
[url]http://host/webAppPrefix/servlet/packageName.ServletName[/url] 。雖然在開發中使用這個 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 元素提供了一個任意名稱,可利用此名稱引用相應的 servlet url-pattern 描述了相對於 Web 應用的根目錄的 URL url- pattern 元素的值必須以斜槓( / )起始。
下面給出一個簡單的 web.xml 摘錄,它容許使用 URL [url]http://host/webAppPrefix/UrlTest[/url] 而不是 [url]http://host/webAppPrefix/servlet/Test[/url]
http: //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 結束的請求到名爲 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 頁面
由於 JSP 頁面要轉換成 sevlet ,天然但願就像命名 servlet 同樣命名 JSP 頁面。畢竟, JSP 頁面可能會從初始化參數、安全設置或定製的 URL 中受益,正如普通的 serlvet 那樣。雖然 JSP 頁面的後臺其實是 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 ,而後將此註冊名與 [url]http://host/webAppPrefix/UrlTest2/anything[/url] 形式的 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.xml (說明 JSP 頁命名的摘錄)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
[url]http://java.sun.com/dtd/web-app_2_3.dtd[/url] ">

<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 的一個緣由是,這樣作能夠註冊從 init servlet )或 jspInit JSP 頁面)方法中讀取得初始化參數。可是,初始化參數只在是利用定製 URL 模式或註冊名訪問 servlet JSP 頁面時可使用,用缺省 URL [url]http://host/webAppPrefix/servlet/ServletName[/url] 訪問時不能使用。所以,你可能會但願關閉缺省 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 應用中禁止以 [url]http://host/webAppPrefix/servlet/[/url] 開始的 URL 的處理很是簡單。所需作的事情就是創建一個錯誤消息 servlet ,並使用前一節討論的 url-pattern 元素將全部匹配請求轉向該 servlet 。只要簡單地使用:
<url-pattern>/servlet/*</url-pattern>
做爲 servlet-mapping 元素中的模式便可。
例如,程序清單 5-5 給出了將 SorryServlet servlet (程序清單 5-6 )與全部以 [url]http://host/webAppPrefix/servlet/[/url] 開頭的 URL 相關聯的部署描述符文件的一部分。

程序清單 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"
"
[url]http://java.sun.com/dtd/web-app_2_3.dtd[/url] ">

<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.,
[url]http://host/webAppPrefix/servlet/ServletName[/url] )
* in Web applications that have disabled this
* behavior.
* <P>
* Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
*
[url]http://www.moreservlets.com/.[/url]
* © 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" +
"
[url]http://host/webAppPrefix/servlet/[/url] \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-name>invoker</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
className="org.apache.tomcat.request.InvokerInterceptor"
debug="0" 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-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 得到一個 int
l JSP
中的初始化。 JSP 頁面使用 jspInit 而不是 init JSP 頁面還須要使用 jsp-file 元素代替 servlet-class
l
缺省 URL 。初始化參數只在經過它們的註冊名或與它們註冊名相關的定製 URL 模式訪問 Servlet 時可使用。所以,在這個例子中, param1 param2 初始化參數將可以在使用 URL [url]http://host/webAppPrefix/servlet/InitTest[/url] 時可用,但在使用 URL [url]http://host/webAppPrefix/servlet/myPackage.InitServlet[/url] 時不能使用。
例如,程序清單 5-7 給出一個名爲 InitServlet 的簡單 servlet ,它使用 init 方法設置 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,
*
[url]http://www.moreservlets.com/.[/url]
* © 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-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
[url]http://java.sun.com/dtd/web-app_2_3.dtd[/url] ">

<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>
[email]Ellison@Microsoft.com[/email] </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 ,通常相應地使用以 [url]http://host/webAppPrefix/servlet/[/url] 開始的缺省 URL 。只需記住,使用註冊名而不是原名稱便可。這對於 JSP 頁面在技術上也是合法的。例如,在上面給出的例子中,可用 URL [url]http://host/webAppPrefix/servlet/PageName[/url] 訪問 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 應用層次結構的頂層。通常, [url]http://host/deployDemo/InitPage.jsp[/url] 形式的 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><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 參數的摘錄)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
[url]http://java.sun.com/dtd/web-app_2_3.dtd[/url] ">

<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>
[email]gates@oracle.com[/email] </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-name>support-email</param-name>
<param-value>
[email]blackhole@mycompany.com[/email] </param-value>
</context-param>
可回憶一下,爲了保證可移植性, web.xml 內的元素必須以正確的次序聲明。但這裏應該注意, context-param 元素必須出現任意與文檔有關的元素( icon display-name description )以後及 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.java
package 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,
*
[url]http://www.moreservlets.com/.[/url]
* © 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-name>Reporter</filter-name>
<filter-class>moresevlets.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-name>Reporter</filter-name>
<servlet-name>SomeServletName</servlet-name>
</filter-mapping>
其次,可利用 filter-name url-pattern 子元素將過濾器與一組 servlet JSP 頁面或靜態內容相關聯。例如,相面的程序片斷指示系統只要訪問 Web 應用中的任意 URL ,就運行名爲 Reporter 的過濾器。
<filter-mapping>
<filter-name>Reporter</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
[url]http://mycompany.com/deployDemo/UrlTest2/business/tax-plan.html[/url]
on Tue Dec 25 13:12:29 EDT 2001.

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

<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.html index.jsp default.html default.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
指定處理錯誤的頁面

如今我瞭解到,你在開發 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 錯誤信息,它表示不能找到該文件,但幾乎沒提供更多有用的信息。另外一方面,能夠試一下在 [url]www.microsoft.com[/url] [url]www.ibm.com[/url] 處或者特別是在 [url]www.bea.com[/url] 處輸出未知的文件名。這是會得出有用的消息,這些消息提供可選擇的位置,以便查找感興趣的頁面。提供這樣有用的錯誤頁面對於 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 version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
[url]http://java.sun.com/dtd/web-app_2_3.dtd[/url] ">

<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-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-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 頁面,而只是經過創建該頁面將使用的 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-name>administrator</role-name>
<role-name>kahuna</role-name>
</auth-constraint>
</security-constraint>
重要的是認識到,到此爲止,這個過程的可移植部分結束了。服務器怎樣肯定哪些用戶處於任何角色以及它怎樣存放用戶的口令,徹底有賴於具體的系統。
例如, Tomcat 使用 install_dir/conf/tomcat-users.xml 將用戶名與角色名和口令相關聯,正以下面例子中所示,它指出用戶 joe (口令 bigshot )和 jane (口令 enaj )屬於 administrator kahuna 角色。
<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 INTEGRAL CONFIDENTIAL ),而且可選地包含一個 description 元素。 transport-guarantee NONE 值將對所用的通信協議不加限制。 INTEGRAL 值表示數據必須以一種防止截取它的人閱讀它的方式傳送。雖然原理上(而且在將來的 HTTP 版本中),在 INTEGRAL CONFIDENTIAL 之間可能會有差異,但在當前實踐中,他們都只是簡單地要求用 SSL 。例如,下面指示服務器只容許對相關資源作 HTTPS 鏈接:
<security-constraint>
<!-- ... -->
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</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.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
控制會話超時

若是某個會話在必定的時間內未被訪問,服務器可把它扔掉以節約內存。可利用 HttpSession setMaxInactiveInterval 方法直接設置個別會話對象的超時值。若是不採用這種方法,則缺省的超時值由具體的服務器決定。但可利用 session-config session- timeout 元素來給出一個適用於全部服務器的明確的超時值。超時值的單位爲分鐘,所以,下面的例子設置缺省會話超時值爲三個小時( 180 分鐘)。
<session-config>
<session-timeout>180</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>/p_w_picpaths/small-book.gif</small-icon>
<large-icon>/p_w_picpaths/tome.jpg</large-icon>
</icon>
l display-name
display-name
元素提供 GUI 工具可能會用來標記此 Web 應用的一個名稱。下面是個例子。
<display-name>Rare 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 的文件一個 p_w_picpath/jpeg MIME 類型。可是,假如你的 Web 應用具備幾個不尋常的文件,你但願保證它們在發送到客戶機時分配爲某種 MIME 類型。 mime-mapping 元素(具備 extension mime-type 子元素)可提供這種保證。例如,下面的代碼指示服務器將 application/x-fubar MIME 類型分配給全部以 .foo 結尾的文件。
<mime-mapping>
<extension>foo</extension>
<mime-type>application/x-fubar</mime-type>
</mime-mapping>
或許,你的 Web 應用但願重載( override )標準的映射。例如,下面的代碼將告訴服務器在發送到客戶機時指定 .ps 文件做爲純文本( text/plain )而不是做爲 PostScript application/postscript )。
<mime-mapping>
<extension>ps</extension>
<mime-type>application/postscript</mime-type>
</mime-mapping>


13
定位 TLD

JSP taglib
元素具備一個必要的 uri 屬性,它給出一個 TLD Tag 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" prefix="somePrefix" %>

14
指定應用事件監聽程序

應用事件監聽器程序是創建或修改 servlet 環境或會話對象時通知的類。它們是 servlet 規範的版本 2.3 中的新內容。這裏只簡單地說明用來向 Web 應用註冊一個監聽程序的 web.xml 的用法。
註冊一個監聽程序涉及在 web.xml web-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 DTD 2.3 版本,而不是 2.2 版本。
例如,程序清單 5-20 給出一個名爲 ContextReporter 的簡單的監聽程序,只要 Web 應用的 Servlet-Context 創建(如裝載 Web 應用)或消除(如服務器關閉)時,它就在標準輸出上顯示一條消息。程序清單 5-21 給出此監聽程序註冊所須要的 web.xml 文件的一部分。

程序清單 5-20 ContextReporterjava
package 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,
*
[url]http://www.moreservlets.com/.[/url]
* © 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-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
[url]http://java.sun.com/dtd/web-app_2_3.dtd[/url] ">

<web-app>
<!-- ... -->
<filter-mapping> … </filter-mapping>
<listener>
<listener-class>package.ListenerClass</listener-class>
</listener>
<servlet> ... </servlet>
<!-- ... -->
</web-app>


15 J2EE
元素

本節描述用做 J2EE 環境組成部分的 Web 應用的 web.xml 元素。這裏將提供一個簡明的介紹,詳細內容能夠參閱 [url]http://java.sun.com/j2ee/j2ee-1_3-fr-spec.pdf[/url] 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-name>minAmout</env-entry-name>
<env-entry-value>100.00</env-entry-value>
<env-entry-type>minAmout</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 元素相同的屬性並以相同的方式使用
相關文章
相關標籤/搜索