这个问题可能不符合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内,您还有其他准则要存储什么以及永不存储什么?是否有任何组件框架都具有此类准则?
最佳答案
我使用以下准则:
避免使用VIEW SCOPE,因为它仅适用于Faces Manages Bean。
更好:避免使用Faces托管后备Bean。使用CDI托管后备Bean来确保可移植性。 (当然,只有在Java EE 6和更高版本中有任何可用的cdi容器时才可以这样做)
避免通过JSF使用AJAX。 (或仅对简单的UI谨慎使用...)