在JSF 2.0中重定向浏览器后退按钮



我正在使用PrimeFaces 3.4.1,Jboss AS 7.1和MyFaces Codi编写一个应用程序。我遇到的问题是我正在使用Codi提供的对话范围,并且我需要一种处理对话结束后处理浏览器返回按钮的方法。

更准确地说 - 当对话结束并且用户在另一个页面上(将其像向导完成并对数据库提交),如果按下了返回按钮,我会收到以下例外:

javax.ejb.EJBTransactionRolledbackException

理想情况下,由于对话结束,我希望将其重定向回到其他页面(菜单,仪表板)。

可以使用JSF 2.0导航规则来完成?

编辑:

我创建了这样的导航规则:

<navigation-rule>
    <from-view-id>/page1.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>outcome1</from-outcome>
            <to-view-id>/page2.xhtml</to-view-id>
            <redirect/>
        </navigation-case>
        <navigation-case>
            <from-outcome>*</from-outcome>
            <to-view-id>/dashboard.xhtml</to-view-id>
            <redirect/>
        </navigation-case>
</navigation-rule>

希望如果我们按下返回按钮,这将使重定向dashboard.xhtml。我以为当您按下后端会发射另一种动作。显然,我假设是错误的。是否可以使用这些案例来捕获BAKC按钮发送的任何内容?可能带有标签?

更新1:

显然,浏览器的后退按钮不会触发JSF导航案例。清楚它会触发什么吗?我实现了以下过滤器:https://stackoverflow.com/a/10305799/1611957现在它会触发什么?这是否使捕获更轻松的工作?

我终于设法解决了问题,这可能对他人有帮助:

要做的第一件事是确保您不是缓存页面。您可以使用此处解释的过滤器来完成:

https://stackoverflow.com/a/10305799/1611957

之后,您将知道该页面将要渲染,因此,如果正确实例化了对话bean,则需要在渲染之前进行检查。在此处解释了如何进行此类支票:

https://stackoverflow.com/a/7294707/1611957

我使用的代码类似于Balusc在此问题中发布的代码:

<f:metadata>
    <f:event type="preRenderView" listener="#{authenticator.check}" />
</f:metadata>

使用Java代码:

public void check() {
    if (someCondition) {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        NavigationHandler navigationHandler =
            facesContext.getApplication().getNavigationHandler();
        navigationHandler.handleNavigation(facesContext, null, "outcome");
    }
}

您将为"结果"派遣JSF导航规则

<navigation-rule>
    <from-view-id>*</from-view-id>
    <navigation-case>
        <from-outcome>outcome</from-outcome>
        <to-view-id>/defaultPage.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

这就是您可以使用JSF2优雅地处理后按钮的方式。

我们正在使用@ConversationRequired。

This worked for me.
You can add the below code in between your <head> </head> tag
<script>
    window.location.hash = "no-back-button";
    window.location.hash = "Again-No-back-button";//again because google chrome don't insert first hash into history
    window.onhashchange = function() {
        window.location.hash = "no-back-button";
    }
</script>

相关内容

  • 没有找到相关文章

最新更新