我有两个 servlet“ExtensionServlet”和“PatternServlet”以及一个静态 html 页面。 HTML 代码如下。
<html>
<head>
<title>
Resolve servlet ambiguity
</title>
</head>
<body>
<form action="servlets/form.col" method="POST">
<input type="submit" value="Goto Servlet">
</form>
</body>
</html>
Deployment描述符如下。
<?xml version="1.0" encoding="ISO-8859-1" ?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
<servlet>
<servlet-name>Extension Servlet</servlet-name>
<servlet-class>ExtensionServlet</servlet-class>
<servlet-name>Pattern Servlet</servlet-name>
<servlet-class>PatternServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Extension Servlet</servlet-name>
<url-pattern>*.col</url-pattern>
<servlet-name>Pattern Servlet</servlet-name>
<url-pattern>/servlets/*</url-pattern>
</servlet-mapping>
</web-app>
当我单击 HTML 页面中的按钮时,它会转到 “PatternServlet”。如果我按如下所示重新排列部署描述符中的 servlet 顺序,它将转到 "ExtensionServlet"
<?xml version="1.0" encoding="ISO-8859-1" ?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
<servlet>
<servlet-name>Pattern Servlet</servlet-name>
<servlet-class>PatternServlet</servlet-class>
<servlet-name>Extension Servlet</servlet-name>
<servlet-class>ExtensionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Pattern Servlet</servlet-name>
<url-pattern>/servlets/*</url-pattern>
<servlet-name>Extension Servlet</servlet-name>
<url-pattern>*.col</url-pattern>
</servlet-mapping>
</web-app>
谁能解释一下这种行为?
Tomcat 6.0.20 JVM 1.6.0_15-b03
最佳答案
您的架构是以下内容的缩写吗?
<?xml version="1.0" encoding="ISO-8859-1" ?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
<servlet>
<servlet-name>Pattern Servlet</servlet-name>
<servlet-class>PatternServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>Extension Servlet</servlet-name>
<servlet-class>ExtensionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Pattern Servlet</servlet-name>
<url-pattern>/servlets/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Extension Servlet</servlet-name>
<url-pattern>*.col</url-pattern>
</servlet-mapping>
</web-app>
在您的版本中,我认为您只定义了一个 servlet。
当 tomcat 遇到多个与请求匹配的定义时(如您的情况),它会使用第一个。
关于java - servlet 映射中的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1571597/