我在Oracle网站上学习JSF生命周期,遇到了关于组件树重建的歧义点。
根据我的理解,在每次回发请求(包括ajax)后,都会根据保存的最新视图状态重建整个组件树,所以我的问题是,在从保存的视图状态成功重建组件树后,服务器会如何处理旧组件树和旧视图状态,丢弃或存储在视图池之类的地方,以便以后重用?
这取决于您使用的状态保存模式。如果使用客户端状态保存,则与视图相关的信息将存储到javax.faces.ViewState隐藏字段参数中。当服务器接收到请求时,它会根据状态创建视图,对其进行处理,并在响应中写入字段。如果使用服务器端状态保存,则状态会存储到会话中,因此在某些情况下,旧状态是存在的,但有一种算法可以丢弃会话中的旧视图。
对于JSF 2.0 Partial State Saving(PSS),视图源自两个方面:初始状态和delta状态。初始状态是通过使用facelets算法再次构建视图得出的。因此,存储为视图状态的只是整个状态的一小部分。这个技巧确实非常有效,所以在改进之后,人们就不需要再关心JSF的状态大小了。与无状态框架相比,这带来了非常好的性能。请参阅关于JSFCentral 的理解JSF性能第3部分
在ApacheMyFaces2.2中有一个视图池算法。其思想是利用状态保存算法,并使用它来重用已经构建的视图。它可以将性能提高约8-10%,但第三方库需要与这种方法兼容。请参阅如何在Apache MyFaces中配置视图池。这被认为是获得"终极性能"的解决方案,但大多数时候,如果没有它,你会做得很好。
启用PSS的Facelets算法在两个方面被调用:在构建或恢复视图时,以及在渲染响应阶段之前刷新组件(如c:if等)。