J2EE监听器和过滤器基础

Servlet程序由Servlet,Filter和Listener组成,其中监听器用来监听Servlet容器上下文。

监听器通常分三类:基于Servlet上下文的ServletContex监听,基于会话的HttpSession监听和基于请求的ServletRequest监听。

  • ServletContex监听器

ServletContex又叫application,存在范围是整个Servlet容器生命周期,当系统启动时就会创建,系统关闭时会销毁,该对象通常存放一些非常通用的数据,但是不推荐存放太多,否则长期占据内存空间会影响服务器性能。

基于ServletContex的监听器可以继承两个接口并实现接口中相应的方法:

ServletContextListener接口定义了两个方法contextInitialized和contextDestroyed,分别在ServletContex创建和销毁时触发;

ServletContextAttributeListener接口定义了三个方法attributeAdded,attributeRemoved和attributeReplaced,分别在给ServletContex添加属性值,删除属性值和替换属性值时触发。

下面创建了一个基于Application的监听器:

/**
 * Application监听器,Servlet中的Application即ServletContext
 * @author Administrator
 */
public class ApplicationListener implements ServletContextListener,
        ServletContextAttributeListener {  

    /**
     * application销毁时触发的事件
     */
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        System.out.println("Application销毁:"+arg0.getServletContext());
    }  

    /**
     * application初始化时触发的方法
     */
    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        System.out.println("Application创建:"+arg0.getServletContext());
    }  

    /**
     * application中添加属性值时触发的方法
     */
    @Override
    public void attributeAdded(ServletContextAttributeEvent arg0) {
        System.out.println("Application添加新属性:key="+arg0.getName()+"  value="+arg0.getValue());
    }  

    /**
     * application中删除属性值时触发的方法
     */
    @Override
    public void attributeRemoved(ServletContextAttributeEvent arg0) {
        System.out.println("Application移除属性:key="+arg0.getName()+"  value="+arg0.getValue());
    }  

    /**
     * application中替换属性值时触发的方法
     */
    @Override
    public void attributeReplaced(ServletContextAttributeEvent arg0) {
        System.out.println("Application替换属性:key="+arg0.getName()+"  value="+arg0.getValue());
    }  

}  

最后在web.xml需要注册监听器,注册方式非常简单,注意标签<description>和<display-name>不是必须的:

<listener>
    <description>application listener</description>
    <display-name>application_listener</display-name>
    <listener-class>com.bless.listener.application.ApplicationListener</listener-class>
</listener>  

随后启动java web项目,监听器就会运行。

  • Session监听器

Session对于做web项目的人来说应该非常熟悉了,Session的生命周期是一个用户的一次会话,简单的说当一个用户进入某个网站,在该网站服务器就已经为用户创建了一个Session对象,用户在网站内的任何操作都是在session周期内。

误区:某些人认为我进入某网站,随后关闭浏览器,我的session就已经销毁了。其实不然,因为session存储在服务器端,服务器并不能主动捕获到浏览器关闭的事件,即使关闭浏览器,Session对象依然存在服务器中。所以如果编写web应用时一定要考虑session什么时候销毁,销毁session对象的方式有两种:一种是调用session的invalidate方法,另一种是在web.xml中定义session失效时间session-timeout。

Session监听器也有两个接口,其功能与前面介绍的ServletContex类似:HttpSessionListener用于监听Session创建和销毁的事件,HttpSessionAttributeListener用于监听Session属性赋值,删除和替换的事件:

/**
 * Session监听器
 * @author Administrator
 */
public class SessionListener implements HttpSessionListener,  HttpSessionAttributeListener {  

    Vector<HttpSession> listSession = null;  

    /**
     * 创建Session调用的方法
     * 将session对象放入listSession集合中
     */
    public void sessionCreated(HttpSessionEvent arg0) {
        synchronized (this) {
            if(listSession == null){
                listSession = new Vector<HttpSession>();
            }
        }
        listSession.add(arg0.getSession());
        System.out.println("\n\n创建一个Session:"+arg0.getSession());
        System.out.println("[当前存在的Session:]");
        for (HttpSession session : listSession) {
            System.out.println("--->"+session);
        }
    }  

    /**
     * 销毁Session调用的方法
     * 移除listSession集合对应session值
     */
    public void sessionDestroyed(HttpSessionEvent arg0) {
        listSession.remove(arg0.getSession());
        System.out.println("\n\n销毁一个Session:"+arg0.getSession());
        System.out.println("[当前存在的Session:]");
        for (HttpSession session : listSession) {
            System.out.println("--->"+session);
        }
    }  

    /**
     * session属性添加时调用的方法
     */
    public void attributeAdded(HttpSessionBindingEvent arg0) {
        System.out.println("\n\n添加一条Session-->key:"+arg0.getName()+"    属性value:"+arg0.getValue());
    }  

    /**
     * session属性替代时调用的方法
     */
    public void attributeReplaced(HttpSessionBindingEvent arg0) {
        System.out.println("\n\n覆盖一条Session-->key:"+arg0.getName()+"    属性value:"+arg0.getValue());
    }  

    /**
     * session属性移除时调用的方法
     */
    public void attributeRemoved(HttpSessionBindingEvent arg0) {
        System.out.println("\n\n删除一条Session-->key:"+arg0.getName()+"    属性value:"+arg0.getValue());
    }
}  

在web.xml中定义相应监听器配置:

<listener>
    <listener-class>com.bless.listener.session.SessionListener</listener-class>
  </listener>
<!-- Session超时配置 -->
  <session-config>
    <session-timeout>1</session-timeout>
  </session-config>  
  • Request监听器

request监听器使用方法跟前面也是非常类似的,一个request生命周期是向服务器发送请求到服务器响应最后反应到页面的整个过程。Request监听器对应ServletRequestListener,ServletRequestAttributeListener接口,根据不同需求实现相应接口就行了。

/**
 * Request事件监听器
 * @author Administrator
 */
public class RequestListener implements ServletRequestListener,
        ServletRequestAttributeListener {  

    @Override
    public void requestDestroyed(ServletRequestEvent arg0) {
        System.out.println("request销毁:"+arg0.getServletRequest());
    }  

    @Override
    public void requestInitialized(ServletRequestEvent arg0) {
        System.out.println("request创建:"+arg0.getServletRequest());
    }  

    @Override
    public void attributeAdded(ServletRequestAttributeEvent arg0) {
        System.out.println("request属性添加   key="+arg0.getName()+"   value="+arg0.getValue());
    }  

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent arg0) {
        System.out.println("request属性删除   key="+arg0.getName()+"   value="+arg0.getValue());
    }  

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent arg0) {
        System.out.println("request属性替换   key="+arg0.getName()+"   value="+arg0.getValue());
    }  

}  

web.xml配置:

<listener>
    <listener-class>com.bless.listener.request.RequestListener</listener-class>
</listener>  
  • Filter过滤器

当页面发送请求时,符合filter过滤范围的请求会首先进入过滤器,过滤器就可以执行一些过滤操作:比如编码格式,session验证,日志记录等。而这些功能都是自己编写过滤器实现的。

要实现一个过滤器,需要继承Filter接口,实现init、doFilter和destroy方法,这三个方法分别在过滤器初始化、过滤器运行和过滤器销毁时执行。

下面这段代码,是一个字符集过滤器,每次请求都会设置字符集编码格式,注意每次请求都会运行doFilter方法,过滤之后你需要在方法内调用FilterChain.doFilter这样就能让请求访问指定的servlet。

假设你不希望请求访问下一个servlet,你可以选择重定向,跳转到指定页面。

/**
 *
 * @author     : bless<[email protected]>
 * Create Time : 2011-5-10下午10:38:19
 * Description : 字符集格式过滤器
 *
 */
public class EncodingFilter implements Filter {
    //默认编码格式UTF-8
    private static final String DEFAULT_ENCODE = "UTF-8";  

    private String encodeName; // 编码格式  

    public void destroy() {  

    }  

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        try {
            if (encodeName == null || "".equals(encodeName.trim())) {
                request.setCharacterEncoding(DEFAULT_ENCODE);
                response.setCharacterEncoding(DEFAULT_ENCODE);
            } else {
                request.setCharacterEncoding(encodeName);
            }
        } catch (UnsupportedEncodingException e) {
            throw new UnsupportedEncodingException("编码格式过滤错误,请确认web.xml填入了正确的编码格式");
        }
        chain.doFilter(request, response);
    }  

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        //获取web.xml配置的<param-name>encodeName</param-name>的值
        this.setEncodeName(fConfig.getInitParameter("encodeName"));
    }  

    public String getEncodeName() {
        return encodeName;
    }  

    public void setEncodeName(String encodeName) {
        this.encodeName = encodeName;
    }  

}  

然后在web.xml中定义filter即可,标签init-param可以做一个参数配置,在filter中通过init方法参数FilterConfig.getInitParameter获得:

<filter>
    <filter-name>encoding</filter-name>
    <filter-class>com.mt.filter.EncodingFilter</filter-class>
    <init-param>
        <param-name>encodeName</param-name>
        <param-value>GBK</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>  

转自:http://blessht.iteye.com/blog/1164492

http://www.iteye.com/topic/483158

http://chinaxxren.iteye.com/blog/811604

http://blog.csdn.net/fyxxq/article/details/9731747

http://ooft.iteye.com/blog/551498

http://www.iteye.com/topic/82565

时间: 2024-12-11 08:31:51

J2EE监听器和过滤器基础的相关文章

监听器和过滤器

过滤器生命周期的四个阶段: 1.实例化:Web容器在部署Web应用程序时对所有过滤器进行实例化.Web容器回调它的无参构造方法.2.初始化:实例化完成之后,马上进行初始化工作.Web容器回调init()方法. 3.过滤:请求路径匹配过滤器的URL映射时.Web容器回调doFilter()方法--主要的工作方法. 4.销毁: Web容器在卸载Web应用程序前,Web容器回调destroy()方法. 监听器概述 监听你的web应用,监听许多信息的初始化,销毁,增加,修改,删除值等 Servlet监听

Servlet初始配置 监听器和过滤器

ServletContext:application范围内的参数 此所设定的参 来源: http://note.sdo.com/my 数,在JSP网页中可以使用下列方法来取得: ${initParam.param0}, <%=application.getInitParameter("param0") %><br/> 若在Servlet可以使用下列方法来获得: String param_name=getServletContext().getInitParame

JavaWeb学习——监听器和过滤器

监听器 与 Filters 一.概述 监听器是用于监听Web应用而实现了特定接口的Java类.监听器可以在事件发生前.后做一些有必要的处理. Servlet API提供了一系列的事件和事件监听接口.上层的servlet/JSP应用能够通过调用这些API进行事件驱动的开发. 这里监听的所有事件都继承自java.util.EventObject对象. Servlet 中的监听器分类: 监听三个域对象(ServletContext.HttpSession.ServletRequest)的创建和销毁的三

java web监听器和过滤器

2019-3-26 监听器:6+2 1.j监听器种类 2.监听器的编写步骤(重点): a.编写一个监听器类去实现监听器接口 b.覆盖监听器的方法 c.需要在web.xml中进行配置---注册 过滤器 Filter 过滤器的编写步骤(重点): a.编写一个过滤器类去实现过滤器接口 b.覆盖过滤器的方法 c.需要在web.xml中进行配置---注册 原文地址:https://www.cnblogs.com/houchen/p/10604782.html

Spring监听器和过滤器的全局配置

<!-- 监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>cl

JavaWeb监听器和过滤器

JavaWeb监听器 ServletContextListener监听器 Servlet的上下文监听,它主要实现监听ServletContext的创建和销毁.可以完成自己想要的初始化工作.主要包括下面两个方法 //启动服务的时候调用该方法 public void contextInitialized(ServletContextEvent sce); //销毁该服务的时候调用该方法 public void contextDestroyed(ServletContextEvent sce); Se

vue.js基础知识篇(1):简介、数据绑定、指令、计算属性、表单控件绑定和过滤器

目录第一章:vue.js是什么? 代码链接: http://pan.baidu.com/s/1qXCfzRI 密码: 5j79 第一章:vue.js是什么? 1.vue.js是MVVM框架 MVVM的代表框架是Angular.js,以及vue.js. MVVM的view和model是分离的,View的变化会自动更新到ViewModel上,ViewModel的变化会自动同步到View上显示.这种自动同步依赖于ViewModel的属性实现了Observer. 2.它与angular.js的区别 相同

django 内建标签和过滤器参考

下面的标签和过滤器参考就是为那些没有 admin 站点的可用的人准备的.由于 Django 是高度可定制的,你的 admin 里的关于标签和过滤器的参考可以认为是最可信的. 内建标签参考 block 定义一个能被子模板覆盖的 块. 参阅 模板继承 了解更多信息 comment 注释.模板引擎会忽略掉 {% comment %} 和 {% endcomment %} 之间的所有内容. cycle 在循环时轮流使用给定的字符串列表中的值. 在一个循环中, 在循环过程中的每次循环里轮流使用给定的字符串

拦截器和过滤器的区别

拦截器和过滤器都可以用来实现横切关注功能,其区别主要在于: 1.拦截器是基于java反射机制的,而过滤器是基于函数回调的. 2.过滤器依赖于servlet容器,而拦截器不依赖于servlet容器. 3.拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用. 4.拦截器可以访问Action上下文.值栈里的对象,而过滤器不能. 5.在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次. 过滤器,是在java web中,你传入的request,resp