4

在 p:ajax 调用中,侦听器调用包含

     FacesContext.getCurrentInstance().getExternalContext().dispatch("/uri.jsf");  

不起作用。我在行上设置了一个断点,它在执行时保持在同一点。它不会继续前进,我必须重新启动服务器才能再次运行应用程序。

    FacesContext.getCurrentInstance().getExternalContext().redirect("/uri.jsf");

重定向工作得很好。但我想要分派的页面转发以导航到另一个页面。

4

1 回答 1

5

ExternalContext#dispatch()不支持ajax请求。它会导致 JSF 呈现 JavaScript ajax 引擎无法理解的给定资源的 HTML 输出。ajax 请求必须返回一个特殊的 XML 响应,该响应可以被 JavaScript ajax 引擎理解。

ExternalContext#redirect()支持ajax请求。它将自动返回一个特殊的 XML 响应,指示 JavaScript ajax 引擎调用给定 URL 的调用(您可以在此答案window.location中找到 XML 示例)。

您有 2 个选项:

  1. 使其成为非 ajax 请求。
  2. 执行正常的 JSF 导航。

发出非 ajax 请求很可能不是<p:ajax>. 在这种情况下,执行正常导航确实是您唯一的选择。

FacesContext context = FacesContext.getCurrentInstance();
context.getApplication().getNavigationHandler().handleNavigation(context, null, "/uri.jsf");

如果出现 ajax 请求,它将自动强制render="@all"使用新内容。

于 2013-01-04T20:11:11.033 回答