JSF 的 javax.faces.ViewState 反模式

标签 jsf viewstate view-scope

这个问题可能不符合SO规则,但我还是会问。答案可能会帮助其他受 JSF 困扰的人。

<小时/>

我们在最大的项目之一上使用 JSF(MyFaces、PrettyFaces、PrimeFaces 和 Spring)已有两年了(从 Tapestry 3 迁移)。我可以说,直到今天我们正在从这次迁移中“恢复”。

在我看来,我们的主要错误之一是误解了 JSF 的 VIEW SCOPE。 JSF 提供了两种基 native 制来保持 View 状态 - 客户端和服务器。我们选择了 SERVER 方法,这是我们的第一个错误,因为从那一刻起,ViewExpiredException 就从未停止过。下一个错误是将数据存储在 VIEW SCOPE 上,因为这使我们无法轻松切换到 CLIENT 状态保存方法。

所以我在想是否有一些关于什么应该和不应该存储在 VIEW SCOPE 上(从而序列化到 VIEW STATE)的最佳实践和指南。官方文档和规范没有提供这一点。但我得出了一个很好的结论:

  • 您应该只在 VIEW SCOPE 上存储通常(没有 JSF)作为请求参数传递的信息。

当您有一个没有 JSF 的基本 CRUD 应用程序时,您可以这样做:

  • 通过 POST 参数中的表单值在请求之间保留表单状态
  • 列表的状态(过滤、排序、分页)通过查询参数在请求之间保留

我的结论正确吗?对于在 VIEW SCOPE 内存储什么和不存储什么,您还有其他指导原则吗?有组件框架有这样的指导方针吗?

最佳答案

我使用以下准则:

  • 避免使用 VIEW SCOPE,因为它仅适用于 Faces Manages Bean。
  • 更好:避免使用 Faces Managed Backing Beans。使用 CDI Managed Backing Beans 确保可移植性。 (当然,这只有在您有任何可用的 cdi 容器时才有可能...在 Java EE 6 及更高版本中...)
  • 避免使用 JSF 进行 AJAX。 (或者仅在简单的 UI 中谨慎使用它......)

关于JSF 的 javax.faces.ViewState 反模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19785876/

相关文章:

ajax - h :inputText inside ui:repeater displays wrong value after an ajax update

jsf - 自定义 p :tab titles in p:accordionPanel

c# - 将 ListItems 从一个列表框复制到另一个列表框

asp.net - ViewState 不需要保留控件值,那么它有什么作用呢?

asp.net - 将 [requireSSL ="true"] 放入我的 web.config 返回垃圾页面

xpages - 我如何知道 viewScope 变量是否已初始化

jsf-2.2 - CDI ViewScope & PrettyFaces : Multiple calls to @PostConstruct (JSF 2. 2)

html - 如何使用分页器位置切换页脚位置

java - 导出包含超过 256 列且带有 primefaces 的 Excel

java - 使用 JSF#view.attributes 映射而不是#viewScope 来存储 View 范围的应用程序数据是否不好?