[Servlet&JSP] 监听器的使用

在Servlet/JSP中除了ServletContextListener外,还有ServletRequestListenerHttpSessionListener等监听器,可以监听请求、会话对象生命周期;ServletRequestAttributeListenerHttpSessionAttributeListenerServletContextAttributeListener可以监听属性的添加、删除或替换;HttpSessionBindingListenerHttpSessionActivationListener可以监听会话属性对象的绑定、删除。

生命周期监听器

所谓的生命周期监听器,就是可以在某个对象生成到被容器销毁之前,监听对象生命周期的状态变化。如在应用程序初始化或结束前,会分别调用contextInitialized()contextDestroyed()方法,通过传入的ServletContextEvent取得ServletContext,以针对应用程序作出相对应的初始化或结束处理。

  • ServletContextListener
    • contextInitialized(sce: ServletContextEvent): void
    • contextDestroyed(sce: ServletContextEvent): void
  • ServletContextEvent
    • ServletContextEvent(source: ServletContext)
    • getServletContext(): ServletContext

如果想要在ServletRequest(HttpServletRequest)对象生成或结束时,做些相应动作,则可以实现ServletRequestListener

  • ServletRequestListener
    • requestInitialized(sre: ServletRequestEvent): void
    • requestDestroyed(sce: ServletRequestEvent): void
  • ServletRequestEvent
    • ServletRequestEvent(sc: ServletContext, request: ServletRequest)
    • getServletRequest(): ServletRequest
    • getServletContext(): ServletContext

如果想要在HttpSession对象生成或结束时,做些相应动作,则可以实现HttpSessionListener

  • HttpSessionListener
    • sessionCreated(sre: HttpSessionEvent): void
    • sessionDestroyed(sce: HttpSessionEvent): void
  • HttpSessionEvent
    • HttpSessionEvent(source: HttpSession)
    • getSession(): HttpSession

一个HttpSessionListener应用实例如下,假设有个应用程序在用户登录时会使用HttpSession对象来进行会话管理:

//...
public class Login extends HttpServlet{
    //...
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        if ("abc".equals(username) && "123".equals(password)) {
            request.getSession().setAttribute("login", username);
            request.getRequestDispatcher("user.jsp")
                .forward(request, response);
        } else {
            response.sendRedirect("login.html");
        }
    }
}

这个Servlet在用户登录验证后,会取得HttpSession实例并设置属性。如果想要在应用程序中,加上显示目前已登录在线人数的功能,则可以实现HttpSessionListener接口。例如:

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class LoginListener implements HttpSessionListener {
    private static int count;

    public static int getCount() {
        return count;
    }

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        count++;
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        count--;
    }
}

为了使用这个监听器,要在web.xml中加以设置

<web-app ...>
    <listener>
        <listener-class>club.chuxing.LoginListener</listener-class>
    </listener>
</web-app>

要显示在线人数时,使用LoginListener.getCount()即可。

属性操作监听器

在Servlet/JSP中,有三个对象可以设置属性,分别是ServletContextHttpSessionServletRequest。如果想要在这些对象被设置、删除或替换属性时,收到通知以进行一些动作,则可以实现相对应的ServletContextAttributeListenerHttpSessionAttributeListenerServletRequestAttributeListener接口。

  • ServletContextAttributeListener
    • attributeAdded(scab: ServletContextAttributeEvent): void
    • attributeRemoved(scab: ServletContextAttributeEvent): void
    • attributeReplaced(scab: ServletContextAttributeEvent): void
  • HttpSessionAttributeListener
    • attributeAdded(se: HttpSessionBindingEvent): void
    • attributeRemoved(se: HttpSessionBindingEvent): void
    • attributeReplaced(se: HttpSessionBindingEvent): void
  • ServletRequestAttributeListener
    • attributeAdded(srae: ServletRequestAttributeEvent): void
    • attributeRemoved(srae: ServletRequestAttributeEvent): void
    • attributeReplaced(srae: ServletRequestAttributeEvent): void

当在这三个对象中加入、删除或替换属性时,相对应的方法就会被调用。如果要使用这几个监听器,必须同样在web.xml中使用<listener><listener-class>进行设置。

会话属性类监听器

前面几个监听器都必须在web.xml中进行设置,这里所要介绍的HttpSessionBindingListenerHttpSessionActivationListener,则是让即将加入HttpSession的属性对象实现,HttpSession在适当的时机就会直接调用接口上对应的方法,不必在web.xml中做任何设置。

HttpSessionBindingListener

如果有个即将加入HttpSession的属性对象,希望在设置给HttpSession成为属性或从HttpSession中删除时,可以收到HttpSession的通知,则可以让该对象实现HttpSessionBindingListener接口。

当属性对象被加入到HttpSession中或从中删除时,就会调用对应的valueBound()valueUnbound()方法。

  • HttpSessionBindingListener
    • valueBound(event: HttpSessionBindingEvent): void
    • valueUnbound(event: HttpSessionBindingEvent): void

接下来是该接口的一个范例,假设有登录程序如下:

//...
public class Login extends HttpServlet{
    //...
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        if ("abc".equals(username) && "123".equals(password)) {
            User user = new User(name);
            request.getSession().setAttribute("login", user);
            request.getRequestDispatcher("user.jsp")
                .forward(request, response);
        } else {
            response.sendRedirect("login.html");
        }
    }
}

当用户输入正确的用户名和密码时,首先会以用户名称来创建User实例,而后加入HttpSession中作为属性。当希望User实例被加入成为HttpSession属性时,可以自动从数据库中加载用户的其他数据,比如地址、相片等,并在日志中记录用户登录的信息;而当HttpSession失效或者因用户注销而User实例从HttpSession中删除时,则在日志中记录用户注销的信息。在这种情况下,可以让User类实现HttpSessionBindingListener接口。例如:

import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

public class User implements HttpSessionBindingListener {
    private String name;
    private String otherData;

    public User(String name) {
        this.name = name;
    }

    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        this.otherData = name + ": query data from database...";
        Logger.getLogger(User.class.getName()).log(Level.SEVERE, this.name + " login...", event);
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        Logger.getLogger(User.class.getName()).log(Level.SEVERE, this.name + " logout...", event);
    }

    //Getter and Setter
}

HttpSessionActivationListener

HttpSessionActivationListener定义了两个方法sessionWillPassivate()sessionDidActivate()

  • HttpSessionActivationListener
    • sessionWillPassivate(se: HttpSessionEvent): void
    • sessionDidActivate(se: HttpSessionEvent): void

大部分情况下,几乎不会使用到HttpSessionActivationListener。在使用到分布式环境时,应用程序的兑现可能分散在多个JVM中。当HttpSession要从一个JVM迁移至另一个JVM时,必须现在原本的JVM上序列化所有的属性对象。在这之前若属性对象实现了HttpSessionActivationListener,就会调用sessionWillPassivate()方法。当HttpSession迁移至另一个JVM后,就会对所有对象做反序列化,此时就会调用sessionDidActivate()方法。

要实现序列化的对象必须实现Serializable接口,如果在HttpSession对象中,有些类别成员无法做序列化,则可以在sessionWillPassivate()方法中做些替代处理来保存该成员的状态,而在sessionDidActivate()方法中做某些恢复该成员状态的动作。


转载:http://blog.csdn.net/foreverling/article/details/50321293

时间: 2024-08-21 06:55:06

[Servlet&JSP] 监听器的使用的相关文章

[Servlet&amp;amp;JSP] 监听器的使用

在Servlet/JSP中除了ServletContextListener外,还有ServletRequestListener.HttpSessionListener等监听器,可以监听请求.会话对象生命周期:ServletRequestAttributeListener.HttpSessionAttributeListener.ServletContextAttributeListener可以监听属性的添加.删除或替换:HttpSessionBindingListener.HttpSession

JavaWeb实现用户登录注册功能实例代码(基于Servlet+JSP+JavaBean模式)_java

下面通过通过图文并茂的方式给大家介绍JavaWeb实现用户登录注册功能实例代码,一起看看吧. 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据. Servlet+JSP+JavaBean模式程序各个模块之间层次清晰,web开发推荐采用此种模式. 这里以一个最常用的用户登录注册程序来讲解Servlet+JS

JSP监听器用法分析_JSP编程

本文实例讲述了JSP监听器用法.分享给大家供大家参考,具体如下: 监听器也叫Listener,是servlet服务的监听器.它可以监听客户端的请求,服务端的操作等.比如统计在线用户数量.每当增加一个HttpSession时,就会触发sessionCreate(HttpSessionEvent se)方法,这样就可以给在线人数加1.常用的监听器接口如下: 1. ServletContextAttributeListener监听对ServletContext属性的操作.比如增加,删除,修改属性. 2

在Windows NT 4.0下安装Apache+Servlet+JSP

apache|js|servlet|window 版本:1.0作者:何志强(hhzqq@sina.com)时间:2000.03.16 本文只讨论如何在Windows NT 4.0上安装Apache+Servlet+JSP.本文中的配置情况如下: Windows NT 4.0 jdk1_2_2-001-win.exe apache_1_3_12_win32.exe ApacheModuleJServ.dll tomcat.zip(3.0)一.软件下载 JDK http://java.sun.com

Java Servlet/Jsp多语言解决方案(一)

js|servlet|解决 Java Servlet/Jsp多语言解决方案 因为一直不信Java竟会有不能混排显示多国语言的BUG,这个周末研究了一下Servlet. Jsp的多国语言显示的问题,也就是Servlet的多字符集问题,由于我对字符集的概念还 不是很清晰所以写出的东西未必是准确的,我是这样理解Java中的字符集的:在运行时 ,每个字符串对象中存储的都是编码为UNICODE内码的(我觉得所有的语言中都是有相应 编码的,因为在计算机内部字符串总是用内码来表示的,只不过一般计算机语言中的字

Apache+Servlet+Jsp环境设置(上)

apache|js|servlet 本文只讨论如何在Windows NT 4.0上安装Apache+Servlet+Jsp.本文中的配置情况如下: Windows NT 4.0 jdk1_2_2-001-win.exe apache_1_3_12_win32.exe ApacheModuleJServ.dll tomcat.zip(3.0) 一. 软件下载 JDK http://java.sun.com/products/jdk/1.2/ Apache Server http://www.apa

Apache+Servlet+Jsp环境设定(上)

本文只讨论如何在Windows NT 4.0上安装Apache+Servlet+Jsp.本文中的配置情况如下: Windows NT 4.0 jdk1_2_2-001-win.exe apache_1_3_12_win32.exe ApacheModuleJServ.dll tomcat.zip(3.0) 一. 软件下载 JDK http://java.sun.com/products/jdk/1.2/ Apache Server http://www.apache.org/dist/binar

④品茶看&lt;Servlet&amp;JSP&gt;-EL表达式

前言 今早,概率课偷了下小懒写的:   泡一杯红茶,ACM集训前,写篇博客记录记录EL表达式. #EL介绍 ①EL 语法 ②访问JavaBean等 ③EL隐式对象 ④EL运算符   EL介绍 EL 全名为Expression Language.受ECMAScript 和XPath 表达式的语言启发.EL 的语法比传统JSP Scriptlet 更为方便.简洁.   EL 语法   ①基本知识 ${为起始.以}为结尾的,构造:${expression}.接下来比较下: JSP Scriptlet获

javabean servlet jsp实现分页功能代码解析_java

前端实现用ligerUI实现分页,感觉用框架确实简单,闲着无聊,模拟着liger的分页界面实现了一遍(只要是功能,样式什么无视)  这里用基础的三层架构+servlet+jsp实现,思路很简单,把所有分页相关信息写入到一个pagebean类里面,service返回这个bean类,每次分页查询时都从该bean里查找信息.只是其中的细节问题比较繁琐,如边界处理(前端和后台边界都要处理),下拉框跳转后要显示当前页等等  这是ligerUI实现的分页样式(实现过程我的上一篇博客有写:http://www