3

我正在使用OmniFacesFullAjaxExceptionHandler和 PrimeFaces。我在下面添加了一个命令按钮errorPage.xhtml

<h:form>
    <p:commandButton id="logoutButtonId" value="Redirect" actionListener="#{userMB.logout()}">
</h:form>

错误页面正确显示,但按钮不触发方法 #{userMB.logout()}。这就是我所理解的设置中发生的情况:

  1. 如果发生错误,FullAjaxExceptionHandler很好地显示errorPage.xhtml.
  2. 如果我点击我添加的按钮,页面会使用相同的数据进行更新,就像发生刷新一样。
  3. 如果我再次单击该按钮,则会触发托管 bean 方法。

只有在第二次单击时才会调用 bean 方法。似乎在第一次加载时,bean 方法没有绑定到对象。

如何实现在错误页面中添加命令按钮,并且在使用时将 action/actionlistener 正确绑定到 HTML 组件FullAjaxExceptionHandler

4

2 回答 2

2

此问题有两个可能的原因:

  1. 如果您使用的是 Internet Explorer,则可以识别为 PrimeFaces@all无法在基于 IE 的浏览器中初始化必要的 ajax javascript。这在这里得到了回答:Object doesn't support this property or method with primefaces omnifaces timeout combination

  2. 如果您正在使用另一个浏览器并且您正在使用 JSF 标准<f:ajax>来触发 ajax 操作,那么这可以识别为 JSF 自己jsf.js未能在@all. 这在这里得到了回答:错误页面上的错误报告表

请注意,这些脚本需要放置在调用 ajax 操作的页面上,而不是错误页面本身。

于 2013-01-11T13:54:15.917 回答
2

这对我有用,结合了 BalusC 在下面的回答中提到的方法。它适用于 IE 和 Firefox。在某些情况下可能需要进行一些调整,但由于我得到的错误页面只有一个表单,所以我没有费心循环表单。

var originalPrimeFacesAjaxResponseFunction = PrimeFaces.ajax.AjaxResponse;
PrimeFaces.ajax.AjaxResponse = function(responseXML) {
    var newViewRoot = $(responseXML.documentElement).find("update[id='javax.faces.ViewRoot']").text();

    if (newViewRoot) {
        var viewState = $(responseXML.documentElement).find("update[id='javax.faces.ViewState']").text();

        $('head').html(newViewRoot.substring(newViewRoot.indexOf("<head>") + 6, newViewRoot.indexOf("</head>")));
        $('body').html(newViewRoot.substring(newViewRoot.indexOf("<body>") + 6, newViewRoot.indexOf("</body>")));
        if (!$('input').attr("javax.faces.ViewState")){
            var hidden = document.createElement("input");
            hidden.setAttribute("type", "hidden");
            hidden.setAttribute("name", "javax.faces.ViewState");
            hidden.setAttribute("value", viewState);
            hidden.setAttribute("autocomplete", "off");
            $('form').append(hidden);
        }
    } else {
        originalPrimeFacesAjaxResponseFunction.apply(this, arguments);
    }
};
于 2013-01-13T05:58:46.487 回答