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
元素相同的屬性並以相同的方式使用
歡迎關注本站公眾號,獲取更多信息