请求范围和查看范围[重复]
Posted
技术标签:
【中文标题】请求范围和查看范围[重复]【英文标题】:request scope and view scope [duplicate] 【发布时间】:2012-11-13 23:21:52 【问题描述】:可能重复:How to choose the right bean scope?
我是 JSF 编程的新手,我需要澄清一下 bean 作用域。我已经阅读了有关此论点的所有问题,但不是很清楚。 我不太了解请求范围。我理解:“这是默认范围,基本上 bean 在整个单个 HTTP 请求中都是活动的。”
例如,假设我们要求浏览器打开一个带有表单的网页。当我们发出请求时,会创建一个请求范围 bean,生命周期开始,在渲染响应阶段之后,Java bean 被销毁。 然后我们填写表格并按下按钮。这将启动另一个 HTTP 请求,对吧?
在相同的上下文中,如果一个有视图范围 bean 而不是请求范围 bean,有什么区别?创建了多少个 bean 实例?为什么将它与数据表一起使用会更好?
【问题讨论】:
因为我在“jSF 2.0 完整参考”上读到,请求范围 bean 可以在导航到另一个页面时存活下来,前提是它是在同一个 HTTP 请求期间?但在那之后我们导航到另一个页面,将会被销毁(我想)。怎么可能? 您不需要在帖子中包含签名 - 您的用户卡会自动添加。阅读FAQ了解更多详情。 好的好的,谢谢,我会记住的……这就像一个习惯 【参考方案1】:您的所有来源(包括 BalusC 链接的帖子)的请求范围在您的请求到达服务器后不久就开始存在,并在响应的最后一位被发回后不久被销毁。
确实,如果您回发一个表单,则会启动一个新请求,从而启动一个新的请求范围。这意味着将再次创建请求范围内的所有内容。因此,对于一个首先呈现,然后回发一次的表单,将创建 2 个请求范围的 bean。
只要您回发到同一个视图(页面),视图范围就存在。这通过称为javax.faces.ViewState
的隐藏表单参数起作用。如果您在服务器上使用保存状态,则此值是某种逻辑 Map 的条目。 JSF 实现如何实际解决这个问题在这里并不重要(但是是的,它主要只是一个 Map)。
在回发之后,JSF 能够通过此参数再次检索完全相同的视图范围 bean。因此,对于第一次呈现然后回发一次的表单,将创建 1 个视图范围 bean。
对于数据表,您几乎总是希望使用视图范围。原因是您希望数据在回发之前和之后是相同的。如果您的数据是 100% 静态的和/或您没有回发(您的表不在表单中),则可以改用请求范围。
【讨论】:
非常感谢@dexter,我想现在我明白了其中的区别,我会更好地管理 bean 的范围。以上是关于请求范围和查看范围[重复]的主要内容,如果未能解决你的问题,请参考以下文章