部署描述符實際上是一個XML文件,包含了很多描述servlet/JSP應用的各個方面的元素,如servlet注冊、servlet映射以及監聽器注冊。部署描述符從下面的XML頭開始:
<?xml version="1.0" encoding="ISO-8859-1"?>
這個頭指定了XML的版本號以及所使用的編碼。頭的下面是DOCTYPE聲明:
<!DOCTYPE web-app 這段代碼指定文件類型定義(DTD),可以通過它檢查XML文檔的有效性。下面顯示的<!DOCTYPE>元素有幾個特性,這些特性告訴我們關于DTD的信息: 注意: <!ELEMENT web-app (icon?, display-name?, description?, 正如您所看到的,這個元素含有23個子元素,而且子元素都是可選的。問號(?)表示子元素是可選的,而且只能出現一次。星號(*)表示子元素可在部署描述符中出現零次或多次。有些子元素還可以有它們自己的子元素。 1. icon元素 <!ELEMENT icon (small-icon?, large-icon?)> icon元素包括兩個可選的子元素:small-icon子元素和large-icon子元素。文件名是Web應用歸檔文件(WAR)的根的相對路徑。 2. display-name元素 <!ELEMENT display-name (#PCDATA)> 下面是一個含有display-name元素的部署描述符: <?xml version="1.0" encoding="ISO-8859-1"?> <web-app> 3. description元素 <!ELEMENT description (#PCDATA)> 4. distributable元素 <!ELEMENT distributable EMPTY> 例如,下面是一個含有distributable元素的部署描述符的例子: <?xml version="1.0" encoding="ISO-8859-1"?> <web-app> 5. context-param元素 <!ELEMENT context-param (param-name, param-value, description?)> param-name 子元素包含有參數名,而param-value子元素包含的是參數值。作為選擇,可用description子元素來描述參數。 下面是一個含有context-param元素的有效部署描述符: <?xml version="1.0" encoding="ISO-8859-1"?> <web-app> 6. filter元素 <!ELEMENT filter (icon?, filter-name, display-name?, description?, icon、display-name和description元素的用法和上一節介紹的用法相同。init-param元素與context-param 元素具有相同的元素描述符。filter-name元素用來定義過濾器的名稱,該名稱在整個應用中都必須是惟一的。filter-class元素指定過濾 器類的完全限定的名稱。 下面是一個使用filter元素的部署描述符的例子: <?xml version="1.0" encoding="ISO-8859-1"?> <web-app> 7. filter-mapping元素 <!ELEMENT filter-mapping (filter-name, (url-pattern | servlet-name))> filter-name值必須對應filter元素中聲明的其中一個過濾器名稱。下面是一個含有filter-mapping元素的部署描述符: <?xml version="1.0" encoding="ISO-8859-1"> <web-app> <filter-mapping> 8. listener元素 <!ELEMENT listener (listener-class)> 下面是一個含有listener元素的有效部署描述符: <?xml version="1.0" encoding="ISO-8859-1"?> <web-app> 9. servlet元素 <!ELEMENT servlet (icon?, servlet-name, display-name?, description?, icon、display-name和description元素的用法和上一節介紹的用法相同。init-param元素與context-param元素具有相同的元素描述符。可以使用init-param子元素將初始化參數名和參數值傳遞給servlet。 (1) servlet-name、servlet-class和jsp-file元素 servlet元素必須含有servlet-name元素和servlet-class元素,或者servlet-name元素和jsp-file元素。描述如下: (2) load-on-startup元素 當啟動Web容器時,用load-on-startup元素自動將servlet加入內存。加載servlet就意味著實例化這個servlet,并調用 它的init方法。可以使用這個元素來避免第一個servlet請求的響應因為servlet載入內存所導致的任何延遲。如果load-on- startup元素存在,而且也指定了jsp-file元素,則JSP文件會被重新編譯成servlet,同時產生的servlet也被載入內存。 (3) run-as元素 如果定義了run-as元素,它會重寫用于調用Web應用中servlet所設定的Enterprise JavaBean(EJB)的安全身份。Role-name是為當前Web應用定義的一個安全角色的名稱。 (4) security-role-ref元素 security-role-ref元素定義一個映射,該映射在servlet中用isUserInRole (String name)調用的角色名與為Web應用定義的安全角色名之間進行。security-role-ref元素的描述如下: role-link元素用來將安全角色引用鏈接到已定義的安全角色。role-link元素必須含有已經在security-role元素中定義的一個安全角色的名稱。 (5) Faces Servlet的servlet元素 在 JSF應用中,需要為Faces Servlet定義一個servlet元素,如下所示: <?xml version="1.0"?> <web-app> <!-- Faces Servlet --> <!-- Faces Servlet Mapping --> </web-app> 10. seervlet-mapping 元素 <!ELEMENT servlet-mapping (servlet-name, url-pattern)> 在前面的“servlet元素”一節中已經介紹了使用servlet-mapping元素的例子。 11. session-config元素 <!ELEMENT session-config (session-timeout?)> session-timeout元素用來指定默認的會話超時時間間隔,以分鐘為單位。該元素值必須為整數。如果session-timeout元素的值為零或負數,則表示會話將永遠不會超時。 下面是一個部署描述符,在用戶最近訪問HttpSession對象30分鐘后,HttpSession對象默認為無效: <?xml version="1.0" encoding="ISO-8859-1"?> <web-app> 12. mime-mapping元素 <!ELEMENT mime-mapping (extension, mime-type)> extension元素用來描述擴展名。mime-type元素則為MIME類型。 舉個例子,下面的部署描述符將擴展名txt映射為text/plain: <?xml version="1.0" encoding="ISO-8859-1"?> 13. welcome-file-list元素 <!ELEMENT welcome-file-list (welcome-file+)> 舉個例子說明,假設用戶在瀏覽器的地址框中輸入http://www.mycompany.com/appName/等地址。如果在Web應用的部署描述符中指定welcome-file-list元素,用戶就會看到一個權限錯誤消息,或者是應用目錄下的文件和目錄列表。如果定義了welcome-file-list元素,用戶就能看到由該元素指定的具體文件。 <?xml version="1.0" encoding="ISO-8859-1"?> <web-app> 如果用戶鍵入的URL不包含servlet名稱、JSP頁面或其他資源,則不會在應用目錄中找到main.html文件,這時就會顯示jsp目錄下的welcome.jsp文件。 14. error-page元素 <!ELEMENT error-page ((error-code | exception-type), location)> error-code元素包含HTTP錯誤代碼。exception-type是Java異常類型的完全限定的名稱。location元素是Web應用中的資源相對于應用目錄的路徑。location的值必須從a/開始。 舉個例子,每次產生HTTP 404錯誤代碼時,下面的部署描述符可使Web容器顯示error404.html頁面:
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
●
●
●
●
在部署描述符中, <!--…-->用于注釋。
部署描述符的根元素是web-app。DTD文件規定,web-app元素的子元素的語法如下:
distributable?, context-param*, filter*, filter-mapping*,
listener*, servlet*, servlet-mapping*, session-config?,
mime-mapping*, welcome-file-list?,
error-page*, taglib*, resource-env-ref*, resource-ref*,
security-constraint*, login-config?, security-role*,env-entry*,
ejb-ref*, ejb-local-ref*)>
web.xml文件中web-app元素聲明的是下面每個子元素的聲明。下面的章節講述部署描述符中可能包含的所有子元素。
注意:
在Servlet 2.3中,子元素必須按照DTD文件語法描述中指定的順序出現。比如,如果部署描述符中的web-app元素有servlet和servlet-mapping兩個子元素,則servlet子元素必須出現在servlet-mapping子元素之前。在Servlet 2.4中,順序并不重要。
下面對web.xml文件各元素進行詳解
icon元素用來指定GIF格式或JPEG格式的小圖標(16×16)或大圖標(32×32)的文件名。
<!ELEMENT small-icon (#PCDATA)>
<!ELEMENT large-icon (#PCDATA)>
部署描述符并沒有使用icon元素。但是,如果使用XML工具編輯部署描述符,XML編輯器可以使用icon元素。
如果使用工具編輯部署描述符,display-name元素包含的就是XML編輯器顯示的名稱。
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
<display-name>Online Store Application</display-name>
</web-app>
可以使用description元素來提供有關部署描述符的信息。XML編輯器可以使用description元素的值。
可以使用distributable元素來告訴servlet/JSP容器,編寫將在分布式Web容器中部署的應用:
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
<distributable/>
</web-app>
context-param元素含有一對參數名和參數值,用作應用的servlet上下文初始化參數。參數名在整個Web應用中必須是惟一的。
<!ELEMENT param-name (#PCDATA)>
<!ELEMENT param-value (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
<context-param>
<param-name>jdbcDriver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
</web-app>
filter元素用于指定Web容器中的過濾器。在請求和響應對象被servlet處理之前或之后,可以使用過濾器對這兩個對象進行操作。利用下一節介紹 的filter-mapping元素,過濾器被映射到一個servlet或一個URL模式。這個過濾器的filter元素和filter-mapping 元素必須具有相同的名稱。
filter-class, init-param*)>
<!ELEMENT filter-name (#PCDATA)>
<!ELEMENT filter-class (#PCDATA)>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
<filter>
<filter-name>Encryption Filter</filter-name>
<filter-class>com.branysoftware.EncryptionFilter</filter-class>
</filter>
</web-app>
filter-mapping元素用來聲明Web應用中的過濾器映射。過濾器可被映射到一個servlet或一個URL模式。將過濾器映射到一個 servlet中會造成過濾器作用于servlet上。將過濾器映射到一個URL模式中則可以將過濾器應用于任何資源,只要該資源的URL與URL模式匹 配。過濾是按照部署描述符的filter-mapping元素出現的順序執行的。
<!ELEMENT filter-name (#PCDATA)>
<!ELEMENT url-pattern (#PCDATA)>
<!ELEMENT servlet-name (#PCDATA)>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
<filter>
<filter-name>Encryption Filter</filter-name>
<filter-class>com.brainysoftware.EncryptionFilter</filter-class>
</filter>
<filter-name>Encryption Filter</filter-name>
<servlet-name>EncryptionFilteredServle
</filter-mapping>
</web-app>
listener元素用來注冊一個監聽器類,可以在Web應用中包含該類。使用listener元素,可以收到事件什么時候發生以及用什么作為響應的通知。
<!ELEMENT listener-class (#PCDATA)>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
<listener>
<listener-class>MyAppListener</listener-class>
</listener>
</web-app>
servlet元素用來聲明一個servlet。
(servlet-class|jsp-file), init-param*, load-on-startup?, run-as?,
security-role-ref*)>
<!ELEMENT servlet-name (#PCDATA)>
<!ELEMENT servlet-class (#PCDATA)>
<!ELEMENT jsp-file (#PCDATA)>
<!ELEMENT init-param (param-name, param-value, description?)>
<!ELEMENT load-on-startup (#PCDATA)>
<!ELEMENT run-as (description?, role-name)>
<!ELEMENT role-name (#PCDATA)>
●
●
●
load-on-startup元素的內容可以為空,或者是一個整數。這個值表示由Web容器載入內存的順序。舉個例子,如果有兩個servlet元素都 含有load-on-startup子元素,則load-on-startup子元素值較小的servlet將先被加載。如果load-on- startup子元素值為空或負值,則由Web容器決定什么時候加載servlet。如果兩個servlet的load-on-startup子元素值相 同,則由Web容器決定先加載哪一個servlet。
<!ELEMENT security-role-ref (description?, role-name, role-link)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT role-name (#PCDATA)>
<!ELEMENT role-link (#PCDATA)>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup> 1 </load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
seervlet-mapping 元素將URL模式映射到某個servlet。
<!ELEMENT servlet-name (#PCDATA)>
<!ELEMENT url-pattern (#PCDATA)>
session-config元素為Web應用中的javax.servlet.http.HttpSession對象定義參數。
<!ELEMENT session-timeout (#PCDATA)>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
<session-config>
<session-timeout>30</session-timeout>
</session-config>
</web-app>
mime-mapping元素將mime類型映射到擴展名。
<!ELEMENT extension (#PCDATA)>
<!ELEMENT mime-type (#PCDATA)>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
<web-app>
<mime-mapping>
<extension>txt</extension>
<mime-type>text/plain</mime-type>
</mime-mapping>
</web-app>
當用戶在瀏覽器中輸入的URL不包含某個servlet名或JSP頁面時,welcome-file-list元素可指定顯示的默認文件。
<!ELEMENT welcome-file (#PCDATA)>
welcome-file子元素用于指定默認文件的名稱。welcome-file-list元素可以包含一個或多個welcome-file子元素。如果在第一個welcome-file元素中沒有找到指定的文件,Web容器就會嘗試顯示第二個,以此類推。
下面是一個包含welcome-file-list元素的部署描述符。該元素包含兩個welcome-file元素:第一個指定應用目錄中的main.html文件,第二個定義jsp目錄下的welcom.jsp文件,jsp目錄也在應用目錄下。
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
<welcome-file-list>
<welcome-file>main.html</welcome-file>
<welcome-file>jsp/welcome.jsp</welcome-file>
</welcome-file-list>
</web-app>
error-page元素用于將一段錯誤代碼或一個異常類型映射到Web應用中的資源路徑,從而在產生特殊的HTTP錯誤或指定的Java異常時,將顯示相關的資源。
<!ELEMENT error-code (#PCDATA)>
<!ELEMENT exception-type (#PCDATA)>
<!ELEMENT location (#PCDATA)>