打开客户端状态保存时,ViewScoped bean是否已序列化到页面?

时间:2012-05-08 18:51:41

标签: serialization jsf-2 view-scope

我们已启用客户端状态保存并使用ViewScoped支持bean。当打开客户端状态保存并且我们正在使用ViewScoped bean时,ViewScoped bean是否序列化到页面或是否说,存储在会话中,其中包含序列化到页面的令牌/密钥(以便页面可以调用如果页面被发布回自身会话中的bean

这里的一个问题可能是,如果它是序列化的,那么我们可能会担心不会在ViewScoped bean上存储大型实例变量,因为它被序列化到页面并在线路上来回传递。

2 个答案:

答案 0 :(得分:9)

  

当打开客户端状态保存并且我们正在使用ViewScoped bean时,ViewScoped bean是否序列化到页面或是否说,存储在会话中,并带有序列化到页面的令牌/密钥?< / em>的

Mojarra 2.x在HTTP会话中存储视图范围的bean。有一个未记录的设置,在会话中默认最多有25个视图范围的bean。另见issue 4015。换句话说,物理视图范围的bean实例永远不会存储在JSF视图状态中。它们仅由UUID引用,而UUID又存储在JSF视图状态中。因此,无论客户端/服务器状态保存方法如何,它们都不会在JSF视图状态中序列化。


  

这里的一个问题可能是,如果它是序列化的,那么我们可能会担心不会在ViewScoped bean上存储大型实例变量,因为它被序列化到页面并在线路上来回传输

这是一个有效的问题。即使这是真的,我们也在讨论相当极端的情况。在视图状态大小上,每100个平均属性的100个平均实体的集合应该已经不超过额外的~5KB。请注意,您可以通过在Web服务器上启用gzip压缩来获得大量带宽,甚至可以为每个基于文本的资源高达70%。

如果您正在处理大数据,那么HTTP会话存储大小可能反过来成为一个问题。另请参阅JSF 2.2 Memory Consumption: Why does Mojarra keep the ViewScoped Beans of the last 25 Views in Memory?理想情况下,只要通过GET导航或浏览器选项卡关闭卸载它引用的页面,就应该销毁视图范围bean。默认的JSF视图作用域bean不会这样做。它仅在回发到不同视图或会话到期时被销毁。

如果您碰巧使用JSF实用程序库OmniFaces,则从版本2.2开始,@org.omnifaces.cdi.ViewScoped支持在卸载期间销毁。这应该会对HTTP会话存储大小产生积极影响。

答案 1 :(得分:3)

请注意,对于最新版本的JSF,BalusC的答案并非如此:对于最新版本,javax.faces.view.ViewScoped bean的数据保留在服务器上。见JAVASERVERFACES-3090