PARTIAL_STATE_SAVING应该设置为false吗?

Bes*_*ces 8 myfaces jsf-2 mojarra

似乎今天(2012年4月),MyFaces和Mojarra的JSF 2.1实现都存在部分状态保存的缺陷,并且PARTIAL_STATE_SAVING应设置为false.

这是真的?

Bal*_*usC 26

PARTIAL_STATE_SAVING应该设置为false吗?

只有当您遇到与Web应用程序中部分状态保存相关的一般缺陷时才能真正解决/以其他方式解决问题.部分状态保存在整体性能和内存使用方面具有主要优势.另请参阅为什么JSF在服务器上保存UI组件的状态?

我不能100%可靠地为MyFaces说话,但是在Mojarra中,当你绑定标签处理程序的任何属性时,会显示部分状态保存问题的根本原因(标签处理程序可以通过标签上缺少rendered属性来识别)例如JSTL标记)到视图范围的bean,或者当您将JSF组件的idor binding属性绑定到视图范围的bean时(这些属性在构建/恢复视图期间解析).

此问题是由JSF问题1492JSF规范问题787中描述的鸡蛋问题引起的:启用了部分状态保存,视图范围bean存储在部分视图状态中.因此,要提取视图范围的bean,必须还原部分视图状态.在恢复(构建)视图期间,将评估所有上述属性中的EL.但是,由于此时没有可用的视图范围bean实例,因此将创建一个全新的实例.但是,它将其所有属性设置为默认值!在恢复视图并恢复原始视图范围的bean之后,它们将被放回视图范围,覆盖在恢复视图期间创建的(临时)实例.但是这些属性的EL表达式已经基于完全不同的实例进行了评估,无法恢复.

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

你也可以设置javax.faces.FULL_STATE_SAVING_VIEW_IDS代替.这允许您指定需要关闭部分状态保存的所有视图ID的逗号分隔列表:

<context-param>
    <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name>
    <param-value>/some.xhtml,/other.xhtml</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)

这使您可以尽可能地从部分状态保存中受益,并且仅针对部分状态保存相关问题无法修复的部分视图将其关闭.

也可以看看: