【问题标题】:Cannot forward to JSF page using URL with context path无法使用带有上下文路径的 URL 转发到 JSF 页面
【发布时间】:2013-07-22 02:22:49
【问题描述】:

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

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

我在pages 下有一个proc.xhtml

如果我设置:

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

【问题讨论】:

  • 你试过redirectURI=/pages/proc.jsf你得到的输出是什么?
  • @VikasV 我设置了redirectURI=/pages/proc.xhtml 并且它有效...不知道为什么在开头添加上下文路径不起作用,因为这样更直观并且符合 URL 规则...
  • 也许您应该编辑您的问题并将/ 放入redirectURI = "pages/proc.xhtml"。它令人困惑。
  • @VikasV pages/proc.xhtml/pages/proc.xhtml 都有效。当我使用 /context/pages/proc.xhtml 时它不起作用。

标签: jsf servlets


【解决方案1】:

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

redirectURI = "/pages/proc.xhtml";

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

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

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

另见:

【讨论】:

    猜你喜欢
    • 2021-02-23
    • 2014-02-13
    • 2014-02-19
    • 2021-12-25
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    相关资源
    最近更新 更多