web.xml文件中定義和映射Servlet(2/3)

2.映射Servlets 到 URLs
 <servlet-mapping>元素爲一個servlet實例提供一個URL pattern。<servlet-mapping>元素必須包含<servlet-name>元素和<url-pattern>元素。
 <servlet-name>元素必須和在 web.xml 文件某處<servlet>元素定義的<servlet-name>元素一致。由於一個容器中同一個servlet可能有多個實例在運行,容器就使用<servlet-name>來確定一個servlet的映射。
 下例的URL /status/* 被映射到一個叫getStatus的servlet。如果一個servlet 被一個容器定義在 http ://example.roguewave.com/, 那末這個元素就告訴容器getStatus servlet 要以以下開頭的 requests來訪問
http ://example.roguewave.com/examples/status.

<servlet-mapping>
  <servlet-name>getStatus</servlet-name>
  <url-pattern>/status/*</url-pattern>
</servlet-mapping>



一個servlet 可以接受任何數量URL patterns的requests 。 下例顯示了針對同一servlet實例的兩個不同 pattern:


<servlet-mapping>
  <servlet-name>getStatus</servlet-name>
  <url-pattern>/status/*</url-pattern>
</servlet-mapping>


<servlet-mapping>
  <servlet-name>getStatus</servlet-name>
  <url-pattern>/briefStatus/*</url-pattern>
</servlet-mapping>


不同的pattern可以映射到同一個servlet,但同一個pattern不能映射到不同的servlet。如果同一 web.xml文件中一個 url-pattern映射到不同的servlet,容器就無法保證對一個 request 調用哪個servlet。


 2.1 URL Pattern 語法:


 一個URL Pattern中的每個字符必須和URL path中的嚴格一致。由兩個例外,在一個Pattern末尾,/* 匹配從此點以後的任何字符;*.擴展名 則匹配任何有此擴展名的文件名。
例如:
服務器 example.com 的路徑 /examples下的匹配模式<url-pattern>/status/*</url-pattern> 可有如下匹配:
http ://example.com/examples/status/synopsis
http ://example.com/examples/status/complete?date=today
http ://example.com/examples/status


不匹配:
http ://example.com/examples/server/status


服務器 example.com 的路徑 /examples下的匹配模式<url-pattern>*.map</url-pattern> 可有如下匹配:
http ://example.com/examples/US/Oregon/Portland.map
http ://example.com/examples/US/Washington/Seattle.map
http ://example.com/examples/Paris.France.map


不匹配
http ://example.com/examples/US/Oregon/Portland.MAP
   //擴展名爲大寫
http ://example.com/examples/interface/description/mail.mapi
   //擴展名是mapi 而不是 map
 
 同一 web.xml文件中的不同的 filter 經常用到同一個 url-pattern 。在這種情況下,能匹配上 request 的每一個filter都會處理此 request。
 相反,在同一個web應用中沒有兩個servlet會映射到同一個 url-pattern,如果同一 web.xml文件中一個 url-pattern映射到不同的servlet,容器就無法保證對一個 request 調用哪個servlet。不過兩個servlet可用部分一致的url-pattern(即/*或 *.extention),這樣容器調用哪個servlet由匹配過程決定。
 
 2.2 Servlet 匹配過程
 一個request可能匹配多於一個 servlet 映射。容器使用straightforward的匹配過程決定哪個servlet最匹配。匹配過程有四個簡單規則:
 1〉嚴格匹配優先於帶 * 的匹配;
 2〉最長pattern優先於其他pattern;
 3〉路徑匹配優先於文件類型匹配;
 4〉pattern <url-pattern>/</url-pattern> 總是匹配沒有其他pattern匹配的request。


例如:
 web.xml文件可能將在線目錄的首頁映射給一個pattern,而將在線目錄的查詢頁映射給另一個pattern :


<servlet-mapping>
  <servlet-name>catalogBrowse</servlet-name>
  <url-pattern>/Catalog/*</url-pattern>
</servlet-mapping>


<servlet-mapping>
  <servlet-name>catalogSearch</servlet-name>
  <url-pattern>/Catalog/search/*</url-pattern>
</servlet-mapping>


下圖描述了匹配過程:由於最長pattern優先於其他pattern,包含/Catalog/search/的URL總是映射到catalogSearch,而不是catalogBrowse。

 2.3 默認servlet:
 包含<url-pattern>/</url-patttern>的pattern 匹配沒有其他pattern匹配的request。這叫默認映射。 映射到默認映射的servlet叫默認servlet。
 默認映射一般到一個應用的第一頁。顯式提供一個默認映射保證了不正確的URL requests 被映射到可由應用所處理的return而不是給出一個return error。
 如下的<servlet-mapping>元素將默認映射映射到Welcome servlet實例
<servlet-mapping>
  <servlet-name>Welcome</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

包含此元素的web.xml會將任何其他映射無法處理的 request 送給Welcome servlet。

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