web.xml中servlet-mapping的配置


<servlet-mapping>元素在Servlet和URL樣式之間定義一個映射。它包含了兩個子元素<servlet- name>和<url-pattern>,<servlet-name>元素給出的Servlet名字必須是 在<servlet>元素中聲明過的Servlet的名字。<url-pattern>元素指定對應於Servlet的URL路 徑,該路徑是相對於Web應用程序上下文根的路徑。例如:

<servlet-mapping> 
<servlet-name>helloworld</servlet-name> 
<url-pattern>/hello</url-pattern> 
</servlet-mapping>

Servlet 2.5規范允許<servlet-mapping>的<url-pattern>子元素出現多次,之前的規范只允許一 個<servlet-mapping>元素包含一個<url-pattern>子元素。我們看下面的例子:

<servlet-mapping> 
<servlet-name>welcome</servlet-name> 
<url-pattern>/en/welcome</url-pattern> 
<url-pattern>/zh/welcome</url-pattern> 
</servlet-mapping>

在配置了Servlet與URL樣式之間的映射后,當Servlet容器接收到一個請求,它首先確定該請求應該由哪一個Web應用程序來響應。這是 通過比較請求URI的開始部分與Web應用程序的上下文路徑來確定的。映射到Servlet的路徑是請求URI減去上下文的路徑,Web應用程序的 Context對象在去掉請求URI的上下文路徑后,將按照下面的路徑映射規則的順序對剩余部分的路徑進行處理,並且在找到第一個成功的匹配后,不再進行 下一個匹配。

容器試着對請求的路徑和Servlet映射的路徑進行精確匹配,如果匹配成功,則調用這個Servlet來處理請求。

容器試着匹配最長的路徑前綴,以斜杠(/)為路徑分隔符,按照路徑樹逐級遞減匹配,選擇最長匹配的Servlet來處理請求。

如果請求的URL路徑最后有擴展名,如.jsp,Servlet容器會試着匹配處理這個擴展名的Servlet。

如果按照前面3條規則沒有找到匹配的Servlet,容器會調用Web應用程序默認的Servlet來對請求進行處理,如果沒有定義默認的Servlet,容器將向客戶端發送HTTP 404錯誤信息(請求資源不存在)。

在部署描述符中,可以使用下面的語法來定義映射。

以/開始並且以 /* 結束的字符串用來映射路徑,例如:

 <url-pattern>/admin/*</url-pattern>

如果沒有精確匹配,那么對/admin/路徑下的資源的所有請求將由映射了上述URL樣式的Servlet來處理。

以 *. 為前綴的字符串用來映射擴展名,例如:

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

如果沒有精確匹配和路徑匹配,那么對具有.do擴展名的資源的請求將由映射了上述URL樣式的Servlet來處理。

以一個單獨的/指示這個Web應用程序默認的Servlet,例如:

 <url-pattern>/</url-pattern>

如果對某個請求沒有找到匹配的Servlet,那么將使用Web應用程序的默認Servlet來處理。

所有其他的字符被用於精確匹配,例如:

<url-pattern>/login</url-pattern>

如果請求/login,那么將由映射了URL樣式/login的Servlet來處理。

下面我們看幾個請求映射的例子,如表3-2和表3-3所示。

表3-2 Servlet映射

映射的 URL

對應的 Servlet

/hello

servlet1

/bbs/admin/*

servlet2

/bbs/*

servlet3

*.jsp

servlet4

/

servlet5

表3-3 實際請求映射的結果

去掉上下文路徑的剩余路徑

處理請求的 Servlet

/hello

servlet1

/bbs/admin/login

servlet2

/bbs/admin/index.jsp

servlet2

/bbs/display

servlet3

/bbs/index.jsp

servlet3

/bbs

servlet3

/index.jsp

servler4

/hello/index.jsp

servlet4

/hello/index.html

servlet5

/news

servlet5

Tomcat在%CATALINA_HOME%\conf\web.xml文件中配置了默認的Servlet,配置代碼如下:

<servlet> 
<servlet-name>default</servlet-name> 
<servlet-class> 
org.apache.catalina.servlets.DefaultServlet </servlet-class> 
<init-param> 
<param-name>debug</param-name> 
<param-value>0</param-value> 
</init-param> 
<init-param> 
<param-name>listings</param-name> 
<param-value>true</param-value> 
</init-param> 
<load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
<servlet-name>default</servlet-name> 
<url-pattern>/</url-pattern> 
</servlet-mapping>

%CATALINA_HOME%\conf\web.xml文件中的配置將被運行在同一個Tomcat實例中的所有Web應用程序所共享


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM