有没有一种方法在离开页面时使用JSF或PrimeFaces调用一个方法?

10

在JSF中有没有一种方法可以在离开页面时调用一个方法?


顺便提一下,这在JSF 2.2 JSR中有所提及:“事件系统增强。例如,能够安装页面导航事件的监听器。这将使得熟悉的对话框变得可用,“您在此页面上有未保存的更改,确定要放弃它们吗?” - Arjan Tijms
可能规范意图在此处使用服务器端导航,但这将是有限制的,因为用户需要使用 postbacks 来导航到新页面。 - Arjan Tijms
4个回答

7

如果使用原生的JSF或PrimeFaces,则不能这样做。您最好的选择是在会话过期时进行挂钩。

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

@Named
@SessionScoped
public class Bean implements Serializable {

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

如果您刚好使用JSF实用程序库OmniFaces,那么您可以使用它的@ViewScoped。这将在离开引用视图范围bean的页面时调用@PreDestroy
import jakarta.inject.Named;
import org.omnifaces.cdi.ViewScoped;

@Named
@ViewScoped
public class Bean implements Serializable {

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

底层实现是通过在窗口beforeunloadpagehide事件期间触发navigator.sendBeacon(),并回退到同步XHR(在支持navigator.sendBeacon()现代浏览器中已弃用)。

另请参阅:


3
如果您在后端使用omnifaces的@ViewScoped注释,则当您离开视图时,bean对象将被销毁;因此,您可以在其中使用@PreDestroy注释来调用函数。

注意:您必须使用omnifaces的@ViewScoped注释;使用标准JSF的@ViewScoped注释时,仅通过离开视图无法销毁对象,因此要注意导入!

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


2

你的问题解决方案:它需要使用 JavaScript 来运行。

    <head>
<title>onunload test</title>
<script type="text/javascript">
window.onunload = unloadPage;

function unloadPage()
{
 alert("unload event detected!");
}
</script>
</head>

还有一些更多详细信息的链接: 链接


2
OP想要调用JSF后端bean方法,而不是显示简单的警报。 - BalusC
3
在卸载事件中,您可以通过编程方式单击隐藏的commandButton,以调用后端bean中的方法。 - damian
@BalusC 我没有看到 OP 写他想调用 baking bean 方法,他只是想调用方法,或者不能写... - Web Devie

0

当你关闭页面或导航到另一个页面时,可以使用<a4j:jsFunction/>并在页面主体的'onunload'事件中调用它来调用JSF托管bean方法,如下所示。

<body onunload="leavingPage()">

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

1
你自己试过吗?它不会起作用。至少,在普通的网络浏览器中不会。 - BalusC
1
我不知道什么是“正常的网络浏览器”。但在我发布之前,我已经尝试过了。 现在我又在Chrome、FF和IE中尝试了一遍。在你评论之前,你有没有尝试过呢? - prageeth
6
你曾经有过幸运的经历,每次在浏览器关闭事件中,ajax请求都赢了竞争条件。然而这并不保证每次都成功。特别是在生产环境中,服务器通常在物理上与客户端不同,因此网络延迟更高。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接