谁能介绍一下viewscope的实现原理
暗夜骑士0376
2011-09-22
最近在看jsf,他的viewscope很是吸引人,有谁能告诉一下viewscope的实现原理吗。如果是用jsp实现的话,该怎么实现。
我自己的理解jsf实现了每一个页面都有一个viewstate,当我们初始化一个xhtml的时候进行初始化给一个viewstate值,这个viewstate怎么进行回收,如果我在一个页面疯狂的进行刷新的话,岂不是创建了很多的state,这个viewstate的回收。希望有大侠告知一下。 |
|
lteb2002
2011-09-29
相当于以前的一个<a4j:keepAlive>,是一种AJAX的生命周期,试想以下情景:
有一个新闻页面,用户发表评论后,系统需要知道被评论新闻的ID,如果是REQUEST,页面打开后,和服务器连接中断,ID丢失,ViewScoped的ManagedBean,只要页面不关,它就不消失,生命周期界于request和session之间。可能是通过<input type="hidden" />实现的,功能也和它差不多。 |
|
remoteJavaSky
2011-09-29
http://blogs.oracle.com/rlubke/entry/jsf_2_0_new_feature6
可以使用Session来保存变量Map,并保存当前访问的页面链接ID或url当接收到不是同一页面的请求时清除这个Map,存储变量对象的东东。。 它介于Session与Request范围之间,既方面的保存了当前页面的变量,又可以在访问另一页面是有效的清除,减少Session压力。类似于ConversationScope |
|
暗夜骑士0376
2011-10-02
我的问题是服务器怎么知道该页面消失了,难道当我们关闭页面的时候他还发送一个ajax给服务器告诉服务器哪一个页面消失了吗
|
|
klxwcx
2011-10-09
对此问题特别关注呀
|
|
lteb2002
2011-10-11
暗夜骑士0376 写道 我的问题是服务器怎么知道该页面消失了,难道当我们关闭页面的时候他还发送一个ajax给服务器告诉服务器哪一个页面消失了吗
可能服务器压根都不知道它的存在,是通过hidden类型的input再次通信时向服务器表明自己存在过。 Ajax4J的创始人现在也是JSF专家组的成员,可能是他们搞的,道理和aj4:keepAlive完全一样,只不过是进行了规范化。 自己看看是不是绑定@ViewScoped的页面form的最后一项有个长长的<input type="hidden" value="..." /> |
|
暗夜骑士0376
2011-10-16
lteb2002 写道 暗夜骑士0376 写道 我的问题是服务器怎么知道该页面消失了,难道当我们关闭页面的时候他还发送一个ajax给服务器告诉服务器哪一个页面消失了吗
可能服务器压根都不知道它的存在,是通过hidden类型的input再次通信时向服务器表明自己存在过。 Ajax4J的创始人现在也是JSF专家组的成员,可能是他们搞的,道理和aj4:keepAlive完全一样,只不过是进行了规范化。 自己看看是不是绑定@ViewScoped的页面form的最后一项有个长长的<input type="hidden" value="..." /> 对啊,如果不发送的化,那么这个viewscope bean对象应该就是dump,难道后台应该有一个对viewscope进行管理的manager,定期清理一些长时间没有响应的viewscope吗? 如果我指定一个页面的话,岂不是如果我一直F5进行刷新,那么后台岂不是一直创建一个viewscope实例bean对象,这么弄的话,服务器的负载能受得了吗 |
|
klxwcx
2011-10-20
通过jdk自带的监控工具jvisualvm.exe,
可以得出,不停用F5刷新,确实生成很多实例呀! |
|
feng2356
2012-12-19
我的理解是这样,viewscope的生命周期比session短,比request长。request请求一次就结束了,很容易理解,session呢,登录有效期呢一直存活。对于viewscope,请求一次结束后,还活着,像session一样,还在服务端活着。下一次该用户的请求来时,判断两次请求是否还是同一个页面,如果是,继续活着。如果不是,那么就结束了。以此类推,假如后台的bean都是viewscope,一个用户访问多少次服务端,最多也只有一个bean是一直活着的。这就是为什么说view是介于session和request之间,奥秘在此
|
|
ta8210
2013-07-01
看源码就知道了。
to 暗夜骑士0376: 首先ViewState数据是不需要回收的,ViewState数据存在的目的是为了在下一次请求时可以获得上一次jsf页面中的状态数据而存在。 另外ViewState数据会贯穿整个JSF生命周期。但是只会在“恢复视图、渲染页面”两个生命周期中涉及到。 request->恢复视图->应用请求值->处理验证->更新模型->调用应用->渲染页面->response 1.在“恢复视图”阶段之前JSF会根据请求地址装载的JSF页面,并且将其解析成为UIViewRoot对象。UIViewRoot中包含了JSF页面中所有组建的定义(树型数据结构)。 2.在“恢复视图”阶段JSF会调用UIViewRoot类的processRestoreState方法恢复状态。由于所有组建包括UIViewRoot都继承自UIComponent这个抽象类所以每个组建对状态恢复的处理只需要处理好自身的然后递归调用子组建即可。 3.渲染页面,在这个阶段 JSF只需要管好两件事,一个是调用UIViewRoot类的saveState方法保存组建树的状态,这个状态数据最后会在Render时被写入到页面的隐藏表单域中。 注:UIViewRoot的saveState方法处理了两件事,下面是JSF UIViewRoot.saveState()源码 Object superState = super.saveState(context);//保存组建树状态 Object attachedState = saveAttachedState(context, viewScope);//保存ViewScope数据 第二件事就是JSF会调用getRenderer方法获取javax.faces.render.Renderer类进行渲染。 这个过程也是递归调用。 对于ViewState数据在客户端jsf.js中也会有处理但是这些都只是jsf2.0 ajax方面扩展时才会涉及。 关于ViewScope Bean ,顾名思义就是View范围的Bean。 由于在jsf中每次请求都会重建View所以就会看到 klxwcx 仁兄检测到的状况。这个在前面已经讲过了是由于生命周期的缘故。 ViewScope数据也是在生命周期过程中加以处理这一点上面源码已经给出了。 另外对楼上“feng2356”仁兄的补充如下: jsf标记view是通过viewId。所以服务端只需要保留一个viewid和对应bean集合的map就可以完成ViewScope Bean的功能。 至于页面关闭是否回传关闭事件往往jsf不关心这个问题。因为即使没有发送view关闭事件当session关闭的时候view自然就被销毁了。或者jsf也是通过恢复视图的方式恢复ViewScope Bean。 关于这一部分我没分析过它的代码所以不能给你一个官方的明确答案。不过你想实现这部分功能倒是可以利用我介绍给你的方式。不知道可否给楼主JSF一个比较明确的解释。 |
相关讨论
相关资源推荐
- ubuntukylin-13.04-desktop-amd64操作系统
- UbuntuKylin 13.04 用户手册
- 固态硬盘安装linux系统教程视频,SSD安装UbuntuKylin 13.04
- UbuntuKylin13.04 Beta1发布及试用
- Ubuntu13.04/Ubuntukylin13.04离线安装配置java环境变量
- UbuntuKylin 13.04 Beta 2 发布
- UbuntuKylin 13.04发行版究竟应该由谁来发布?
- Ubuntukylin 13.04 自动挂载windows盘
- 64位Ubuntukylin 13.04安装完成后登陆桌面时花屏
- ubuntukylin 13.04下配置android真机调试