- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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 时,它才会立即被销毁(即操作方法没有返回 null
或 void
,而是完整的 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/
为了缩小我们的问题,我们正在从 Jboss 6 EAP (JSF 2.1) 升级到 Jboss 7 EAP (JSF 2.2)。我们的工作应用程序现在存在 OmniFaces ViewScoped b
我在 View Scoped Bean 中有一个方法,其 @PreDestroy注释和另一个带有 @PostConstruct 的注释注释。 @PostConstruct每次我导航到使用此 View
我是一名优秀的程序员,十分优秀!