我正在使用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它现在会触发什么?这是否使得抓住它更容易?
答案 0 :(得分:4)
我终于设法解决了这个问题,这可能对其他人有所帮助:
要做的第一件事是确保您没有缓存页面。您可以使用此处说明的过滤器执行此操作:
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优雅地处理后退按钮。
答案 1 :(得分:1)
我们正在使用@ConversationRequired。
答案 2 :(得分:-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>