关于在不使用会话的情况下临时保存JSF应用程序的状态:
另一种选择是使用Apache Tomahawk库的t:saveState;另一个最近的选择是使用CDI @ConversationScope。
t:saveState x @ConversationScope
每种方法的优点和缺点是什么?你会用哪一个,为什么?
关于内存消耗(在会话上消耗的空间和时间),@ConversationScope是否更好?
无状态JSF x t:saveState
在JSF 2.2中,将有可能实现无状态运行。由于组件树不再被持久化,所以t:saveState将无法工作。这对吗?!
我有一个从JSF 1.2迁移到JSF 2.x的应用程序。它有很多视图使用t:saveStave。
当前会话大小变得太大了。这主要是会话复制的问题。
是否值得将t:saveState替换为@ConversationScope?
更新:我们的大多数用例是流(像向导)。因此,@ViewScope不能被应用。
关于在不使用会话的情况下临时保存JSF应用程序的状态:
另一种选择是使用Apache Tomahawk库的t:saveState;另一个最近的选择是使用CDI @ConversationScope
<t:saveState>
来自旧的JSF 1。X倍,它的使用应该保留在这些应用程序中。@ConversationScope
来自CDI 1.0,用于沿着多个请求扩展JSF bean和组件状态的生命周期,并使用沿请求传递的标识符。
使用JSF 2时最好的替代方案是@javax.faces.bean.ViewScoped
,因为JSF 2.2你应该使用@javax.faces.view.ViewScoped
,它与CDI 1.1兼容。
如果您打算使用JSF 2.0。X或2.1。x和CDI 1.0,那么您将无法使用@ViewScoped
。为了解决这个问题,有第三方库允许CDI管理的JSF bean的视图范围。
是否值得将t:saveState替换为@ConversationScope?
既然您正在迁移到JSF 2。在x中,必须完全放弃对<t:saveState>
的使用。取决于JSF 2。x版本,您应该使用@ViewScope
或其替代品。我不建议使用@ConversationScope
,除非您希望/需要在多个视图中保持bean活动,比如在实现流时,但是JSF 2.2也通过使用@FlowScoped
解决了这个问题。
更多信息:
- 如何选择合适的bean scope?
- JSF CDI:会话作用域bean[s]最佳实践