这个问题可能不符合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/