2012-10-24 34 views
2

我正在使用Primefaces 3.4.1,Jboss AS 7.1和M​​yFaces CODI编写应用程序。我得到的问题是我正在使用CODI提供的对话范围,并且一旦对话结束,我需要一种处理浏览器后退按钮的方法。在jsf 2.0中重定向浏览器后退按钮

更多precisely-在对话结束,并且用户在不同的页面(想想就像一个向导,整理并作出承诺数据库),如果后退按钮被按下我收到以下异常:

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现在它会触发什么?这是否使捕捉它的工作更容易?

+1

我不确定CODI会起什么作用,但我可以告诉你后退按钮不会触发JSF导航过程 – kolossus

+0

因此,JSF导航过程不是那么顺利。任何其他想法? – bjedrzejewski

回答

3

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

做的第一件事是确保你没有缓存的页面。你可以这样做与过滤这里解释:

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

之后,你会知道的页面将被呈现,所以你需要渲染,如果您的通话豆正确实例之前,做一次检查。这里是如何做到这样的检查解释说:

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

我们正在使用@ConversationRequired。

+0

这是CODI符号吗?另外,它是否允许你重定向?这听起来很像我需要的东西。 – bjedrzejewski

+0

我在CODI文档中找不到太多内容 - 您能否提供更多关于它的信息? – bjedrzejewski

+0

默认情况下,它不会执行重定向,但我们只是将它整合在一起。我猜是因为你会在对话框中看到向导的问题(所以它会以入口点的视图取代View-Root)。您只需要阅读ConversationRequiredUtils.ensureExistingConversation中的一些源代码即可。对不起,我不允许分享我们如何使用它。 –