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