如果我在包含表单的JSF中有一个无状态视图。当我填写表格并提交表格时,不同阶段的表现如何?由于视图的状态没有存储在任何地方,“appy request values”,“update model”等阶段现在如何运作?
答案 0 :(得分:2)
JSF生命周期的所有阶段都将继续运行。只有还原视图和渲染响应阶段的行为会有所不同。恢复视图阶段现在只构建视图,但不恢复其状态。渲染响应阶段现在只渲染视图,但不保存其状态。基本上就是这样。所有其他阶段的行为完全相同。
对于开发人员来说,主要区别在于@ViewScoped
bean的行为方式。他们在无状态视图中的行为与@RequestScoped
bean完全相同。所以你只需要立即制作@RequestScoped
。此外,组件树的状态的任何编程更改都不会保留用于回发,但开发人员不应该以编程方式操作组件树(例如binding
,findComponent()
等,这些都是愚蠢的。)< / p>
只需将此类表单视为只能与@RequestScoped
bean一起使用即可。如果您将条件属性(如rendered
,disabled
和readonly
绑定到bean属性并通过同一视图上的ajax更改它,则需要确保重新初始化bean的@PostConstruct
期间相同的bean属性(读取:视图范围状态)。 JSF将作为防范被黑客入侵请求的一部分,在应用请求值之前重新检查它们。一种方法是通过隐藏的输入字段传递它们并手动提取作为请求参数(您基本上重新发明javax.faces.ViewState
所做的事情)。但你应该意识到,这为黑客操纵它们提供了可能性。如果例如,这尤其有害admin-only命令按钮的条件呈现依赖于一个简单的请求参数而不是JSF视图状态(夸大的例子,但它应该给出图片)。