J2EE监听器和过滤器基础
Servlet程序由Servlet,Filter和Listener组成,其中监听器用来监听Servlet容器上下文。
监听器通常分三类:基于Servlet上下文的ServletContex监听,基于会话的HttpSession监听和基于请求的ServletRequest监听。
- ServletContex监听器
/**
* 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监听器
* @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事件监听器
* @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过滤器
/**
*
* @author : bless<505629625@qq.com>
* 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
J2EE监听器和过滤器基础的更多相关文章
- Servlet初始配置 监听器和过滤器
ServletContext:application范围内的参数 此所设定的参 来源: http://note.sdo.com/my 数,在JSP网页中可以使用下列方法来取得: ${initParam ...
- Django基础(2)--模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介
没整理完 昨日回顾: 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 ...
- Django 模板 语法 变量 过滤器 模板继承 组件 自定义标签和过滤器 静态文件相关
本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法 模板渲染的官方文档 关于模板渲染你只需要记两种特殊符号(语法 ...
- 面试题:struts 拦截器和过滤器
拦截器和过滤器的区别 过滤器是servlet规范中的一部分,任何java web工程都可以使用. 拦截器是struts2框架自己的,只有使用了struts2框架的工程才能用. 过滤器在url-patt ...
- Spring Boot2(七):拦截器和过滤器
一.前言 过滤器和拦截器两者都具有AOP的切面思想,关于aop切面,可以看上一篇文章.过滤器filter和拦截器interceptor都属于面向切面编程的具体实现. 二.过滤器 过滤器工作原理 从上图 ...
- Oracle Sales Cloud:报告和分析(BIEE)小细节2——利用变量和过滤器传参(例如,根据提示展示不同部门的数据)
在上一篇随笔中,我们建立了部门和子部门的双提示,并将部门和子部门做了关联.那么,本篇随笔我们重点介绍利用建好的双提示进行传参. 在操作之前,我们来看一个报告和分析的具体需求: [1] 两个有关联的提示 ...
- ElasticSearch 嵌套映射和过滤器及查询
ElasticSearch - 嵌套映射和过滤器 Because nested objects are indexed as separate hidden documents, we can’t q ...
- django中自定义标签和过滤器
想要实现自定义标签和过滤器需要进行准备工作: 准备(必需)工作: 1 在某个app下创建一个名为templatetags(必需,且包名不可变)的包.假设我们在名为polls的app下创建了一个tem ...
- angular实例教程(用来熟悉指令和过滤器的编写)
angular的插件太少了, 所以很多指令和过滤器都要自己写, 所以对指令传进来的参数, 以及angular编译的流程更加熟悉才行写出好的插件, 有些简单的指令是参考angularUI里面, 作为 ...
随机推荐
- C# ?? 操作符示例
static int? GetNullableInt() { return null; } static string GetStringValue() { return null; } static ...
- font-face 使用
<style type="text/css"> @font-face{ font-family:'Aaargh'; src:url(fonts/Aaargh/Aaarg ...
- Ribbon2: 创建动态的Ribbon库
Sam Radakovitz曾在Excel团队博客中发表过一篇文章,介绍了如何创建动态的Ribbon库,即如何通过RibbonX和VBA放置动态的图形图像到功能区库中,在该文中,作者创建了两个库:一个 ...
- 基本的 html 代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 【SSH进阶之路】Hibernate基本原理(一)
在开始学Hibernate之前,一直就有人说:Hibernate并不难,无非是对JDBC进一步封装.一句不难,难道是真的不难还是眼高手低? 如果只是停留在使用的层面上,我相信什么技术都不难,看看别人怎 ...
- PHP读取CSV大文件导入数据库的示例
对于数百万条数据量的CSV文件,文件大小可能达到数百M,如果简单读取的话很可能出现超时或者卡死的现象. 为了成功将CSV文件里的数据导入数据库,分批处理是非常必要的. 下面这个函数是读取CSV文件中指 ...
- 网络受限下,使用Nexus要解决的两个问题
在网络受限的情况下,使用nexus总会遇到这么两个问题,让你头疼. 我头疼过了,为了不让大家头疼,把解决方案放在这里,供大家参考. 问题一.背景: 由于网络原因,Nexus无法更新远程仓库的索引. ...
- 常用工具类,文件和内存的大小获取,shell脚本的执行
/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Versi ...
- ZRender源码分析2:Storage(Model层)
回顾 上一篇请移步:zrender源码分析1:总体结构 本篇进行ZRender的MVC结构中的M进行分析 总体理解 上篇说到,Storage负责MVC层中的Model,也就是模型,对于zrender来 ...
- express框架目录结构
. ├── app.js ├── bin │ └── www ├── node_modules │ ├── body-parser │ ├── cookie-parser │ ├── ...