Servlet不执行response.sendRedirect(addressPath); ,但确实执行没有路径的response.sendRedirect()

时间:2014-04-08 23:16:49

标签: java jsp tomcat servlets web-applications

考虑以下层次结构:

enter image description here

当我发送像这样的重定向时:

    response.sendRedirect("error404.jsp");    // no path here !!!

我到达了error404.jsp页面。

但是当我使用路径时:

    String addressPath = "/WEB-INF/results/admin/adminPage.jsp";
    response.sendRedirect(addressPath);   // with path !!!

我得到404:

HTTP Status 404 -

type Status report

message

description The requested resource is not available.

Apache Tomcat/7.0.50

我在这里做错了什么?

非常感谢!

2 个答案:

答案 0 :(得分:2)

请参阅javadoc

  

此方法可以接受相对URL; servlet容器必须   在发送之前将相对URL转换为绝对URL   回应客户。 如果位置相对而没有前导   ' /'容器将其解释为相对于当前请求   URI。如果该位置是相对于领先的' /'容器   将其解释为相对于servlet容器根目录。如果是   位置是相对于两个领先的' /'容器解释它   作为网络路径引用(请参阅RFC 3986:统一资源标识符   (URI):通用语法,第4.2节和第34节;相对参考")。

请注意,参数不是像RequestDispatcher那样使用的servlet上下文中的路径,而是作为302响应的Location标头中使用的URL。

所以这个

String addressPath = "/WEB-INF/results/admin/adminPage.jsp";
response.sendRedirect(addressPath);   // with path !!!
将使用标题

转换为302响应

Location: http://whateverhost.com/WEB-INF/results/admin/adminPage.jsp

你没有处理程序,所以404。

另一方面,这个

response.sendRedirect("error404.jsp");    // no path here !!!

变为

Location: http://whateverhost.com/context-path/error404.jsp

由于error404.jspWEB-INF之外,因此它是可访问的,因此由JSP servlet呈现并作为响应返回。

答案 1 :(得分:2)

因为客户端无法访问WEB-INF下的内容。如果您希望它们可以访问,请不要将您的JSP放在WEB-INF下。

或者,要使客户端可以访问WEB-INF下的任何内容,您必须将其映射到web.xml中的URL:

  <servlet>
    <servlet-name>adminPage</servlet-name> 
    <jsp-file>/WEB-INF/results/admin/adminPage.jsp</jsp-file>
  </servlet>
  <servlet-mapping>
    <servlet-name>adminPage</servlet-name>
    <url-pattern>/adminPage/*</url-pattern>
</servlet-mapping> 

然后使用您映射的url-pattern:

response.sendRedirect("./adminPage/");

这是毫无意义的。您可以使用WEB-INF之外的JSP并使用URL重写过滤器来实现基本相同的功能。简而言之,您可能没有理由将JSP放在WEB-INF下。