经历了这些优秀的帖子:
Why JSF saves the state of UI components on server?
Why does JSF save component tree state?
在JavaEE6教程的中途,我仍然有以下问题:
由于
答案 0 :(得分:6)
当我开发一个自定义UI组件,其值(styleClass,value等)是静态定义的(在xhtml中)或通过bean设置时,我是否需要在扩展中显式保存/恢复状态组件也是?
是。您通常会使用StateHelper
。
说UI组件的范围是视图范围的吗?
绝对不是。 UI组件实例是请求范围的。只有通过StateHelper
存储的任何内容实质上都是视图范围(并在“恢复视图”阶段恢复到新创建的组件实例)。
视图如何识别行为? (如果我离开视图,视图将在下一次重建。但是如果我打开另一个选项卡,它将被恢复 - 至少是bean!)
可能是从浏览器缓存中请求的。尝试在其中提交表格。你获得ViewExpiredException
的机会很大。您需要告诉浏览器不要缓存动态页面。在bean的构造函数上设置断点也会确认它从未被调用过。
当我执行Ajax调用时,我希望UI组件的“执行”部分将被恢复和处理,并且“渲染”部分将被恢复和更新。
恢复部分并非如此。恢复“整个”视图状态。请注意,视图状态确实如此,因为JSF 2.0不一定代表整个组件树。您已经在问题中提到的两个链接中找到了解释/答案。
如何定义构建时组件(vs渲染时)以及为什么要这样做? (与渲染时间混合似乎构建时间组件很麻烦,所以为什么要这两个)
这称为“标记处理程序”。即只是从TagHandler
而不是UIComponent
延伸并根据合同执行。如果唯一目标是构建视图(JSF组件树),则标记处理程序很有用。它们不会出现在JSF组件树中。至于何时创建自定义组件或自定义标记处理程序,请检查OmniFaces showcase的“组件”和“标记处理程序”部分,它可能会对这些事物的实际用例提供一些新的见解。