servlet的註冊和映射

Servlet程序需要在web.xml中註冊和映射,纔可以被Servlet引擎(容器)加載和被外界訪問。

Servlet註冊

xml代碼:

<web-app>  
  ...  
   <servlet>
      <servlet-name>HelloWeb</servlet-name>
      <servlet-class>
         org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
      <load-on-startup>1</load-on-startup>
   </servlet>  
  ...  
</web-app>

在 web.xml 文件中,servlet 元素及其子元素用來註冊 Servlet。

元素 功能 說明
servlet-name 指定Servlet的名稱,在同一個Web應用程序中,其名稱必須是唯一的 必須包含
servlet-class 指定Servlet類的完整限定名(包含包名) 必須包含(servlet-class或jsp-file)
jsp-file 指定在Web應用程序中的JSP文件的完整路徑,該路徑以斜槓(/)開始。 必須包含(servlet-class或jsp-file)
init-param 定義Servlet的初始化參數。如果使用了init-param元素,則必須包含param-name和param-value元素,可以包含零個或多個description元素 可以有零個或多個
load-on-startup 指定當Web應用程序啓動時,Servlet被加載的次序,先加載數值小的Servlet,再加載數值大的Servlet 可以有零個或一個
description 爲Servlet指定一個文本描述 可以有零個或多個

Servlet映射

xml代碼:

<web-app>  
  ...  
   <servlet-mapping>
      <servlet-name>HelloWeb</servlet-name>
      <url-pattern>/</url-pattern>
   </servlet-mapping>
  ...  
</web-app>

在 web.xml 文件中,servlet-mapping 元素用來在Servlet和URL樣式之間定義一個映射。它包含兩個元素servlet-name和url-pattern。

  • servlet-name:Servlet名稱,其必須是在servlet元素中聲明過的Servlet名稱
  • url-pattern:指定對應於Servlet的URL路徑

注意:在Servlet2.5規範中,允許servlet-mapping元素中的url-pattern子元素出現多次,之前的規範只允許一個servlet-mapping元素包含一個url-pattern子元素。

如何映射請求到Servlet?

在配置了Servlet與URL樣式之間的映射之後,當Servlet容器接收到一個請求時,它首先確定該請求應該由哪一個Web應用程序來響應。這是通過比較請求URL的開始部分與Web應用程序的上下文路徑來確定的。映射到Servlet的路徑是請求URL路徑減去上下文路徑。下面的URL路徑映射規則按順序使用找到第一個匹配後,將不會進一步嘗試匹配。

  • 容器嘗試對請求的路徑(減去上下文路徑後的路徑)和Servlet映射的路徑(url-pattern參數所指定的路徑樣式)進行精確匹配,如果匹配成功,則調用這個Servlet來處理請求
  • 容器試着匹配最長的路徑前綴,以斜槓(/)爲路徑分隔符,按照路徑樹逐級遞減匹配,選擇最長匹配的Servlet來處理請求
  • 如果請求的URL路徑最後有擴展名,如.jsp,Servlet容器將會試着匹配處理這個擴展名的Servlet
  • 如果按照前面三條規則沒有找到匹配的Servlet,容器將會調用Web應用程序默認的Servlet來對請求進行處理;如果沒有定義默認的Servlet,容器將會向客戶端發送HTTP 404錯誤信息(請求資源不存在)

映射規範

在web應用部署中描述符中,以下語法用於定義映射:

  • 以‘/’字符開始,以‘/*’後綴結尾的字符串用於路徑匹配
  • 以‘*.’開始的字符串用於擴展名映射
  • 單獨的‘/’字符,用於默認的Servlet
  • 所有其他的字符被用於精確匹配,如‘/login’

下面列出了幾個請求映射的例子:
Servlet映射

URL形式 對應的Servlet
/foo/bar/* servlet1
/baz/* servlet2
/catalog servlet3
*.bop servlet4

實際請求映射的結果

去掉上下文路徑後的剩餘路徑 對應的Servlet
/foo/bar/index.html servlet1
/foo/bar/index.bop servlet1
/baz servlet2
/baz/index.html servlet2
/catalog servlet3
/catalog/index.html 默認的servlet
/catalog/racecar.bop servlet4
/index.bop servlet4

注意:在/catalog/index.html和/catalog/racecar.bop的情況下,由於不是精確匹配,不使用映射到“/catalog”的servlet。

參考資料

  1. Java Servlet Specification(Version 3.0)
  2. Servlet JSP深入詳解:基於Tomcat的Web開發
  3. O’Reilly:Head First Servlets and JSP(第2版)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章