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

我有一个内容为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处理。为什么?

谢谢你们的帮助。我意识到行为取决于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

回答:

从Servlet 3.0

规范开始,这是Web容器在收到请求后必须定位servlet的方式(重点是我的):

用于映射到servlet的路径是来自请求对象的请求URL减去上下文路径和路径参数。以下URL路径映射规则按顺序使用。

  1. 容器将尝试查找请求路径与Servlet路径的精确匹配。成功匹配将选择servlet。
  2. 3.

    如果URL路径中的最后一个段包含扩展名(例如.jsp),则servlet容器将尝试匹配处理该扩展名请求的servlet。扩展名定义为最后一个段之后的最后一个段的一部分。字符。

  3. 如果前三个规则均未导致servlet匹配,则容器将尝试提供适合于所请求资源的内容。如果为应用程序定义了“默认”

    servlet,则将使用它。许多容器提供了一个隐式默认servlet来提供内容。

容器必须使用区分大小写的字符串比较进行匹配。

您还应该查看映射的规范(如下所示):

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

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

  • ‘*.’前缀开头的字符串用作扩展名映射。

  • 空字符串("")是一种特殊的URL模式,它精确地映射到应用程序的上下文根,即形式的请求

    http://host:port/<contextroot>/。在这种情况下,路径信息为’/’,而servlet路径和上下文路径为空字符串(““)

  • 仅包含’/’字符的字符串表示应用程序的“默认”

    servlet。在这种情况下,Servlet路径是请求URI减去上下文路径,并且路径信息为null。

  • 所有其他字符串仅用于完全匹配

现在让我们来看一些例子。考虑以下一组映射:

路径模式Servlet

/ foo / bar / * servlet1

/ baz / * servlet2

/目录servlet3

* .bop servlet4

将导致以下行为:

传入路径Servlet处理请求

/foo/bar/index.html servlet1

/foo/bar/index.bop servlet1

/ baz servlet2

/baz/index.html servlet2

/目录servlet3

/catalog/index.html“默认” servlet

/catalog/racecar.bop servlet4

/index.bop servlet4

请注意,在的情况下/catalog/index.html/catalog/racecar.bop,该servlet映射到“/catalog”不使用,因为并不是完全配对。

现在遇到您的问题了:)

/path/test属于映射规范的第5点。这意味着只有以结尾的路径才是/path/testtarget servlet1

但是/path/test/*符合相同规范的第一点。这意味着:

.../path/test将处理servlet1

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

我在测试应用程序中对此进行了验证。

以上是 web.xml中的Servlet URL映射如何使用? 的全部内容, 来源链接: utcz.com/qa/414435.html

回到顶部