JSF中的受管Bean的生命期及回调问题?

时间:2021-11-07 19:11:01
JSF中的受管Bean有三种生存期限,request,session,application,我想用session范围的受管Bean的来标记是否登陆,如果手动退出,那么可以手动进行善后处理,可是当session过期或关闭浏览器时,session范围的JSF受管Bean会被销毁,此时只能依靠受管Bean的销毁回调函数。有谁知道受管Bean的回调函数和相应处理方法?

7 个解决方案

#1


无人问津还是无人知晓啊,各位大侠帮帮忙

#2


琢磨出个名堂来了,就是在这个受管Bean中添加一个方法,并使用@PreDestroy注释,当关闭浏览器时,此时的SESSION只能等超时后,session才会销毁,同时保存在session范围的受管Bean也跟着被销毁,当受管Bean销毁前,将回调用@PreDestroy注释的方法,不过,发现该方法被调用2次,第一次是在sessionDestroyed回调之前,第二次是sessionDestroyed回调之后。sessionDestroyed是HttpSessionListener监听器方法,在session销毁之前将被回调。
以下是对PreDestroy注释的文档说明:
---------------------------------------
PreDestroy 注释作为回调通知用于各方法,以表示该实例正处于被容器移除的过程中。用 PreDestroy 注释的方法通常用于释放它已持有的资源。除 Java EE 5 中的应用程序客户端容器之外,所有支持 PostConstruct 的容器管理对象都必须支持此注释。应用 PreDestroy 注释的方法必须遵守以下所有标准:该方法不得有任何参数,除非是在 EJB 拦截器 (interceptor) 的情况下,根据 EJB 规范的定义,在这种情况下它将带有一个 InvocationContext 对象;该方法的返回类型必须为 void;该方法不得抛出已检查异常;应用 PreDestroy 的方法可以是 public、protected、package private 或 private;该方法不得是 static;该方法可以是 final;如果该方法抛出未检查异常,则忽略此异常,除非是能够处理异常的 EJB。 

#3


引用楼主 zavens 的回复:
JSF中的受管Bean有三种生存期限,request,session,application,我想用session范围的受管Bean的来标记是否登陆,如果手动退出,那么可以手动进行善后处理,可是当session过期或关闭浏览器时,session范围的JSF受管Bean会被销毁,此时只能依靠受管Bean的销毁回调函数。有谁知道受管Bean的回调函数和相应处理方法?

JSF 2 的受管Bean加入了视图作用域以及自定义作用域。另外,对于你说的问题(标记登录),可以看看 Seam、WebBeans 等框架的处理思路 :-)

#4


SessionBean 只要实现HttpSessionBindingListener接口就行了

#5


引用 4 楼 abc130314 的回复:
SessionBean 只要实现HttpSessionBindingListener接口就行了

HttpSessionBindingListener早就考虑过了,标记登陆的功能我是通过受管Bean的属性赋值来实现的,而不是使用HttpSession的setAttribute,虽然受管Bean保存在Session范围内,但是通过valueBound和valueUnbound方法中的Session事件参数根本无法取到受管Bean,因而在HttpSession中,当Session被销毁时,根本无法跟踪受管Bean

#6


引用 5 楼 zavens 的回复:
引用 4 楼 abc130314 的回复:
SessionBean 只要实现HttpSessionBindingListener接口就行了

HttpSessionBindingListener早就考虑过了,标记登陆的功能我是通过受管Bean的属性赋值来实现的,而不是使用HttpSession的setAttribute,虽然受管Bean保存在Session范围内,但是通过valueBound和valueUnbound方法中的Session事件参数根本无法取到受管Bean,因而在HttpSession中,当Session被销毁时,根本无法跟踪受管Bean

上面表述的是HttpSessionListener接口,它直接跟踪会话创建和销毁事件
HttpSessionBindingListener仅仅是跟踪HttpSession中属性的绑定与解绑事件

#7


引用 3 楼 dl88250 的回复:
引用楼主 zavens 的回复:
JSF中的受管Bean有三种生存期限,request,session,application,我想用session范围的受管Bean的来标记是否登陆,如果手动退出,那么可以手动进行善后处理,可是当session过期或关闭浏览器时,session范围的JSF受管Bean会被销毁,此时只能依靠受管Bean的销毁回调函数。有谁知道受管Bean的回调函数和相应处理方法?

JSF 2 的受管Bean加入了视图作用域以及自定义作用域。另外,对于你说的问题(标记登录),可以看看 Seam、WebBeans 等框架的处理思路 :-)

听说过Seam,只是现在还没接触过,发现Seam对与JSF很重要,可能是对JSF的补充吧。我觉得JSF封装了请求和响应,使我们基本摆脱了Request和Response,在处理页面逻辑,界面事件,表单数据方面作用显著,但是在其他方面,比如这个会话跟踪,权限控制方面略显不足,HttpSessionListener应该是不属于JSF

#1


无人问津还是无人知晓啊,各位大侠帮帮忙

#2


琢磨出个名堂来了,就是在这个受管Bean中添加一个方法,并使用@PreDestroy注释,当关闭浏览器时,此时的SESSION只能等超时后,session才会销毁,同时保存在session范围的受管Bean也跟着被销毁,当受管Bean销毁前,将回调用@PreDestroy注释的方法,不过,发现该方法被调用2次,第一次是在sessionDestroyed回调之前,第二次是sessionDestroyed回调之后。sessionDestroyed是HttpSessionListener监听器方法,在session销毁之前将被回调。
以下是对PreDestroy注释的文档说明:
---------------------------------------
PreDestroy 注释作为回调通知用于各方法,以表示该实例正处于被容器移除的过程中。用 PreDestroy 注释的方法通常用于释放它已持有的资源。除 Java EE 5 中的应用程序客户端容器之外,所有支持 PostConstruct 的容器管理对象都必须支持此注释。应用 PreDestroy 注释的方法必须遵守以下所有标准:该方法不得有任何参数,除非是在 EJB 拦截器 (interceptor) 的情况下,根据 EJB 规范的定义,在这种情况下它将带有一个 InvocationContext 对象;该方法的返回类型必须为 void;该方法不得抛出已检查异常;应用 PreDestroy 的方法可以是 public、protected、package private 或 private;该方法不得是 static;该方法可以是 final;如果该方法抛出未检查异常,则忽略此异常,除非是能够处理异常的 EJB。 

#3


引用楼主 zavens 的回复:
JSF中的受管Bean有三种生存期限,request,session,application,我想用session范围的受管Bean的来标记是否登陆,如果手动退出,那么可以手动进行善后处理,可是当session过期或关闭浏览器时,session范围的JSF受管Bean会被销毁,此时只能依靠受管Bean的销毁回调函数。有谁知道受管Bean的回调函数和相应处理方法?

JSF 2 的受管Bean加入了视图作用域以及自定义作用域。另外,对于你说的问题(标记登录),可以看看 Seam、WebBeans 等框架的处理思路 :-)

#4


SessionBean 只要实现HttpSessionBindingListener接口就行了

#5


引用 4 楼 abc130314 的回复:
SessionBean 只要实现HttpSessionBindingListener接口就行了

HttpSessionBindingListener早就考虑过了,标记登陆的功能我是通过受管Bean的属性赋值来实现的,而不是使用HttpSession的setAttribute,虽然受管Bean保存在Session范围内,但是通过valueBound和valueUnbound方法中的Session事件参数根本无法取到受管Bean,因而在HttpSession中,当Session被销毁时,根本无法跟踪受管Bean

#6


引用 5 楼 zavens 的回复:
引用 4 楼 abc130314 的回复:
SessionBean 只要实现HttpSessionBindingListener接口就行了

HttpSessionBindingListener早就考虑过了,标记登陆的功能我是通过受管Bean的属性赋值来实现的,而不是使用HttpSession的setAttribute,虽然受管Bean保存在Session范围内,但是通过valueBound和valueUnbound方法中的Session事件参数根本无法取到受管Bean,因而在HttpSession中,当Session被销毁时,根本无法跟踪受管Bean

上面表述的是HttpSessionListener接口,它直接跟踪会话创建和销毁事件
HttpSessionBindingListener仅仅是跟踪HttpSession中属性的绑定与解绑事件

#7


引用 3 楼 dl88250 的回复:
引用楼主 zavens 的回复:
JSF中的受管Bean有三种生存期限,request,session,application,我想用session范围的受管Bean的来标记是否登陆,如果手动退出,那么可以手动进行善后处理,可是当session过期或关闭浏览器时,session范围的JSF受管Bean会被销毁,此时只能依靠受管Bean的销毁回调函数。有谁知道受管Bean的回调函数和相应处理方法?

JSF 2 的受管Bean加入了视图作用域以及自定义作用域。另外,对于你说的问题(标记登录),可以看看 Seam、WebBeans 等框架的处理思路 :-)

听说过Seam,只是现在还没接触过,发现Seam对与JSF很重要,可能是对JSF的补充吧。我觉得JSF封装了请求和响应,使我们基本摆脱了Request和Response,在处理页面逻辑,界面事件,表单数据方面作用显著,但是在其他方面,比如这个会话跟踪,权限控制方面略显不足,HttpSessionListener应该是不属于JSF