JSF的javax.faces.ViewState反模式

时间:2013-11-05 09:44:43

标签: jsf viewstate view-scope

这个问题可能不符合SO规则,但无论如何我都会问。答案可能会帮助其他人与JSF斗争。


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

在我看来,我们的一个主要错误是对JSF的VIEW SCOPE的误解。 JSF提供了两种基本机制,用于保存VIEW STATE - CLIENT和SERVER。我们选择了SERVER方法,这是我们的第一个错误,ViewExpiredException从那时起就没有停止过。下一个错误是将数据存储在VIEW SCOPE上,因为这使我们无法轻松切换到CLIENT状态保存方法。

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

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

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

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

我的结论是否正确?在VIEW SCOPE中,您对存储什么以及永不存储的内容有任何其他指导吗?任何组件框架都有这样的指导方针吗?

1 个答案:

答案 0 :(得分:-2)

我使用以下指南:

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