Val*_*lva 372 jsf scope jsf-2 managed-bean
我注意到有不同的bean范围,如:
@RequestScoped
@ViewScoped
@FlowScoped
@SessionScoped
@ApplicationScoped
Run Code Online (Sandbox Code Playgroud)
每个人的目的是什么?如何为我的bean选择合适的范围?
Bal*_*usC 474
它表示bean的范围(生命周期).如果您熟悉基本servlet Web应用程序的"幕后操作",这将更容易理解:servlet如何工作?实例化,会话,共享变量和多线程.
@Request/View/Flow/Session/ApplicationScoped
一个@RequestScoped
bean的生命,只要一个HTTP请求响应周期(注意,Ajax请求算作一个HTTP请求太).一个@ViewScoped
bean的生命,只要你用相同的JSF视图由调用的操作方法返回的回传交互null
/ void
无任何导航/重定向.一个@FlowScoped
为你通过的流量配置文件中注册的视图指定的集合导航豆住,只要.一个@SessionScoped
bean的生命,只要建立HTTP会话.一@ApplicationScoped
豆住,只要运行Web应用程序.需要注意的是,CDI @Model
基本上是一个刻板的@Named @RequestScoped
,所以规则也同样适用.
选择哪个范围仅取决于bean保存和表示的数据(状态).使用@RequestScoped
简单和非Ajax表格/演示.使用@ViewScoped
了丰富的支持Ajax的动态视图(ajaxbased验证,渲染,对话框等).使用@FlowScoped
的"向导"("问卷")收集的输入数据的模式分布在多个页面.使用@SessionScoped
客户端的具体数据,如登录的用户和用户偏好(语言等).使用@ApplicationScoped
应用程序范围内的数据/常量,比如下拉列表,是适合每一个人,或管理的bean没有任何实例变量和仅有的方法相同.
滥用@ApplicationScoped
bean用于会话/视图/请求范围的数据将使其在所有用户之间共享,因此任何其他人都可以看到彼此的数据,这是完全错误的.滥用@SessionScoped
视图/请求范围数据的bean将使其在单个浏览器会话中的所有选项卡/窗口之间共享,因此在切换选项卡之后与每个视图交互时,最终用户可能会遇到不一致,这对用户体验不利.滥用@RequestScoped
bean用于视图范围数据会使视图范围数据在每个单独(ajax)回发时重新初始化为默认值,从而导致可能的非工作表单(另请参见此处的第4点和第5点).滥用@ViewScoped
bean来处理请求,会话或应用程序作用域数据,以及滥用应用程序作用域数据的@SessionScoped
bean不会影响客户端,但它不必要地占用服务器内存并且效率很低.
请注意,不应根据性能影响选择范围,除非您确实具有较低的内存占用并且希望完全无状态; 你需要专门使用@RequestScoped
bean并使用请求参数来维护客户端的状态.另请注意,如果您有一个具有不同范围数据的JSF页面,那么将它们放在与数据范围匹配的范围内的单独支持bean中是完全有效的.@ManagedProperty
在JSF托管bean @Inject
的情况下或者在CDI托管bean的情况下,bean可以只访问彼此.
@CustomScoped/NoneScoped/Dependent
在你的问题中没有提到它,但是(遗留的)JSF也支持@CustomScoped
并且@NoneScoped
在现实世界中很少使用.在@CustomScoped
必须引用自定义Map<K, Bean>
在已覆盖了一些更广泛的范围实施Map#put()
/或并Map#get()
以有超过bean创建更为精细的控制和/或破坏.
JSF @NoneScoped
和CDI @Dependent
基本上只对bean进行一次EL评估.想象一个登录表单,其中两个输入字段引用bean属性,而一个命令按钮引用bean操作,因此总共有三个EL表达式,然后实际上将创建三个实例.一个用户名设置,一个用密码设置,另一个用于调用操作.您通常只想在bean上使用此范围,这些bean应该与注入它的bean一样长.因此,如果a @NoneScoped
或者@Dependent
注入a @SessionScoped
,那么它将和@SessionScoped
bean 一样长寿.
最后,JSF也支持flash范围.它由一个短生存cookie支持,该cookie与会话范围中的数据条目相关联.在重定向之前,将在HTTP响应上设置一个cookie,其值与会话范围中的数据条目唯一关联.重定向之后,将检查闪存范围cookie的存在,并且将从会话范围中删除与cookie关联的数据条目,并将其放入重定向请求的请求范围内.最后,cookie将从HTTP响应中删除.这样,重定向的请求可以访问在初始请求中准备的请求范围数据.
这实际上不能作为托管bean范围使用,即没有这样的东西@FlashScoped
.闪存范围仅ExternalContext#getFlash()
在托管bean和#{flash}
EL中作为映射提供.
Kis*_*ash 121
从JSF 2.x开始,有4个Bean范围:
- @SessionScoped
- @RequestScoped
- @ApplicationScoped
- @ViewScoped
会话范围: 会话范围从建立会话到会话终止之间一直存在.如果Web应用程序在HttpSession对象上调用invalidate方法,或者超时,则会话终止.
RequestScope: 请求范围是短暂的.它在提交HTTP请求时启动,在响应发送回客户端后结束.如果将托管bean放入请求范围,则会为每个请求创建一个新实例.如果您担心会话范围存储的成本,则值得考虑请求范围.
ApplicationScope: 应用程序范围在Web应用程序的整个持续时间内持续存在.该范围在所有请求和所有会话之间共享.如果应在Web应用程序的所有实例之间共享单个bean,则将托管bean放入应用程序范围.bean是在应用程序的任何用户首次请求时构造的,并且在从应用程序服务器中删除Web应用程序之前它一直处于活动状态.
ViewScope: 在JSF 2.0中添加了View范围.视图范围中的bean在重新显示相同的JSF页面时仍然存在.(JSF规范对JSF页面使用术语视图.)一旦用户导航到不同的页面,bean就会超出范围.
根据您的要求选择范围.
资料来源: David Geary和Cay Horstmann的核心Java Server Faces第3版 [第页.51 - 54]
归档时间: |
|
查看次数: |
199182 次 |
最近记录: |