PARTIAL_STATE_SAVING应该设置为false吗?

看来,今天(2012年4月),MyFaces和Mojarra的JSF 2.1实现都有部分状态保存的缺陷,PARTIAL_STATE_SAVING应该设置为false。

这是真的?

PARTIAL_STATE_SAVING应该设置为false吗?

只有当你遇到一个与你的webapp中的部分状态保存有关的一般性缺陷时,这个缺陷实际上是不能解决/以另一种方式解决的。 局部状态保存对于整体性能和内存使用来说具有主要的优势。 另请参见为什么JSF在服务器上保存UI组件的状态?

我不能100%可靠地为MyFaces说话,但是在Mojarra,当绑定标签处理程序的任何属性(标签处理程序可以被缺lessrendered属性标记,例如JSTL标记)添加到视图范围的bean,或者当您将JSF组件的idbinding属性binding到视图范围的bean(这些属性在构build/恢复视图期间被parsing)。

此问题是由JSF问题1492和JSF规范问题787中描述的鸡蛋问题导致的:启用了部分状态保存后,视图范围的bean被存储在分部视图状态中。 所以要提取视图范围的bean,部分视图状态必须被恢复。 在恢复(构build)视图期间,将评估所有上述属性中的EL。 但是,由于目前没有可用的bean范例,因此将创build一个全新的实例。 然而,这将其所有的属性设置为默认! 恢复视图并获取原始视图作用域bean后,它们将被放回视图范围,覆盖恢复视图期间创build的(临时)实例。 但是这些属性的ELexpression式已经根据完全不同的实例进行了评估,无法恢复。

这个鸡蛋问题是从Mojarra 2.1.18和2.2.0通过在会话中存储视图范围的bean来解决的。 如果由于某种原因无法升级,那么确实可以通过将javax.faces.PARTIAL_STATE_SAVING设置为false来禁用部分状态保存来解决。 另一种方法就是把前面提到的属性绑定到视图范围的bean上,而是寻找一个替代的解决scheme。

您也可以设置javax.faces.FULL_STATE_SAVING_VIEW_IDS 。 这使您可以指定一个逗号分隔的所有视图ID列表,需要closures部分状态保存:

 <context-param> <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name> <param-value>/some.xhtml,/other.xhtml</param-value> </context-param> 

这可以让你尽可能地从部分状态保存中受益,并且只closures部分状态保存相关问题可以不被修复的一部分视图。

也可以看看:

  • JSF 2.0中的通信 – @ViewScoped在标记处理程序中失败