不调用JSF 2.1 ViewScopedBean @PreDestroy方法

Vic*_*Vic 10 myfaces jsf-2 tomcat7

我在视图Scoped Bean中有一个方法,带有@PreDestroy注释,另一个带有@PostConstruct注释.

@PostConstruct每次导航到使用此视图范围bean的页面时,都会正确调用该方法.

但是,当我导航到新页面(不使用此视图范围bean)时<h:link/>,@PreDestroy永远不会调用该方法.

我不是在谈论手动更改网址或会话结束,仅仅是导航案例.

我错过了什么?

提前致谢

Bal*_*usC 18

这是设计的.当POST动作导致导航不是对同一视图的回发时(即动作方法没有返回,null或者void是一个值得一提的String,即使只是空的),它也只会立即被破坏.

<h:link>产生不调用任何POST动作的GET链接.由于在卸载视图时无法通过(XML)HTTP请求通知服务器端,因此无法通知JSF销毁与视图关联的视图范围bean.在这种情况下,视图范围bean将仅在会话到期时或会话中的最大逻辑视图超出(默认值为15)且相关视图按顺序排列时销毁.

如果你真的想通过一个navigaiton动作来驱逐视图范围的bean,那么最好的办法就是把它作为POST请求,<h:commandLink>然后通过返回导航结果和?faces-redirect=true参数来发出重定向.但这毕竟不是SEO友好,因为机器人不会索引POST链接.

我毕竟不关心仍然在会议中的观点.如果您打算进行一些清理或记录,我会寻找其他方法,具体取决于具体的功能要求.

理论上讲,HTML DOM onbeforeunload事件是可能的,但这是一个非标准事件,并且未指定浏览器行为,以便在该事件期间发送ajax请求时会发生什么.它有时会到来,但有时也不会.更新:实际上,OmniFaces@ViewScoped自OmniFaces 2.2在同步XHR的帮助下实现了这一功能,并且它在主流浏览器中运行良好.从版本2.3开始,它甚至在物理上破坏了相关的JSF服务器端视图状态.