Web Application目錄結構及web.xml

 

通常一個網絡應用是由很多資源組成的,如servlet,JSP文件,class文件,第三方JAR文件,HTML文件,圖片等等。

對於這些文件的組織JAVA servlet規範中已經做出定義,也就是說會以一種規範的目錄結構去實現。

一個網絡應用下包含的是多個子應用對應的文件夾,而對於一個子應用一般會按照資源的擴展名分成幾個下級文件夾,如html,images,jsp等。但是至少要有一個WEB-INF文件夾。

這個WEB-INF文件夾下包含了該子應用最重要的部分。一般包括三個部分。

1.classes文件夾:本應用中編譯生成的所有class文件集中此處。

2.lib文件夾:以JAR/zip形式表現的庫文件和所有需要用到的第三方庫文件存放此處。如果,這種庫文件沒打包成JAR/zip,則要放到classes目錄中。

3.web.xml文件:此應用的初始化配置文件。非常重要。

注意:WEB-INF文件夾所包含的是服務器端使用的資源(而非客戶端)。所以,任何客戶端要調用的資源不應該放在此文件夾中,即使象某些JAR(包含的是applet)文件。

在開發和部署時,如果需要將整個應用進行轉移位置,通常採取的一種做法是將整個應用打包成爲war文件(區別與jar)。當我們將一個WAR文件放在Tomcat的網絡應用文件夾下時,Tomcat會自動將其解壓縮,形成一個和WAR文件名相同的文件夾。形成了部署,移植自動化。

如何打包war文件?

1.開DOS窗口,進入網絡應用根目錄。如:c: omcat4webapps>。

2.用jar命令壓縮。c: omcat4webapps>jar -cvf helloapp.war helloapp。(具體參數看jar幫助)。

這樣在webapps目錄下就有了一個helloapp.war文件。

在webapps目錄下我們通常會看到一個ROOT目錄。這個目錄被稱之爲缺省目錄。當我們在瀏覽器地址欄敲入http://localhost:8080/index.jsp時,訪問的就是ROOT目錄下的index.jsp文件。

因此,webapps目錄下除了一些目錄外沒有別的任何文件(放了也不會被訪問到)。

web.xml結構

這個文件已經在java servlet規範中進行了標準化。

1.爲開頭。

2.做版本聲明。

3.爲開頭對應用的定義。

4.其下是對所有具體內容的定義。

5.爲整個文檔的結束。

下面看兩個和servlet相關的元素。和

在servlet下可以定義的元素有icon, servlet-name, servlet-class|jsp-file, display-name, description, init-param, load-on-startup, security-role-ref。

servlet-name:指定該sevlet的名字。客戶端就是用這個名字訪問該servlet。

servlet-class:指定該servlet具體關聯的class文件名。且只能跟在servlet-name後面。

init-param:定義該servlet的初始化參數。具體參數名由param-name元素指定,值由param-value元素指定。

注意:一個param-name只能指定一個參數。如需多個參數,就用多個param-name。而param-vlaue卻可以爲一個參數名指定多個值,形成陣列(值間以逗號分割)。

另:參數是和servlet名相關,而非class文件。如此,可以用一個class文件加不同名字,不同參數形成多個版本。

其下可以定義的元素有servlet-name, url-pattern。

目的是以你指定的任何url形式去關聯(訪問)servlet。

我們可以爲同一個servlet指定多個不同的url。

四種不同的url形式:

1.以/開始/*結束的形式。按純目錄形式關聯servlet。

2.以*.postfix形式。按具體文件類型關聯servlet。

3.單個字符串形式。精確匹配關聯servlet。

4.單個/形式。缺省servlet(所有沒精確指定資源的url都由該servlet處理)。

通常由servlet容器來解析一個指向servlet的URL。這種解析分兩步,1.標識網絡應用;2.定位具體的servlet。

上述兩個步驟都會對URL中的URI(除去主機名以外的)部分進行分段處理,形成三個部分,Context Path, Servlet Path, Path Info。

示例:http://www.myserver.com/mywebapp/helloservlet/hello

1.Context Path

用以標識網絡應用。以/開頭,如此部分爲空,則由缺省網絡應用響應。上例中爲/mywebapp。

2.Servlet Path

用以標識servlet。以/開頭,如此部分爲空,則由缺省servlet響應。上例中爲/helloservlet。

3.Path Inof

除前兩部分外,剩下的就是路徑信息。本部分也可爲空。上例爲/hello。

HttpServletRequest提供了三個方法-getContextPath(),getServletPath()和getPathInfo()。分別提取不同段內容。

servlet容器在標識出context path後,會按照一個順序計算URI的剩餘部分。這個順序是固定的,而且條件一旦滿足,將不再繼續。

1.servlet容器先將整個URI(除去context path之後的)和servlet mapping進行匹配。如果匹配成功,則除context path以爲的剩餘部分都是servlet path。因此,path info部分爲空。

2.以/爲分界符到着往前去和servlet mapping匹配。如匹配成功,匹配的部分就是servlet path,剩餘部分是path info。

3.如果URI最後是某種文件擴展名,則servlet容器去和servlet mapping匹配。如成功,則將整個URI(除去context path之後的)視爲servlet path,而path info爲空。

4.如果始終沒找到相匹配的servlet mapping,則將請求發往默認servlet。如果不存在默認servlet,則servlet容器發送錯誤消息,指示servlet沒找到。

發佈了20 篇原創文章 · 獲贊 3 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章