[英]Servlet doesn't execute response.sendRedirect(addressPath); , but does execute response.sendRedirect() without path
考虑以下层次结构:
当我这样发送重定向时:
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
我在这里做错了什么?
非常感激 !
此方法可以接受相对URL; Servlet容器必须在将响应发送到客户端之前将相对URL转换为绝对URL。 如果位置是相对的而没有前导“ /”,则容器会将其解释为相对于当前请求URI的相对位置。 如果位置与前导“ /”相对,则容器将其解释为相对于servlet容器根。 如果位置与两个前导“ /”相对,则容器将其解释为网络路径引用(请参阅RFC 3986:统一资源标识符(URI):通用语法,第4.2节“相对引用”)。
请注意,该参数不是Servlet上下文中的路径(如RequestDispatcher
所用),它是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.jsp
在WEB-INF
外部,因此它是可访问的,因此由JSP servlet呈现并作为响应返回。
因为客户端无法访问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模式:
response.sendRedirect("./adminPage/");
这是毫无意义的。 使用WEB-INF之外的JSP并使用URL重写过滤器,您可以实现基本相同的操作。 简而言之,您可能没有真正的理由将JSP置于WEB-INF下。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.