我正在使用 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/