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 對映
匹配萬用字元 *
-
同一個Servlet可以被對映到多個URL上,即多個 servlet-mapping 元素的 servlet-name 子元素的設定值可以是同一個Servlet的註冊名。
-
在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檔案中,以下語法用於定義對映:
-
以
/
開頭和以/*
結尾的是用來做路徑對映的。 -
以字首
*.
開頭的是用來做擴充套件對映的。 -
/
是用來定義 default servlet 對映的。 -
剩下的都是用來定義詳細對映的。比如: /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 對映