当前位置: 首页 > 知识库问答 >
问题:

如何使用web.xml中的Servlet url映射?

宋华美
2023-03-14
<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处理。为什么?

更新

<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

共有1个答案

易焱
2023-03-14

根据Servlet3.0规范,这是web容器在收到请求后必须定位Servlet的方式(重点是我的):

用于映射到servlet的路径是来自请求对象的请求URL,减去上下文路径和路径参数。下面的URL路径映射规则按顺序使用。使用第一个成功的匹配,不尝试进一步的匹配:

  1. 容器将尝试找到请求路径与servlet路径的精确匹配。成功的匹配将选择servlet。
  2. 容器将递归地尝试匹配最长的路径前缀。这是通过使用“/”字符作为路径分隔符一次逐级递减路径树目录来完成的。最长的匹配确定所选的servlet。
  3. 如果URL路径中的最后一个段包含扩展(例如,JSP),servlet容器将尝试匹配处理扩展请求的servlet。扩展名定义为最后一个“.”字符之后的最后一个段的部分。
  4. 如果前面三个规则都没有导致servlet匹配,容器将尝试为所请求的资源提供适当的内容。如果为应用程序定义了“默认”servlet,则将使用它。许多容器提供一个隐式默认servlet来服务内容。

在Web应用程序部署描述符中,以下语法用于定义映射:

>

  • '/'字符开头,以'/*'后缀结尾的字符串用于路径映射。

    '*.'前缀开头的字符串用作扩展映射。

    空字符串(“”)是一种特殊的URL模式,它精确映射到应用程序的上下文根,即http://host:port/ / 形式的请求。在本例中,路径信息是'/',servlet路径和上下文路径是空字符串("“)

    只包含'/'字符的字符串指示应用程序的“默认”servlet。在本例中,servlet路径是请求URI减去上下文路径,路径信息为空。

    所有其他字符串仅用于精确匹配

    现在让我们看看例子。考虑以下映射集:

    Path Pattern            Servlet
    /foo/bar/*              servlet1
    /baz/*                  servlet2
    /catalog                servlet3
    *.bop                   servlet4
    
    Incoming Path           Servlet Handling Request
    /foo/bar/index.html     servlet1
    /foo/bar/index.bop      servlet1
    /baz                    servlet2
    /baz/index.html         servlet2
    /catalog                servlet3
    /catalog/index.html     “default” servlet
    /catalog/racecar.bop    servlet4
    /index.bop              servlet4
    

    注意,在/catalog/index.html/catalog/racecar.bop的情况下,映射到“/catalog”的servlet没有被使用,因为匹配不完全。

    现在来讨论你的问题:)

    /path/test属于映射规范的第五点。这意味着只有以/path/test结尾的路径将针对servlet1

    .../path/test将由servlet1

    .../path/test/abc将由servlet2处理

    我在一个测试应用程序中验证了这一点。

  •  类似资料:
    • 问题内容: 我有一个内容为web.xml的文件: 我尝试过要求 这两个请求都由Servlet2处理。为什么? 更新 谢谢你们的帮助。我意识到行为取决于servlet映射声明的顺序。我尝试了这个web.xml 结果: 问题答案: 从Servlet 3.0 规范开始,这是Web容器在收到请求后必须定位servlet的方式(重点是我的): 用于映射到servlet的路径是来自请求对象的请求URL减去上下

    • 我正在尝试在web.xml中映射多个servlet。在我的index.html中,我有一个操作“desktype.do”的表单,当我运行程序时,它成功了。我是这样开始的: …效果很好。它成功地编译,并且在按下我在index.html中设置的按钮后,它就会按照需要运行。在添加了额外的servlet映射之后: 我收到错误“模块尚未部署。详细信息请参阅服务器日志。构建失败(总时间;0秒)”我不确定该怎么

    • 问题内容: xml文件位于我的项目中。我正在使用Eclipse并运行Tomcat(它不是通过Eclipse安装的。我希望它是单独的安装)。 当表单页面提交到servlet时,它不起作用。我每次都收到404错误。我已经遇到这个问题一段时间了。有人请帮助我。 问题答案: 您缺少标记,这对于映射很重要。因此,使用以下命令: 并且您应该像下面这样在表单上赋予价值: 并记下所有值在以下代码中区分大小写: 您

    • 仅供参考:我已经删除了所有apache默认的webapp文件,并启动了我自己的项目,因此可以使用访问它,这很好。 我在驱动器中的servlet位置: 我在eclipse IDE中的包:eclipse IDE映像中的包 和我的web.xml文件: 我的HTML表单: 感谢所有的回复:)

    • xml文件位于我的项目的中。我正在使用Eclipse并运行Tomcat(它不是通过Eclipse安装的,我更希望它是一个单独的安装)。 当表单页面提交给servlet时,它就不起作用了。我每次都得到一个404错误。我遇到这个问题有一段时间了。谁来帮帮我。

    • 问题内容: 我正在尝试将请求映射到servlet根(正确的术语?)。我正在将URL映射到正确的视图,但是找不到页面的一部分的所有静态内容-CSS,JavaScript,图像。 所以在我的web.xml中,我的servlet标记看起来像这样 我的控制器看起来像这样: MyBaseController非常简单。看起来像这样: 我在视图层中使用了Tiles。我的配置如下: /WEB-INF/tiles-