Servlet 映射:带有斜杠的 URL 的 url-pattern

Posted

技术标签:

【中文标题】Servlet 映射:带有斜杠的 URL 的 url-pattern【英文标题】:Servlet mapping: url-pattern for URLs with trailing slash 【发布时间】:2011-05-21 14:57:47 【问题描述】:

我有一个与 servlet 映射有关的问题。我在 web.xml 中有以下内容:

<servlet>
    <servlet-name>HelloWorldServlet</servlet-name>
    <servlet-class>test.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloWorldServlet</servlet-name>
    <url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>

如果我访问 http://localhost:&lt;port&gt;/MyApp/HelloWorld,则调用 servlet HelloWorldServlet

我还希望我的 serverlet 响应 http://localhost:&lt;port&gt;/MyApp/HelloWorld/。我怎样才能达到这个效果?我正在使用 NetBeans 进行开发,但它不允许我放置以 / 结尾的模式。

【问题讨论】:

它不是已经工作了吗? 如果你把尾随的“/”放在一起会发生什么? 如果我在没有netbeans前端的情况下编辑xml并部署项目,图像、css和js没有加载O.o. 如果我在没有netbeans前端的情况下编辑xml并部署项目,css、js、图像等不会加载O.o。正如所有人所说,解决方案是使用语法 /*。有了这个,你可以调用 .../HelloWorld 和 .../HelloWorld/。如果我写 .../HelloWorld/foo 调用相同的 servlet(就像在这个页面中一样)。如果你不想要这种效果,你必须使用 HttpServletRequest.getPathInfo() 方法,正如精英绅士所说的那样。如果结果与“/”不同,则重定向到一个jsp以显示错误(未找到)。 【参考方案1】:

&lt;url-pattern&gt; 上添加通配符后

<url-pattern>/HelloWorld/*</url-pattern>

您可以使用HttpServletRequest.getPathInfo() 获取与该 URL 关联的额外路径。

例如

http://localhost:&lt;port&gt;/MyApp/HelloWorld/one/

结果将是

/one/

来自 JavaDoc:

返回任何额外的路径信息 与客户端的 URL 关联 当它提出这个请求时发送。这 额外的路径信息如下 servlet 路径,但在查询之前 字符串,以“/”开头 字符。

【讨论】:

【参考方案2】:

使用通配符。您可以将流向特定 URL 的所有流量重定向到同一个 servlet。例如,您可以添加以下内容:

<servlet-mapping>
    <servlet-name>HelloWorldServlet</servlet-name>
    <url-pattern>/HelloWorld/*</url-pattern>
</servlet-mapping>

这会将带有斜杠的 URL 重定向到您的原始 servlet。

一个想法 - 这会将任何到这个 URL 模式的东西重定向到 servlet。如果你想让其他 URL 超过这个 URL,你应该创建一个 servlet,它将重定向到正确的 URL(通过查看指定的 URL)。或者,您可以使用为您提供映射的框架。

【讨论】:

以上是关于Servlet 映射:带有斜杠的 URL 的 url-pattern的主要内容,如果未能解决你的问题,请参考以下文章

带有 url 模式“/ *”的 servlet 映射中的 ***Error

带有变量的 Servlet 映射(Tomcat 7.0)

URL末尾处的斜杠“/”

如何映射 URL 中包含斜杠(通配符映射)[重复]

如何将带有斜杠的 URL 重定向到没有斜杠的相应 URL?

带有或不带有斜杠的 PHP RegEx