亚洲国产精品人久久,亚洲va国产日韩欧美精品色婷婷,久久久久88色偷偷,免费人成黄页在线观看国际

17站長網

17站長網 首頁 網站 服務器 查看內容

詳解tomcat關于配置servlet的url-pattern的問題思路

2022-12-2 21:51| 查看: 2424 |來源: 互聯(lián)網

大家好,小編來為大家解答以上問題。詳解tomcat關于配置servlet的url-pattern的問題思路很多人還不知道,現在讓我們一起來看看吧!tomcat在配置web.xml的時候,servlet是一個比較重要的問題,在這里討論一下servlet

大家好,小編來為大家解答以上問題。詳解tomcat關于配置servlet的url-pattern的問題思路很多人還不知道,現在讓我們一起來看看吧!tomcat在配置web.xml的時候,servlet是一個比較重要的問題,在這里討論一下servlet中的幾個痛點

  1.  servlet url-pattern的匹配問題
  2. url-pattern中 //* 的區(qū)別
  3. url-pattern的優(yōu)先級問題
  4. 根路徑 / 的匹配問題

1 servlet url-pattern 的匹配問題

url-pattern 有三種匹配模式,分別是路徑匹配、精確匹配、后綴匹配

1.1 精確匹配

中配置的項必須與url完全精確匹配。

代碼舉例:point_down:

MyServlet /kata/detail.html /demo.html /table

當在瀏覽器中輸入如下幾種url時,都會被匹配到該servlet

http://10.43.11.143/myapp/kata/detail.html
http://10.43.11.143/myapp/demo.html

http://10.43.11.143/myapp/table

注意:

http://10.43.11.143/myapp/table/ 是非法的url,不會被當作 http://10.43.11.143/myapp/table 識別

另外上述url后面可以跟任意的查詢條件,都會被匹配,如

http://10.43.11.143/myapp/table?hello 這個請求就會被匹配到MyServlet。

1.2 路徑匹配

以“/”字符開頭,并以“/*”結尾的字符串用于路徑匹配

代碼舉例:point_down:

MyServlet *.jsp *.action

路徑以/user/開始,后面的路徑可以任意。比如下面的url都會被匹配。

http://localhost:8080/appDemo/user/users.html

http://localhost:8080/appDemo/user/addUser.action

http://localhost:8080/appDemo/user/updateUser.actionl

1.3 后綴匹配

以“*.”開頭的字符串被用于后綴匹配

代碼舉例:point_down:

MyServlet *.jsp *.action

則任何擴展名為jsp或action的url請求都會匹配,比如下面的url都會被匹配

http://localhost:8080/appDemo/user/users.jsp

http://localhost:8080/appDemo/toHome.action

注意:路徑和后綴匹配無法同時設置

注意:路徑和擴展名匹配無法同時設置,比如下面的三個 都是非法的,如果設置,啟動tomcat服務器會報錯。

/kata/*.jsp

/*.jsp

he*.jsp

幾個實例:point_down:,不明白請看本文第三章

2 url-pattern中 //* 的區(qū)別

/

/*

先說 /*/* 相對來講比較好理解,它是路徑匹配的一種,從范圍上來講,它是范圍最廣的路徑匹配,所有的請求都符合它的要求,從精度上來講,它是精度最低的路徑匹配( 注意!我說的是路徑匹配 ),路徑匹配的優(yōu)先級是從長到短的( 具體請看本文第三章 ),所以說它是精度最低的路徑匹配。很多博客中說它的特點是匹配 *.jsp ,這不是廢話嗎? /* 本身就是路徑匹配,它當然可以匹配 *.jsp

再說 / , / 是匹配優(yōu)先級最低的匹配 ,當一個url和所有的 url-pattern 匹配都不合適的時候,這個url就會走 / 匹配,根本就沒有什么 *.jsp 的限制,大家之所以產生了(客觀上也確實是這樣) / 不會匹配 *.jsp 但是 /* 會匹配 *.jsp 的原因是在tomcat/conf/web.xml里面單獨配置了 *.jsp 的配置, 具體請看本文第三章

3 url-pattern的優(yōu)先級問題

當一個url與多個servlet的匹配規(guī)則可以匹配時,則按照 “ 精確路徑 > 最長路徑>后綴匹配”這樣的優(yōu)先級匹配到對應的servlet。

例1:比如servletA 的url-pattern為 /test,servletB的url-pattern為 /* ,這個時候,如果我訪問的url為http://localhost/test ,這個時候容器就會先進行精確路徑匹配,發(fā)現/test正好被servletA精確匹配,那么就去調用servletA,不會去管servletB。

例2:比如servletA的url-pattern為/test/ ,而servletB的url-pattern為/test/a/ ,此時訪問http://localhost/test/a時,容器會選擇路徑最長的servlet來匹配,也就是這里的servletB。

例3: 比如servletA的url-pattern:*.action ,servletB的url-pattern為 / * ,這個時候,如果我訪問的url為http://localhost/test.action,這個時候容器就會優(yōu)先進行路徑匹配,而不是去匹配擴展名,這樣就去調用servletB。

那么就產生了一個疑問。為什么 /* 會匹配到 *.jsp ,但是/匹配不到 *.jsp

原因很簡單,在tomcat/conf/web.xml里面會有如下配置

default / jsp *.jsp *.jspx

:point_up_2:可以清楚地看到 *.jsp 作為名為jsp的servlet的后綴匹配,/*是路徑匹配,其優(yōu)先級高于后綴匹配,所以能匹配到后綴為jsp的文件。而 / 是級別最低的匹配,其級別低于后綴匹配,所以jsp文件不會被 url-pattern 為/的匹配到。

4 根路徑 / 的匹配問題

大家應該會注意到一個問題,就是當url-pattern為/*的時候訪問http://localhost:8080/會404,但是訪問http://localhost:8080/index.html卻沒有問題(當然前提是在spring容器里面配置了 )。當url-pattern為/時, http://localhost:8080/ 會自動轉發(fā)到 http://localhost:8080/index.html 而不會404。原因是什么呢?

首先,我們必須要明確,一個網址的根目錄即/(比如http://localhost:8080/)到底意味著什么?經過實驗發(fā)現/是很特殊的,它會被url-pattern為/*的匹配,但他不會被url-pattern為/匹配。

在tomcat中,/默認是屬于會被defaultservlet匹配,但是其優(yōu)先級低于路徑匹配,所以當某一個servlet的url-pattern為/*時,/就會被這個servlet匹配,從而不被defaultservlet匹配。

在tomcat源代碼中找到如下片段可以佐證我的看法:point_down:

以上詳解tomcat關于配置servlet的url-pattern的問題思路就是小編為大家收集整理的全部內容了,希望對大家有所幫助。如果您喜歡這篇文章,可以收藏或分享給您的小伙伴們吧!歡迎持續(xù)關注我們的后續(xù)更新。

本文最后更新于 2022-12-2 21:51,某些文章具有時效性,若有錯誤或已失效,請在網站留言或聯(lián)系站長:17tui@17tui.com
·END·
站長網微信號:w17tui,關注站長、創(chuàng)業(yè)、關注互聯(lián)網人 - 互聯(lián)網創(chuàng)業(yè)者營銷服務中心

免責聲明:本站部分文章和圖片均來自用戶投稿和網絡收集,旨在傳播知識,文章和圖片版權歸原作者及原出處所有,僅供學習與參考,請勿用于商業(yè)用途,如果損害了您的權利,請聯(lián)系我們及時修正或刪除。謝謝!

17站長網微信二維碼

始終以前瞻性的眼光聚焦站長、創(chuàng)業(yè)、互聯(lián)網等領域,為您提供最新最全的互聯(lián)網資訊,幫助站長轉型升級,為互聯(lián)網創(chuàng)業(yè)者提供更加優(yōu)質的創(chuàng)業(yè)信息和品牌營銷服務,與站長一起進步!讓互聯(lián)網創(chuàng)業(yè)者不再孤獨!

掃一掃,關注站長網微信

大家都在看

熱門排行

    最近更新

      返回頂部