[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()方法中做某些恢复该成员状态的动作。

时间: 2024-11-03 14:49:03

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

Servlet和JSP迈上新台阶

js|servlet 即将面世的J2EE 1.4提供用Java开发Web应用程序的新的Servlet 2.4和JavaServer Pages (JSP) 2.0技术.本文展示了这两种技术的新特性,并在适当的地方提供每个特性的示例代码.本文假设读者熟悉以前的 Servlet 2.3和JSP 1.2版本.给出的例子已用Tomcat 5(包含在Java Web Services Developer Pack 1.2中)进行了测试. Servlet和JSP毫无疑问是两种应用最广的J2EE技术.Serv

JSP监听器用法分析_JSP编程

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

调优servlet和JSP的程序性能

本文讲述了调整JSP和servlet的一些非常实用的方法,它可使你的servlet和JSP页面响应更快,扩展性更强.而且在用户数增加的情况下,系统负载会呈现出平滑上长的趋势.在本文中,我将通过一些实际例子和配置方法使得你的应用程序的性能有出人意料的提升.其中,某些调优技术是在你的编程工作中实现的.而另一些技术是与应用服务器的配置相关的.在本文中,我们将详细地描述怎样通过调整servlet和JSP页面,来提高你的应用程序的总体性能.在阅读本文之前,假设你有基本的servlet和JSP的知识. 方法

用servlet将jsp文件内容转为html

用servlet将jsp文件内容转为html. 用servlet将jsp文件内容转为html.代码如下: package examples; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import javax.serv

Servlet、Jsp性能优化

js|servlet|性能|优化 你的J2EE应用是不是运行的很慢?它们能不能承受住不断上升的访问量?本文讲述了开发高性能.高弹性的JSP页面和Servlet的性能优化技术.其意思是建立尽可能快的并能适应数量增长的用户及其请求.在本文中,我将带领你学习已经实践和得到证实的性能调整技术,它将大大地提高你的servlet和jsp页面的性能,进而提升J2EE的性能.这些技术的部分用于开发阶段,例如,设计和编码阶段.另一部分技术则与配置相关. 技术1:在HttpServlet init()方法中缓存数据

一、Servlet和JSP概述

js|servlet  1.1 Java Servlet及其特点 Servlet是Java技术对CGI编程的回答.Servlet程序在服务器端运行,动态地生成Web页面.与传统的CGI和许多其他类似CGI的技术相比,Java Servlet具有更高的效率,更容易使用,功能更强大,具有更好的可移植性,更节省投资(更重要的是, Servlet程序员收入要比Perl程序员高:-):     高效      在传统的CGI中,每个请求都要启动一个新的进程,如果CGI程序本身的执行时间较短,启动进程所需要

Java Servlet 和 JSP教程(2)

js|servlet|教程 2 安装 2.1 安装Servlet和JSP开发工具 要学习Servlet和JSP开发,首先你必须准备一个符合Java Servlet 2.1/2.2和JavaServer Pages1.0/1.1规范的开发环境.Sun提供免费的JavaServer Web Development Kit(JSWDK),可以从http://java.sun.com/products/servlet/下载. 安装好JSWDK之后,你还要告诉javac,在编译文件的时候到哪里去寻找Ser

Java Servlet 和 JSP教程(3)

js|servlet|教程 3 Servlet 3.1 Servlet基本结构 下面的代码显示了一个简单Servlet的基本结构.该Servlet处理的是GET请求,所谓的GET请求,如果你不熟悉HTTP,可以把它看成是当用户在浏览器地址栏输入URL.点击Web页面中的链接.提交没有指定METHOD的表单时浏览器所发出的请求.Servlet也可以很方便地处理POST请求.POST请求是提交那些指定了METHOD="POST"的表单时所发出的请求,具体请参见稍后几节的讨论. import

Servlet和JSP 性能调整技术

js|servlet|性能 概述 在本文中, Rahul Chaudhary将描述性能调整技术 (PTT performance-tuning techniques) 的使用,来提升servlets 和JSP 的性能,以此来提升你的J2EE应用的性能.笔者假设读者具有基础的servlets 和JSPs知识. 你的J2EE应用程序运行缓慢么?它们可以满足足够的压力么?本文将会描述如何在开发高性能的应用和JSP以及servlets中使用性能调整技术 (PTT performance-tuning t