我有一个包含内容的web.xml文件:
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>org.mycompany.test1</servlet-class>
</servlet>
<servlet>
<servlet-name>servlet2</servlet-name>
<servlet-class>org.mycompany.test2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet1</servlet-name>
<url-pattern>/path/test</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>servlet2</servlet-name>
<url-pattern>/path/test/*</url-pattern>
</servlet-mapping>
我试过请求
.../path/test/abc
.../path/test
这两个请求都由Servlet2处理 . 为什么?
UPDATE
谢谢你们的帮助 . 我意识到行为取决于servlet映射声明的顺序 . 我试过这个web.xml
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>org.mycompany.test1</servlet-class>
</servlet>
<servlet>
<servlet-name>servlet2</servlet-name>
<servlet-class>org.mycompany.test2</servlet-class>
</servlet>
<servlet>
<servlet-name>servlet3</servlet-name>
<servlet-class>org.mycompany.test3</servlet-class>
</servlet>
<servlet>
<servlet-name>servlet4</servlet-name>
<servlet-class>org.mycompany.test4</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet1</servlet-name>
<url-pattern>/path/test</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>servlet2</servlet-name>
<url-pattern>/path/test/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>servlet3</servlet-name>
<url-pattern>/path/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>servlet4</servlet-name>
<url-pattern>/path</url-pattern>
</servlet-mapping>
结果:
.../path/test/abc - servlet2
.../path/test/ - servlet2
.../path/test - servlet2
.../path/abc - servlet3
.../path/ - servlet4
.../path - servlet4
2 回答
从Servlet 3.0 specification,这是Web容器在收到请求后必须找到servlet的方式(强调我的):
您还应该查看映射的规范(如下所示):
我们现在看一下例子 . 考虑以下映射集:
将导致以下行为:
请注意,在
/catalog/index.html
和/catalog/racecar.bop
的情况下,未使用映射到“/catalog”
的servlet,因为匹配不准确 .现在来解决你的问题:)
/path/test
属于映射规范的第5点 . 这意味着只有以/path/test
结尾的路径才会定位servlet1
.但是
/path/test/*
符合相同规范的第一点 . 这意味着:.../path/test
将由servlet1
和 . 处理.../path/test/abc
将由servlet2
处理我在测试应用程序中验证了这一点 .
你的路径冲突 .
你的两条路径都是一样的,'/ *'没有任何区别 . 显然,当您尝试路径时,将执行最后一个匹配(servlet2) .
您通常会使用Servlet名称放入路径,例如: