Servlet和Filter的url匹配以及url-pattern詳解
Servlet和filter是J2EE開發(fā)中常用的技術(shù),使用方便,配置簡單,老少皆宜。估計大多數(shù)朋友都是直接配置用,也沒有關(guān)心過具體的細節(jié),今天遇到一個問題,上網(wǎng)查了servlet的規(guī)范才發(fā)現(xiàn),servlet和filter中的url-pattern還是有一些文章在里面的,總結(jié)了一些東西,放出來供大家參考,以免遇到問題又要浪費時間。 一,servlet容器對url的匹配過程:
根據(jù)這個規(guī)則表,就能很清楚的知道servlet的匹配過程,所以定義servlet的時候也要考慮url-pattern的寫法,以免出錯。 對于filter,不會像servlet那樣只匹配一個servlet,因為filter的集合是一個鏈,所以只會有處理的順序不同,而不會出現(xiàn)只選擇一個filter。Filter的處理順序和filter-mapping在web.xml中定義的順序相同。 二,url-pattern詳解
在web.xml文件中,以下語法用于定義映射: l 以”/’開頭和以”/*”結(jié)尾的是用來做路徑映射的。 l 以前綴”*.”開頭的是用來做擴展映射的。 l “/” 是用來定義default servlet映射的。 l 剩下的都是用來定義詳細映射的。比如: /aa/bb/cc.action 所以,為什么定義”/*.action”這樣一個看起來很正常的匹配會錯?因為這個匹配即屬于路徑映射,也屬于擴展映射,導致容器無法判斷。 【參考內(nèi)容】 Java Servlet 2.4 Specification
|
|
來自: ShangShujie > 《j2ee》
評論
可以自己寫個filter/servlet去實現(xiàn)這樣的匹配功能,目前servlet規(guī)范還不支持這樣的功能。
是不是應該”/**.action"這樣寫
是啊.有好多人碰到這個問題.
所以現(xiàn)在我用urlrewrite來做這個事情.
<br />
猜測可能是這樣(沒有測試,請指正錯誤):<br />
<br />
<ul>
<li>通配符*只在前三種類型中有用。在精確匹配類型中,*沒有任何特殊含義(或者做為一個配置錯誤?)</li>
</ul>
<ul>
<li>樓主說的那個例子(/*.action)的問題,按照定義,肯定不屬于前三種任何一種類型。注意第一種類型的“and”邏輯。</li>
<li>究竟什么是一個extension類型?原文中對extension的定義是:最后一個“."字符后面的部分中的最后一個分段(fragment)</li>
</ul>
<br />
<br />
正是因為/*.action屬于一個比較模糊的范疇(自己推測的),所以設置這樣一個urlparttern才會報錯。
至于extension類型,原文有兩個說法,其實也是一樣的。
srv11中提到:
An extension is defined as the part of the last segment after the last ’.’ character.
ser12中提到:
A string beginning with a ‘*.’ prefix is used as an extension mapping.
只是兩者針對角度不同,srv11是針對如何來映射一個url而講的。srv12是針對配置來講的。
猜測可能是這樣(沒有測試,請指正錯誤):
受教了,多謝
另外沒有說清楚類似:aaa/bbb/ccc.jsp?id=1這種帶有問號的方式是如何映射的。
對于一個需要映射的url,只要按照上面所說的順序,就能知道會被映射到哪個servlet。
另外沒有說清楚類似:aaa/bbb/ccc.jsp?id=1這種帶有問號的方式是如何映射的。
謝謝lz!!!!
謝謝lz!!!!