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

解决方案 »

  1.   

    琢磨出个名堂来了,就是在这个受管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。 
      

  2.   

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

  3.   

    SessionBean 只要实现HttpSessionBindingListener接口就行了
      

  4.   

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

  5.   

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

  6.   

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