玩技术,Geeker
一个原创技术文章分享网站

Java Web Listener学习笔记

简述Listener

Listener就是监听器,监听着某个事件的发生。当监听的事件发生时,则要通知这个监听器去“干”一些事情。这篇文章就要对Java Web开发中的这个Listener说道说道。

我们都知道,Web应用在Web容器中运行,Web应用内部会不断的产生各种事件,例如Web应用被启动、Web应用被停止、用户Session开始、用户Session结束等;一般情况来说,我们并不在意这些事件的发生,但是有的时候,实现某些需求却要在这些事件上做文章。那么如何做文章呢?

当这些事件发生时,它需要去通知那些关注这个事件的“人”,这都是基于《观察者模式》实现了该功能。正好Servlet API正好提供了大量监听器来“关注”Web应用的内部事件,从而允许当Web内部事件发生时回调事件监听器内的方法。

在Servlet API中目前提供的Web事件监听器接口有如下几个:

接口名称 作用
ServletContextListener 用于监听Web应用的启动和关闭
ServletContextAttributeListener 用于监听ServletContext范围(application)内属性的改变
ServletRequestListener 用于监听用户请求
ServletRequestAttributeListener 用于监听ServletRequest范围(request)内属性的改变
HttpSessionListener 用于监听用户Session的开始和结束
HttpSessionAttributeListener 用于监听HttpSession范围(session)内属性的改变

下面就通过实际的代码来总结如何实现监听器接口,以及如何配置它。

实现Listener类

使用监听器的功能只需要两步:

  • 定义实现相关Listener接口的类
  • 在web.xml文件中配置Listener

就这些。下面通过实现ServletContextListener接口来仔细看看如何定义一个Listener类、以及如何配置这个Listener类。

package com.jellythink.practise;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ServletContextListenerImpl implements ServletContextListener
{
    // 应用启动时,该方法会被调用
    public void contextInitialized(ServletContextEvent sce)
    {
        System.out.println("应用启动......");
    }

    // 应用关闭时,该方法会被调用
    public void contextDestroyed(ServletContextEvent sce)
    {
        System.out.println("应用关闭......");
    }
}

上面这个类实现了ServletContextListener接口;当应用启动、关闭时,都会回调对应的方法。

配置Listener

同Servlet、Filter一样,完成了对应的类以后,都需要在Web.xml中配置这个类名,从而让Web容器能够找到对应的类。对于Listener的配置,相对于Servlet和Filter来说更简单一些。具体配置如下:

<listener>
    <listener-class>com.jellythink.practise.ServletContextListenerImpl</listener-class>
</listener>

ServletRequestListener代码示例

上面对ServletContextListener接口进行了简单的说明,下面通过一段代码来演示如何使用ServletRequestListener接口。

package com.jellythink.practise;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;

public class ServletRequestListenerImpl implements ServletRequestListener
{
      // 当用户请求结束、被销毁时触发该方法
      public void requestDestroyed(ServletRequestEvent sre)
      {
          HttpServletRequest req = (HttpServletRequest)sre.getServletRequest();
          System.out.println("++++发向" + req.getRequestURI() + "请求被初始化++++");
      }

      // 当用户请求到达、初始化时触发该方法
      public void requestInitialized(ServletRequestEvent sre)
      {
          HttpServletRequest req = (HttpServletRequest)sre.getServletRequest();
          System.out.println("++++发向" + req.getRequestURI() + "请求被销毁++++");
      }
}

当实现了ServletRequestListener接口以后,每当有请求到达服务器,并正确初始化HttpServletRequest对象以后,或者用户结束了请求以后,都会回调对应的监听器方法。

ServletRequestAttributeListener代码示例

如果实现了ServletRequestAttributeListener监听器接口,当在request作用域下的属性发生了变化时,就会回调对应的方法,下面就通过一段代码来实现ServletRequestAttributeListener监听器。

public class ServletRequestAttributeListenerImpl implements ServletRequestAttributeListener
{
      // 当向request作用域添加属性时,触发该方法
      public void attributeAdded(ServletRequestAttributeEvent srqe)
      {
          ServletRequest req = srqe.getServletRequest();
          String attrName = srqe.getName();
          Object attrValue = srqe.getValue();
          System.out.println(req + "范围内添加了名为:" + attrName + ", 值为:" + attrValue + "的属性");
      }

      // 当从request作用域删除属性时,触发该方法
      public void attributeRemoved(ServletRequestAttributeEvent srqe)
      {
          ServletRequest req = srqe.getServletRequest();
          String attrName = srqe.getName();
          Object attrValue = srqe.getValue();
          System.out.println(req + "范围内删除名为:" + attrName + ", 值为:" + attrValue + "的属性");
      }

      // 当修改request作用域属性值时,触发该方法
      public void attributeReplaced(ServletRequestAttributeEvent srqe)
      {
          ServletRequest req = srqe.getServletRequest();
          String attrName = srqe.getName();
          Object attrValue = srqe.getValue();
          System.out.println(req + "范围内名为:" + attrName + ", 值为:" + attrValue + "的属性被修改了");
      }
}

这就是关于属性相关的监听器的用法,就这些。

总结

Listener是非常重要的东西,可能我在这里说你也不会体会到。有朝一日,你要实现某些需求时,当你想到Listener时,你会发现这个东西太好用了。这就是基础。有些东西,学习总结是一回事,项目实践又是一回事。好了,这篇总结到此结束了,同时关于JSP和Servlet的基础学习也就告一段落了,接下来将全力学习SSH。

果冻想-一个原创技术文章分享网站。

2015年12月13日 于呼和浩特。

打赏

未经允许不得转载:果冻想 » Java Web Listener学习笔记

分享到:更多 ()

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    Java很强大

    松露之家11个月前 (06-26)回复

在这里玩技术,享受技术带来的疯狂

捐赠名单关于果冻