java - servlet 映射中的歧义

标签 java tomcat servlets

我有两个 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/

相关文章:

java - 获取 JTextArea 中的位置并使用计时器

java - 在 spring boot 中设置嵌入式 tomcat 属性,bean 用法?

session 感知应用程序

java - 如何配置 Tomcat 在调用 HttpServletResponse.encodeURL() 时不将 session ID 编码到 URL 中

java - Tomcat 管理器中的 Web 应用程序版本

java - 如何在 Apache HttpPost 中一起发布多种类型的参数

java - 所有请求的 Servlet 过滤器

java - 如何将标签添加到选项卡式 Pane 上的额外空间

java - 如何在MVC中连接到Java(jsp,servlet)中的不同表?

java - 在 playframework 中的 CRUD 区域中搜索的代码