1. 程式人生 > >Java Servlet 實戰入門教程-18-servlet web application 應用部署

Java Servlet 實戰入門教程-18-servlet web application 應用部署

war 包

Jar、war、EAR、在檔案結構上,三者並沒有什麼不同,它們都採用zip或jar檔案檔案壓縮格式。

Jar

Jar檔案(副檔名為. Jar,Java Application Archive)包含Java類的普通庫、資源(resources)、輔助檔案(auxiliary files)等

War

War檔案(副檔名為.War,Web Application Archive)包含全部Web應用程式。

在這種情形下,一個Web應用程式被定義為單獨的一組檔案、類和資源,使用者可以對jar檔案進行封裝,並把它作為小型服務程式(servlet)來訪問。

Ear

Ear檔案(副檔名為.Ear,Enterprise Application Archive)包含全部企業應用程式。

在這種情形下,一個企業應用程式被定義為多個jar檔案、資源、類和Web應用程式的集合。

每一種檔案(.jar, .war, .ear)只能由應用伺服器(application servers)、小型服務程式容器(servlet containers)、EJB容器(EJB containers)等進行處理。

設定歡迎介面

設定方式

  • web.xml

在 web.xml 檔案中設定如下內容:

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>
default.jsp</welcome-file> </welcome-file-list>

這裡會根據使用者請求的 servlet 不同,去匹配對應目錄最近的一個歡迎頁面。

匹配的時候,會依次按照我們定義的歡迎頁面順序。

servlet 對映

匹配萬用字元 *

  1. 同一個Servlet可以被對映到多個URL上,即多個 servlet-mapping 元素的 servlet-name 子元素的設定值可以是同一個Servlet的註冊名。

  2. 在Servlet對映到的URL中可以使用 * 萬用字元,但是隻能有兩種固定的格式:一種格式是 *.副檔名,另一種格式是/*

比如:

<url-pattern>*.do</url-pattern>
<url-pattern>/action/*</url-pattern>

servlet容器對url的匹配過程

一個請求傳送到 servlet 容器,servlet 容器會將當前請求的 url 路徑減去 協議、埠號、contextPath,剩下 servletPath 就是用來做 url-pattern 對映的部分。

http: 傳輸協議

www.myserver.com: 主機地址

8080: 埠號

mall: contextPath

myservlet/productinfo: servletPath

id=1: 引數

所以要做 url-pattern 對映的部分就是 “myservlet/productinfo” 部分。

對映匹配過程的順序為,有且當有一個servlet匹配成功以後,就不會去理會剩下的servlet了(和filter不同)。

其匹配規則和順序如下:

1.精確路徑匹配。

例子:比如servletA 的 url-pattern為 /test,servletB的url-pattern為 /*

這個時候,如果我訪問的url為http://www.myserver.com:8080/test ,這個時候容器就會先進行精確路徑匹配,發現/test正好被servletA精確匹配,那麼就去呼叫servletA,也不會去理會servletB了。

2.最長路徑匹配。

例子:servletA的url-pattern為/test/,而servletB的url-pattern為/test/a/

此時訪問http://www.myserver.com:8080/test/a時,

容器會選擇路徑最長的servlet來匹配,也就是這裡的servletB。

3.擴充套件匹配

如果url最後一段包含擴充套件,容器將會根據擴充套件選擇合適的servlet。

例子:servletA的url-pattern:*.action

預設

4.如果前面三條規則都沒有匹配到servlet,如果應用定義了一個default servlet,則容器會將請求丟給default servlet。

根據這個規則表,就能很清楚的知道servlet的匹配過程,所以定義servlet的時候也要考慮url-pattern的寫法,以免出錯。

filter 處理過程

對於filter,不會像servlet那樣只匹配一個servlet,因為filter的集合是一個鏈,所以只會有處理的順序不同,而不會出現只選擇一個filter。

Filter的處理順序和filter-mapping在web.xml中定義的順序相同。

其他

在web.xml檔案中,以下語法用於定義對映:

  1. / 開頭和以 /* 結尾的是用來做路徑對映的。

  2. 以字首 *. 開頭的是用來做擴充套件對映的。

  3. / 是用來定義 default servlet 對映的。

  4. 剩下的都是用來定義詳細對映的。比如: /aa/bb/cc.action

所以,為什麼定義 /*.action 這樣一個看起來很正常的匹配在啟動tomcat時會報錯?

因為這個匹配即屬於路徑對映,也屬於擴充套件對映,導致容器無法判斷。

servlet 初始化

  • web.xml

我們可以通過 load-on-startup 的指定非負值讓 servlet 在應用部署時(或者服務重啟時)載入此 servlet。

<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.github.houbb.servlet.learn.base.hello.Hello</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

載入順序

多個 serlet 值不同,則值越大的越靠後載入。

多個 servlet 值相同,則按照宣告的順序載入。

參考資料

部署描述符

《Head First Servlet & JSP》

  • war
  • servlet 對映

教程導航

教程彙總