8

我们打开了客户端状态保存并使用 ViewScoped 支持 bean。当打开客户端状态保存并且我们使用 ViewScoped bean 时,ViewScoped bean 是序列化到页面还是说存储在会话中,带有序列化到页面的令牌/密钥(以便页面可以调用如果页面回发到自身,则来自会话的 bean)

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

4

2 回答 2

9

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

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


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

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

但是,如果您正在处理大数据,那么 HTTP 会话存储大小可能会成为一个问题。另请参阅JSF 2.2 内存消耗:为什么 Mojarra 将最后 25 个视图的 ViewScoped Beans 保留在内存中?理想情况下,视图范围的 bean 应该在它所引用的页面被 GET 导航或浏览器选项卡关闭后立即销毁。默认的 JSF 视图范围 bean 不这样做。它仅在回发到不同视图或会话到期时被销毁。

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

于 2012-05-08T23:54:53.773 回答
3

请注意,BalusC 的回答不适用于 JSF 的最新版本:对于最新版本,javax.faces.view.ViewScopedbean 的数据保存在服务器上。请参阅JAVASERVERFACES-3090

于 2015-12-16T20:46:14.410 回答