摘自BalusC's Communication in JSF 2.0
•@ ViewScoped:在这个范围豆住,只要你在浏览器窗口/标签相同的JSF视图交互。它会在HTTP请求中创建,并在您回发到其他视图后被破坏。当您通过GET请求离开/关闭视图时,它不会立即被破坏,但它不再以通常的方式访问。 JSF将bean以受管bean名称作为关键字存储在UIViewRoot#getViewMap()中,该关键字又存储在会话中。您需要从操作(侦听器)方法返回null或void以保持bean活着。使用此作用域可以使用更复杂的表单,这些表单使用ajax,数据表和/或多个呈现/禁用属性,其状态需要在同一浏览器窗口/选项卡(视图)内的后续请求中保留。
•@ SessionScoped:只要HTTP会话存在,此范围内的bean就会一直存在。它在会话中涉及此Bean的第一个HTTP请求时创建,并在HTTP会话失效时(或者从会话映射中手动删除Bean)被破坏。 JSF将bean作为HttpSession的一个属性进行存储,并将托管的bean名称作为关键字。它也可以通过ExternalContext#getSessionMap()获得。使用此作用域可以在同一会话中的所有浏览器窗口/选项卡(视图)之间安全地共享纯会话范围的数据。例如,登录用户,所述用户偏好例如用户特定的设置和所选择的语言/区域设置等
ViewScoped
豆被存储在其又被存储在用户会话中的UIViewRoot,因此ViewScoped
bean也间接存储在会话中。会话过期并被销毁后,ViewScoped
bean也会被销毁,如果您在该代码中引用期望状态的代码中的某些内容,或者您正在使用需要状态(如.a4j)的第三方组件,那么这可以解释这个奇怪的问题。
我建议切换到RequestScoped
为您的LoginBean。我从来没有遇到过需要ViewScoped
支持bean登录到应用程序的情况。
当您说“a4j”是指RichFaces的“”组件? –
BalusC
2012-02-10 13:26:53
@BalusC >>是的。 – user1201055 2012-02-13 03:28:01