解決tomcat關(guān)于配置servlet的url-pattern的問(wèn)題

服務(wù)器

這篇文章主要講解了解決tomcat關(guān)于配置servlet的url-pattern的問(wèn)題,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。

盂縣網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)自2013年起到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)

tomcat在配置web.xml的時(shí)候,servlet是一個(gè)比較重要的問(wèn)題,在這里討論一下servlet中的幾個(gè)痛點(diǎn)

servlet url-pattern的匹配問(wèn)題url-pattern中 //*的區(qū)別url-pattern的優(yōu)先級(jí)問(wèn)題根路徑 /的匹配問(wèn)題

1 servlet url-pattern的匹配問(wèn)題

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

1.1 精確匹配

<url-pattern>中配置的項(xiàng)必須與url完全精確匹配。

代碼舉例:point_down:

<servlet-mapping>
 <servlet-name>MyServlet</servlet-name>
 <url-pattern>/kata/detail.html</url-pattern>
 <url-pattern>/demo.html</url-pattern>
 <url-pattern>/table</url-pattern>
</servlet-mapping>

當(dāng)在瀏覽器中輸入如下幾種url時(shí),都會(huì)被匹配到該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,不會(huì)被當(dāng)作 http://10.43.11.143/myapp/table識(shí)別

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

http://10.43.11.143/myapp/table&#63;hello這個(gè)請(qǐng)求就會(huì)被匹配到MyServlet。

1.2 路徑匹配

以“/”字符開(kāi)頭,并以“/*”結(jié)尾的字符串用于路徑匹配

代碼舉例:point_down:

<servlet-mapping>
 <servlet-name>MyServlet</servlet-name>
 <url-pattern>*.jsp</url-pattern>
 <url-pattern>*.action</url-pattern>
</servlet-mapping>

路徑以/user/開(kāi)始,后面的路徑可以任意。比如下面的url都會(huì)被匹配。

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

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

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

1.3 后綴匹配

以“*.”開(kāi)頭的字符串被用于后綴匹配

代碼舉例:point_down:

<servlet-mapping>
 <servlet-name>MyServlet</servlet-name>
 <url-pattern>*.jsp</url-pattern>
 <url-pattern>*.action</url-pattern>
</servlet-mapping>

則任何擴(kuò)展名為jsp或action的url請(qǐng)求都會(huì)匹配,比如下面的url都會(huì)被匹配

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

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

注意:路徑和后綴匹配無(wú)法同時(shí)設(shè)置

注意:路徑和擴(kuò)展名匹配無(wú)法同時(shí)設(shè)置,比如下面的三個(gè)都是非法的,如果設(shè)置,啟動(dòng)tomcat服務(wù)器會(huì)報(bào)錯(cuò)。

<url-pattern>/kata/*.jsp</url-pattern>

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

<url-pattern>he*.jsp</url-pattern>

幾個(gè)實(shí)例:point_down:,不明白請(qǐng)看本文第三章

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

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

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

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

再說(shuō) /, /是匹配優(yōu)先級(jí)低的匹配 ,當(dāng)一個(gè)url和所有的 url-pattern匹配都不合適的時(shí)候,這個(gè)url就會(huì)走 /匹配,根本就沒(méi)有什么 *.jsp的限制,大家之所以產(chǎn)生了(客觀上也確實(shí)是這樣) /不會(huì)匹配 *.jsp但是 /*會(huì)匹配 *.jsp的原因是在tomcat/conf/web.xml里面單獨(dú)配置了 *.jsp的配置, 具體請(qǐng)看本文第三章

3 url-pattern的優(yōu)先級(jí)問(wèn)題

當(dāng)一個(gè)url與多個(gè)servlet的匹配規(guī)則可以匹配時(shí),則按照 “ 精確路徑 > 最長(zhǎng)路徑>后綴匹配”這樣的優(yōu)先級(jí)匹配到對(duì)應(yīng)的servlet。

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

例2:比如servletA的url-pattern為/test/ ,而servletB的url-pattern為/test/a/,此時(shí)訪問(wèn)http://localhost/test/a時(shí),容器會(huì)選擇路徑最長(zhǎng)的servlet來(lái)匹配,也就是這里的servletB。

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

那么就產(chǎn)生了一個(gè)疑問(wèn)。為什么 /*會(huì)匹配到 *.jsp,但是/匹配不到 *.jsp

原因很簡(jiǎn)單,在tomcat/conf/web.xml里面會(huì)有如下配置

<servlet-mapping>
 <servlet-name>default</servlet-name>
 <url-pattern>/</url-pattern>
</servlet-mapping>

<!-- The mappings for the JSP servlet -->
<servlet-mapping>
 <servlet-name>jsp</servlet-name>
 <url-pattern>*.jsp</url-pattern>
 <url-pattern>*.jspx</url-pattern>
</servlet-mapping>

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

4 根路徑 /的匹配問(wèn)題

大家應(yīng)該會(huì)注意到一個(gè)問(wèn)題,就是當(dāng)url-pattern為/*的時(shí)候訪問(wèn)http://localhost:8080/會(huì)404,但是訪問(wèn)http://localhost:8080/index.html卻沒(méi)有問(wèn)題(當(dāng)然前提是在spring容器里面配置了 <mvc:default-servlet-handler/>)。當(dāng)url-pattern為/時(shí), http://localhost:8080/ 會(huì)自動(dòng)轉(zhuǎn)發(fā)到 http://localhost:8080/index.html 而不會(huì)404。原因是什么呢?

首先,我們必須要明確,一個(gè)網(wǎng)址的根目錄即/(比如http://localhost:8080/)到底意味著什么?經(jīng)過(guò)實(shí)驗(yàn)發(fā)現(xiàn)/是很特殊的,它會(huì)被url-pattern為/*的匹配,但他不會(huì)被url-pattern為/匹配。

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

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

<!-- ==================== Default Welcome File List ===================== -->
<!-- When a request URI refers to a directory, the default servlet looks -->
<!-- for a "welcome file" within that directory and, if present, to the -->
<!-- corresponding resource URI for display. -->
<!-- If no welcome files are present, the default servlet either serves a -->
<!-- directory listing (see default servlet configuration on how to -->
<!-- customize) or returns a 404 status, depending on the value of the -->
<!-- listings setting. -->
<!-- -->
<!-- If you define welcome files in your own application's web.xml -->
<!-- deployment descriptor, that list *replaces* the list configured -->
<!-- here, so be sure to include any of the default values that you wish -->
<!-- to use within your application.

:point_up_2:上面是講 Welcome File List的,即 /路徑會(huì)被默認(rèn)轉(zhuǎn)發(fā)到 Welcome File List中規(guī)定的網(wǎng)頁(yè),即初始頁(yè)。我翻譯一下上面的一部分,具體的可以谷歌翻譯,翻譯:point_right:

翻譯:point_down:

當(dāng)請(qǐng)求URI指向目錄時(shí),默認(rèn)servlet在該目錄中查找“歡迎文件”,如果存在,則在相應(yīng)的資源URI中查找以進(jìn)行顯示。如果不存在歡迎文件,則默認(rèn)servlet會(huì)提供目錄列表(請(qǐng)參閱默認(rèn)servlet配置中的有關(guān)如何自定義的內(nèi)容)或返回404狀態(tài),具體取決于列表設(shè)置的值

/會(huì)重定向到歡迎頁(yè)面的原因是 Welcome File List的存在, Welcome File List發(fā)揮效果的前提是/必須被defaultservlet匹配。當(dāng)某一個(gè)servlet的url-pattern為/*時(shí),/就會(huì)被這個(gè)servlet匹配,從而不被defaultservlet匹配。所以只有在自己定義的servlet的url-pattern為/時(shí), http://localhost:8080/ 會(huì)自動(dòng)轉(zhuǎn)發(fā)到 http://localhost:8080/index.html 而不會(huì)404

看完上述內(nèi)容,是不是對(duì)解決tomcat關(guān)于配置servlet的url-pattern的問(wèn)題有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前文章:解決tomcat關(guān)于配置servlet的url-pattern的問(wèn)題
文章路徑:http://muchs.cn/article22/chcpcc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)動(dòng)態(tài)網(wǎng)站、定制網(wǎng)站全網(wǎng)營(yíng)銷推廣、用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)