有一个监听这个事件的类,继承一下重写,然后在web.xml中设置
jb里面有帮助

解决方案 »

  1.   

    实现javax.servlet.http.HttpSessionListener接口,实现下面两个方法:// 当创建session"之后",系统自动调用该方法
    public void sessionCreated( HttpSessionEvent se )
    {
    }// 当session过期"之前",系统自动调用该方法
    public void sessionDestroyed( HttpSessionEvent se )
    {
        HttpSession session = se.getSession();
        // todo:你的数据库操作
    }
     
    在web.xml中加:<listener>
        <listener-class><实现接口的类全名></listener-class>
    </listener>
      

  2.   

    楼上是servlet方式在jsp里 
    <%
    session.setAttribute(String name,obj name);
    session.getAttribute(String name)
    %>
      

  3.   

    session.setAttribute()
    也是把信息写进数据库的
    不知道你说的撤消是不是指这个session结束或失效
      

  4.   

    是的,,我要作的程序就是统计用户登录网站的时间,,,,现在查了一些资料还不是很清楚怎么做,只知道在用户登录时session计算开始时间,然后在session结束时计算结束时间,只知道思路这样子,但不知怎么做...........
      

  5.   

    可以写一个类来实现HttpSessionBindingListener 接口。一个O'Reilly - Java Servlet Programming, 2nd Edition中的例子。import java.io.*;
    import java.util.*;
    import javax.servlet.*;
    import javax.servlet.http.*;public class SessionBindings extends HttpServlet {  public void doGet(HttpServletRequest req, HttpServletResponse res)
                                   throws ServletException, IOException {
        res.setContentType("text/plain");
        PrintWriter out = res.getWriter();    // Get the current session object, create one if necessary
        HttpSession session = req.getSession();    // Add a CustomBindingListener
        session.setAttribute("bindings.listener",
                             new CustomBindingListener(getServletContext()));    out.println("This page intentionally left blank");
      }
    }class CustomBindingListener implements HttpSessionBindingListener {  // Save a ServletContext to be used for its log() method
      ServletContext context;  public CustomBindingListener(ServletContext context) {
        this.context = context;
      }  public void valueBound(HttpSessionBindingEvent event) {
        context.log("[" + new Date() + "] BOUND as " + event.getName() +
                    " to " + event.getSession().getId());
      }  public void valueUnbound(HttpSessionBindingEvent event) {
        context.log("[" + new Date() + "] UNBOUND as " + event.getName() +
                    " from " + event.getSession().getId());
      }
    }
      

  6.   

    在撤销前可以用session.getAtrribute(String name); 来获得session的信息
    撤销的代码:session.removeAttribute(String name);
      

  7.   

    呵,不用Lisenter,你的session time out了,自然destory时我看你如何getAttribute()??
      

  8.   

    这样是不是就是一个用户对应一个session
      

  9.   

    能不能写个较完整的小例子,,,,,就是在用户登录时记录时间,到退出或session断时记录退出时间,然后两个时间相减......由于小弟我刚学jsp,想有个完整的例子就发学多了,,,谢谢各位
      

  10.   

    还要例子啊?三楼可乐的答案就是最正确最有效的答案了,连/WEB-INF/web.xml文件如何配都给出来了,如果摆不平就只能看看java的基础书了。
      

  11.   

    那session.removeAttribute(String name)是不是在Servletr的Destroyed事件中调用,还是什么....因为要计算用户关闭窗口时的时间
      

  12.   

    谢谢各位,小弟我初学jsp,但老板要在这两天内做出这个小程序,,,没办法......
      

  13.   

    贴一段给你瞅瞅,具体的你还是看看servlet2.3的具体东西吧(BTW:jsp最终也是要被编译成servlet的)
    生命周期事件
    Servlet API 2.3第二个意义重大的改变是增加了应用程序生命周期事件,即当servlet contexts和sessions被初始化或释放时,当向context或session上添加或删除属性的时候,通知"listener"对象.Servlet生命周期事件与Swing的事件机制类似。对ServletContext生命周期进行观察的监听器必须实现 ServletContextListener接口。这个接口有两个方法:
    &#8226; void contextInitialized(ServletContextEvent e):当Web application第一次准备处理requests的时候(例如:Web server启动并且context被加载和重新加载时)。 本方法返回之前不开始处理Requests
    &#8226; void contextDestroyed(ServletContextEvent e):在Web application要被关闭的时候(例如:当Web server关闭或当一个context被移去或重新加载的时候)。本方法调用时Request处理已经停止.传入这些方法的ServletContextEvent类只有一个返回被初始化或被移去的context的getServletContext()方法。对ServletContext属性生命周期进行观察的监听器必须实现ServletContextAttributesListener接口,这个接口有三个方法:
    &#8226; void attributeAdded(ServletContextAttributeEvent e):当属性被加到servlet context上时调用
    &#8226; void attributeRemoved(ServletContextAttributeEvent e):当属性被从servlet context上移走时调用
    &#8226; void attributeReplaced(ServletContextAttributeEvent e):当servlet context上的属性被另一个属性所代替的时候调用继承于ServletContextEvent的ServletContextAttributeEvent类,增加了getName()和getValue()方法,这两个方法使监听器得到正在被改变的属性的相关信息。现在对于需要同步应用程序状态(context属性)的应用程序来说,如数据库处理,能够方便的在这个地方进行统一的处理。session listener model与context listener model类似。在session事件模型中, 有一个拥有两个方法的HttpSessionListener接口:
    &#8226; void sessionCreated(HttpSessionEvent e):当session创建时被调用
    &#8226; void sessionDestroyed(HttpSessionEvent e):当session被释放时或无效时被调用这些方法接受一个拥有返回被创建或被释放的session的getSession()方法的HttpSessionEvent类实例。可以使用这些方法实现一个对Web application中所有的活动用户进行跟踪的管理者接口。session事件模型还有一个HttpSessionAttributesListener接口,这个接口有三个方法。这些方法告诉监听器属性何时改变,何时能够被使用:
    &#8226; void attributeAdded(HttpSessionBindingEvent e):当属性被加到session上时调用
    &#8226; void attributeRemoved(HttpSessionBindingEvent e):当属性被从session上移去时调用
    &#8226; void attributeReplaced(HttpSessionBindingEvent e):当session上的属性被另一个属性所代替的时候调用与你所猜想的一样, HttpSessionBindingEvent类继承于HttpSessionEvent接口,并且加入了getName()和getValue()方法. 唯一一点不一样的地方是事件类的名字是HttpSessionBindingEvent,而不是 HttpSessionAttributeEvent。合理的解释是:原有的API已经存在了一个名为HttpSessionBindingEvent的事件类, 因此这个事件类被重用。 生命周期事件的一个实际应用由context监听器管理共享数据库连接。在web.xml中如下定义监听器:<listener>
        <listener-class>com.acme.MyConnectionManager</listener-class>
    </listener>
    server创建监听器的实例接受事件并自动判断实现监听器接口的类型。要记住的是由于监听器是配置在deployment descriptor中,所以不需要改变任何代码就可以添加新的监听器。监听器的例子如下:public class MyConnectionManager implements ServletContextListener {    public void contextInitialized(ServletContextEvent e) {
            Connection con = // create connection
            e.getServletContext().setAttribute("con", con);
        }    public void contextDestroyed(ServletContextEvent e) {
            Connection con = (Connection) e.getServletContext().getAttribute("con");
            try { con.close(); } catch (SQLException ignored) { } // close connection
        }
    }监听器保证每新生成一个servlet context都会有一个可用的数据库连接,并且所有的连接对会在context关闭的时候 随之关闭。API 2.3新增的HttpSessionActivationListener监听器接口的目的是处理在server之间传送的session。实现HttpSessionActivationListener的监听器在session要被钝化(移动)和session在其它的主机上要被激活(开始活动)的时候被通知。使用这个接口可以在JVM之间长久保存没有进行序列化的数据,或者是在移动session前后对序列化的对象执行一些附加的操作。这个接口有两个方法:
    &#8226; void sessionWillPassivate(HttpSessionEvent e):session将被钝化。 此时session已经超出了service的管理范围
    &#8226; void sessionDidActivate(HttpSessionEvent e):session已经被激活。此时session还没有进入service的管理范围这个监听器接口与其他的监听器接口在原理上类似。然而与其它监听器不同的是,钝化和激活的调用很有可能发生在两个不同的server中!
      

  14.   

    我是阿杀
    这个还是去问SUN的工程师比较好