Servlet规范当中对映射请求的描述:
在收到客户端请求时,web 容器确定转发到哪一个Web应用。选择的Web应用必须具有最长的上下文路径匹配请求URL的开始。当映射到Servlet时,URL匹配的一部分是上下文。Web 容器接下来必须用下面描述的路径匹配步骤找出servlet来处理请求。用于映射到Servlet的路径是请求对象的请求URL减去上下文和路径参数部分。下面的URL路径映射规则按顺序使用。使用第一个匹配成功的且不会进一步尝试匹配:
下面详细描述容器的匹配过程:
根据这个规则表,就能很清楚的知道servlet的匹配过程,所以定义servlet的时候也要考虑url-pattern的写法,以免出错。 对于filter,不会像servlet那样只匹配一个servlet,因为filter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一个filter。Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同。
url-pattern详解,在web.xml文件中,以下语法用于定义映射:
所以,为什么定义”/*.action”这样一个看起来很正常的匹配会错?因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断。
下面详细讲述对于上面比配情况Servlet API当中方法的值情况:
|-- Context Path --|-- Servlet Path -|--Path Info--|
http://www.myserver.com /mywebapp /helloServlet /hello
|-------- Request URI ----------------------------|
记住下面三点:
识别servlet路径 :
为了匹配一个servlet请求URI,servlet容器遵循一个简单的算法。 一旦确定了上下文路径,如果有的话,它会评估该请求URI的其余部分与在部署描述符中指定的servlet映射,按下列顺序。如果它找到一个匹配在任何步骤,它不采取下一个步骤。
通过例子来熟悉一下:
<servlet-mapping> <servlet-name>RedServlet</servlet-name> <url-pattern>/red/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>RedServlet</servlet-name> <url-pattern>/red/red/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>RedBlueServlet</servlet-name> <url-pattern>/red/blue/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>BlueServlet</servlet-name> <url-pattern>/blue/</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>GreenServlet</servlet-name> <url-pattern>/green</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ColorServlet</servlet-name> <url-pattern>*.col</url-pattern> </servlet-mapping>
Request
URI
Servlet
Used Servlet
Path Path Info
/colorapp/red
RedServlet
/red
null
/colorapp/red/
RedServlet
/red
/
/colorapp/red/aaa
RedServlet
/red
/aaa
/colorapp/red/blue/aa
RedBlueServlet
/red/blue
/aa
/colorapp/red/red/aaa
RedServlet
/red/red
/aaa
/colorapp/aa.col
ColorServlet
/aa.col
null
/colorapp/hello/aa.col
ColorServlet
/hello/aa.col
null
/colorapp/red/aa.col
RedServlet
/red
/aa.col
/colorapp/blue
NONE(Error
message)
/colorapp/hello/blue/
NONE(Error
message)
/colorapp/blue/mydir
NONE(Error
message)
/colorapp/blue/dir/aa.col
ColorServlet
/blue/dir/aa.col
null
/colorapp/green
GreenServlet
/green
null
原文:http://www.cnblogs.com/renchunxiao/p/3676039.html