【问题标题】:Redirecting browser back button in jsf 2.0在 jsf 2.0 中重定向浏览器后退按钮
【发布时间】:2012-10-14 19:29:04
【问题描述】:

我正在使用 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 现在会触发什么?这会让捕捉它的工作变得更容易吗?

【问题讨论】:

  • 我不确定什么对 CODI 有用,但我可以告诉你后退按钮将不会触发 JSF 导航过程
  • 所以 JSF Navigation 过程不是那么要走的路。还有其他想法吗?

标签: jsf jakarta-ee jsf-2 primefaces navigation


【解决方案1】:
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>

【讨论】:

  • 这根本没有回答问题。您是否阅读了标题之外的问题?它清楚地表明“理想情况下,由于对话已经结束我希望将其重定向回其他页面(菜单,仪表板)。”。但是您的回答基本上完全杀死了后退按钮的默认行为,并且不会重定向回“其他页面”。
【解决方案2】:

我们正在使用@ConversationRequired。

【讨论】:

  • 这是 CODI 符号吗?另外,它是否允许您重定向?这听起来正是我需要的东西。
  • 我在 CODI 文档中找不到太多关于它的信息 - 你能给我更多关于它的信息吗?
  • 默认情况下它不做重定向,但我们只是以这种方式集成它。我猜是因为您会在对话框中遇到向导问题(因此它将 View-Root 替换为入口点的视图)。您只需要阅读 ConversationRequiredUtils.ensureExistingConversation 中的一点源代码。很抱歉,我无法分享我们如何使用它。
  • 如果你能解释一下你的使用方法会更好。
【解决方案3】:

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

首先要做的是确保您没有缓存页面。您可以使用此处说明的过滤器来做到这一点:

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 优雅地处理后退按钮的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 2013-03-02
    • 2013-11-10
    • 2012-01-01
    • 1970-01-01
    • 2020-09-12
    • 2014-04-09
    相关资源
    最近更新 更多