jsf - jsf 2.0 中重定向浏览器后退按钮

标签 jsf jakarta-ee jsf-2 primefaces navigation

我正在使用 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。我假设当你按下它时,后端会触发一个不同的 Action 。显然我的假设是错误的。有什么方法可以使用这些案例捕获 bakc 按钮发送的任何内容吗?可能带有标签?

更新1:

显然浏览器的后退按钮不会触发 JSF 导航情况。清楚它会触发什么吗?我实现了以下过滤器:https://stackoverflow.com/a/10305799/1611957现在会触发什么?这会让捕捉它的工作变得更容易吗?

最佳答案

我终于成功解决了这个问题,它可能对其他人有帮助:

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

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

之后您将知道页面将被渲染,因此您需要在渲染之前检查 session 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 优雅地处理后退按钮。

关于jsf - jsf 2.0 中重定向浏览器后退按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13054615/

相关文章:

jsf - 如何在 PrimeFaces DataTable 中设置自增列?

java - 在 JSF 中调用 JAX-WS

java - JSF 2 : tag wrapper to encapsulate common attribute values?

java - 在 JSF 中使用实体

validation - 如何让验证取决于按下的按钮?

jsf - 如何在应用程序中使用新的@ClientWindowScoped注释?

java - <p :dialog closeable ="false"> still get closed on pressing Esc

java - 是否需要文件 persistence.xml?

oracle - 需要使用legacy PLSQL with DBLink call,在XA事务中,不能使用共享连接

java - 如何启动jboss 7.1.1服务器并在jboss 7.1.1中部署项目