gpt4 book ai didi

jsf-2 - JSF 2.1 ViewScopedBean @PreDestroy 方法未调用

转载 作者:行者123 更新时间:2023-12-02 04:11:31 27 4
gpt4 key购买 nike

我在 View Scoped Bean 中有一个方法,其 @PreDestroy注释和另一个带有 @PostConstruct 的注释注释。

@PostConstruct每次我导航到使用此 View 作用域 bean 的页面时,都会正确调用该方法。

但是,当我通过<h:link/>导航到新页面(不使用此 View 范围bean)时,@PreDestroy方法永远不会被调用。

我不是在谈论changing manually the url or the end of the session ,只是一个导航案例。

我缺少什么?

提前致谢

最佳答案

这是设计使然。只有当 POST 操作导致导航不是回发到同一 View 时,它才会立即被销毁(即操作方法没有返回 nullvoid ,而是完整的 String ,即使当只是空的)。

<h:link>生成不调用任何 POST 操作的 GET 链接。由于在卸载 View 时不可能通过 (XML)HTTP 请求可靠地通知服务器端,因此无法通知 JSF 销毁与 View 关联的 View 作用域 bean。在这种情况下,只有当 session 过期或超过 session 中的最大逻辑 View (默认为 15)并且关联 View 是顺序中的第一个 View 时, View 作用域 bean 才会被销毁。

如果您确实想通过 navigaiton 操作销毁 View 作用域 bean,那么最好的选择是通过 <h:commandLink> 将其设为 POST 请求。相反,并通过返回导航结果来发出重定向 ?faces-redirect=true范围。但这毕竟不利于 SEO,因为机器人不会索引 POST 链接。

我毕竟不关心 session 中仍然存在的 View 。如果您打算进行一些清理或记录,我会根据具体的功能需求寻找替代方法。

理论上,HTML DOM 是可能的 onbeforeunload事件,但这是一个非标准事件,并且浏览器行为未指定在该事件期间发送 ajax 请求时会发生什么。它有时会到达,但有时也不会。

更新:在实践中,这已在OmniFaces @ViewScoped 中实现自 OmniFaces 2.2 起。最初在 synchronous XHR 的帮助下自 OmniFaces 2.6 起,在 beacon 的帮助下。它在主要浏览器中运行良好。从 OmniFaces 2.3 开始,它甚至立即销毁关联的 JSF 服务器端 View 状态,从 OmniFaces 2.6 开始,它甚至立即销毁物理 bean,从而进一步减少不必要的内存使用。另请参阅 JSF: Mojarra vs. OmniFaces @ViewScoped: @PreDestroy called but bean can't be garbage collected

关于jsf-2 - JSF 2.1 ViewScopedBean @PreDestroy 方法未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6726411/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com