在RequestDispatcher的前向URL中使用哈希符号

时间:2010-07-19 01:37:35

标签: java jsp tomcat servlets

我正在尝试将请求转发到另一个包含哈希符号('#')的网址:

request.getRequestDispatcher("/some/path.jsp#somehash").forward(request, response);
但是,Tomcat告诉我“请求的资源不可用”。如果我从URL中删除哈希,一切正常。哈希是不允许的,还是我没有正确处理它们?

2 个答案:

答案 0 :(得分:7)

#符号是浏览器的东西,而不是服务器的东西。当您在浏览器中键入带有#的URL时,浏览器不会将该部分发送到服务器。它在没有它的情况下发送URL,然后在它返回页面时跳转到命名锚点。

当您要求容器为您获取该URL时,它不会将#与任何其他URL区别对待 - 它没有特殊含义,因此它会查找名为{的JSP页面{1}},当然不存在。

你需要以某种方式在客户端保持跳转到锚点的逻辑。也许您可以在结果页面上放置一些javascript以滚动到文档中的那一点。

答案 1 :(得分:4)

URL片段纯粹是客户端。 RequestDispatcher#forward()完全是服务器端的。 转发给定URL中的内容不会发送到客户端。但是,您可以使用HttpServletResponse#sendRedirect() 重定向到指定的网址。然后,URL片段将被发送到客户端,并反映在浏览器地址栏中。然而,重定向请求的缺点是当前请求将被填充并且将创建一个全新的请求。如果那是不可承受的,那么你确实必须在JavaScript角落寻找解决方案。