Servlet映射:带有斜线结尾的URL的url-pattern

28

我有一个与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:<port>/MyApp/HelloWorld,则会调用servlet HelloWorldServlet
我还希望我的servlet响应http://localhost:<port>/MyApp/HelloWorld/。我该如何实现这个效果?我正在使用NetBeans进行开发,但它不允许我使用以/结尾的模式。

它不已经工作了吗? - thejh
1
如果在末尾加上“/”会发生什么? - darioo
如果我在没有使用NetBeans前端的情况下编辑XML并部署项目,则图像、CSS和JS不会加载O.o。 - Gabriel Llamas
如果我在没有使用NetBeans前端的情况下编辑XML并部署项目,则不会加载CSS、JS、图像等。解决方案是,正如所有人所说,使用语法/*。这样你就可以调用.../HelloWorld和.../HelloWorld/。如果我写.../HelloWorld/foo,同样的servlet被调用(就像在这个页面中一样)。如果你不想要这种效果,你必须使用HttpServletRequest.getPathInfo()方法,就像The Elite Gentleman所说的那样。然后重定向到一个JSP页面来显示错误(未找到),如果结果与“/”不同。 - Gabriel Llamas
2个回答

31

在你已经在<url-pattern>中添加了通配符之后

<url-pattern>/HelloWorld/*</url-pattern>
你可以通过使用HttpServletRequest.getPathInfo()方法获取与URL相关的额外路径。

例如:

http://localhost:<port>/MyApp/HelloWorld/one/

结果将是:

/one/

从JavaDoc中得知:

返回客户端发送请求时与URL相关的任何额外路径信息。额外的路径信息紧跟在servlet路径后面,但位于查询字符串之前,并以“/”字符开头。


8

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

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

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

一个想法 - 这将重定向任何符合该 URL 模式的内容到 servlet。 如果您想在此 URL 之后拥有其他 URL,则应创建一个 servlet,该 servlet 将通过查看指定的 URL 重定向到正确的 URL。 或者,您可以使用提供映射的框架。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接