【问题标题】:Is there a way to call a method upon leaving a page with JSF or PrimeFaces?有没有办法在使用 JSF 或 PrimeFaces 离开页面时调用方法?
【发布时间】:2012-04-16 13:18:38
【问题描述】:

有没有办法在使用 JSF 离开页面时调用方法?

【问题讨论】:

  • 顺便提一下,JSF 2.2 JSR 中提到了这一点:“事件系统增强。例如,为页面导航事件安装侦听器的能力。这将启用熟悉的对话框,“你此页面中有未保存的更改,您确定要放弃它们吗?”
  • 可能规范打算在此处使用服务器端导航,但这会受到限制,因为用户需要使用回发来导航到新页面。

标签: jsf primefaces managed-bean window.onunload


【解决方案1】:

在使用原生 JSF 或 PrimeFaces 时不会。您最好的选择是挂钩会话到期。

import javax.inject.Named;
import javax.enterprise.context.SessionScoped;

@Named
@SessionScoped
public class Bean implements Serializable {

    @PreDestroy
    public void destroy() {
        // Your code here.
    }
}

如果您碰巧使用了 JSF 实用程序库OmniFaces,那么您可以使用它的@ViewScoped。这将在离开引用视图范围 bean 的页面时调用 @PreDestroy

import javax.inject.Named;
import org.omnifaces.cdi.ViewScoped;

@Named
@ViewScoped
public class Bean implements Serializable {

    @PreDestroy
    public void destroy() {
        // Your code here.
    }
}

Under the covers,它通过在窗口 beforeunload 事件期间触发 navigator.sendBeacon() 来工作,并回退到同步 XHR(在 modern browsers supporting navigator.sendBeacon() 中已弃用)。

另见:

【讨论】:

    【解决方案2】:

    您可以在关闭页面或导航到另一个页面时调用 JSF 托管 bean 方法,方法是使用 <a4j:jsFunction/> 并在 'onunload' 事件中调用它页面正文如下。

    <body onunload="leavingPage()">
    
    <a4j:jsFunction name="leavingPage" action="#{myBean.myMethod}"/>
    

    【讨论】:

    • 你自己试过吗?它行不通。至少,不是在普通的网络浏览器中。
    • 我不知道什么是“普通的网络浏览器”。但在我把它放在这里之前,我已经尝试过了。现在我又在 Chrome、FF 和 IE 中尝试了它。你在评论之前试过这个吗?
    • 那么,每当 ajax 请求从浏览器关闭事件中获胜时,您就有幸处于竞争状态。然而,这保证每次都成功。当然不是在生产环境中,服务器通常在物理上不同的机器上运行,因此网络延迟更高。
    【解决方案3】:

    您的问题解决方案:- 它适用于 java 脚本

        <head>
    <title>onunload test</title>
    <script type="text/javascript">
    window.onunload = unloadPage;
    
    function unloadPage()
    {
     alert("unload event detected!");
    }
    </script>
    </head>
    

    还有一些链接了解更多详细信息:- Link

    【讨论】:

    • OP 想要调用一个 JSF 支持 bean 方法,而不是显示一个简单的警报。
    • 也许您可以通过编程单击卸载事件中的隐藏命令按钮来调用支持 bean 中的方法
    • @BalusC 我没看到OP写过他想调用baking bean方法,他只想调用方法,或者不能写...
    【解决方案4】:

    如果您在支持 bean 中使用omnifaces @ViewScoped 注解,则当您离开视图时,bean 对象将被销毁;因此,当发生这种情况时,您可以使用其中的 @PreDestroy 注释调用函数。

    注意:必须使用omnifaces @ViewScoped 注解;使用标准的 JSF @ViewScoped 注释,对象不会因为离开而被破坏 视图,所以要注意导入!

    来源: http://showcase.omnifaces.org/cdi/ViewScoped

    【讨论】:

      猜你喜欢
      • 2011-10-01
      • 1970-01-01
      • 2019-05-23
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多