3

我试图将请求转发到 JSF 页面:

request.getRequestDispatcher(redirectURI).forward(request, response);

我有一个proc.xhtmlpages

如果我设置:

redirectURI = "pages/proc.xhtml";

它工作正常。

但是,如果我使用包含上下文路径的绝对 URL:

redirectURI = "/context/pages/proc.xhtml";

它不起作用,并给了我这个例外:

com.sun.faces.context.FacesFileNotFoundException: /context/pages/proc.xhtml Not Found in ExternalContext as a Resource.

(是的,我已经将 Faces servlet URL 模式设置为*.xhtml

4

1 回答 1

6

采用RequestDispatcher#forward()相对于上下文根的路径。所以,基本上你正在尝试转发/context/context/pages/proc.xhtml显然不存在的内容。如果您/pages/proc.xhtml想让它绝对相对于上下文根而不是当前请求 URI,则需要。

redirectURI = "/pages/proc.xhtml";

或者,正如在这种情况下奇怪的变量名称redirectURI所表明的那样,如果您实际上打算触发真正的重定向(并因此反映浏览器地址栏中的 URL 更改),那么您应该HttpServletResponse#sendRedirect()改用它确实采用相对于当前的路径请求 URI(因此,当您想要以 开头时,您应该包含上下文路径/)。

redirectURI = request.getContextPath() + "/pages/proc.xhtml";
response.sendRedirect(redirectURI);

否则最好将该变量重命名为forwardURI左右。

也可以看看:

于 2013-07-23T11:13:44.833 回答