有关servlet映射的重要规则:
1)容器会按上一页显示的顺序查找匹配。换句话说,首先查找完全匹配。如果找不到完全匹配,再查找目录匹配,如果目录匹配也找不到,就查找扩展名匹配。
2)如果一个请求与多个目录<url-pattern>匹配,容器会选择最长的匹配。换句话说,如果请求/foor/bar/myStuff.do,它就会映射到<url-pattern> /foor/bar/*,尽管这个请求与<url-pattern>/foo/*也匹配,但是前者更长一些。总是取最特定的匹配。
<servlet>
<servlet-name>One</servlet-name>
<servlet-class>foo.DeployTestOne</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>One</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Two</servlet-name>
<servlet-class>foo.DeployTestTwo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Two</servlet-name>
<url-pattern>/fooStuff/bar</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Three</servlet-name>
<servlet-class>foo.DeployTestThree</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Three</servlet-name>
<url-pattern>/fooStuff/*</url-pattern>
</servlet-mapping>
请求:
http://localhost:8080/MapTest/blue.do
容器选择: DeployTestOne
(与*.do扩展名模式匹配)
http://localhost:8080/MapTest/fooStuff/bar
容器选择: DeployTestTwo
( /fooStuff/bar 模式完全匹配)
http://localhost:8080/MapTest/fooStuff/bar/blue.do
容器选择: DeployTestThree
(与/fooStuff/*目录 模式匹配)
http://localhost:8080/MapTest/fooStuff/blue.do
容器选择: DeployTestThree
(与 /fooStuff/* 目录模式匹配)
http://localhost:8080/MapTest/fred/blue.do
容器选择: DeployTestOne
(与*.do 扩展名模式匹配)
http://localhost:8080/MapTest/fooStuff
容器选择: DeployTestThree
(与/fooStuff/* 目录模式匹配)
http://localhost:8080/MapTest/fooStuff/bar/foo.fo
容器选择: DeployTestThree
(与/fooStuff/* 目录模式匹配)
http://localhost:8080/MapTest/fred/blue.fo
容器选择: 404 NOT FOUND
(与任何类型都不匹配)