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。