Listener与Filter在开发中的应用

监听器Listener

1.什么是监听器
一种对象,此对象的工作状态一般情况下不会被察觉,它只对感兴趣的时间进行响应,当此类事件发生时,执行事先绑定的代码.

2.JavaEE中监听器:
JavaEE体系三大核心:Servlet,监听器,过滤器
JavaEE中的监听器一共有八个,按类可以分成三类.
一.ServletContext(2)
1.ServletContextListener:主要用于初始化项目资源和回收资源
a)contextInitialized:项目的初始化事件
b)contextDestroyed:项目的销毁事件
2.ServletContextAttriblteLIstener:向ServletContext域中添加属性后触发此事件,Event事件对象,封装了本次事件所有相关信息的对象
a)attributeAdded:在ServletContext域中添加属性的操作
b)attributeRemoved:删除操作
c)attribyteReplaced:替换操作
二.Session(4)
1.HttpSessionListener:监听Session会话的创建与销毁
a)访问静态资源不会创建会话
b)访问jsp会自动创建会话(因为jsp在被翻译成Servlet是要生成内置对象,会自动调用getSession方法)
c)访问Servlet时只有当用到session(调用getSession方法)时才会创建会话
d)使用的方法:sessionCreated、sessionDestroyed
2.HttpSessionAttributeListener:监听Session会话域中属性的变化
3.HttpSessionBindingListener:绑定监听器,监听指定的JavaBean在Session域中的绑定和解绑事件(保存指定的JavaBean到Session域中,从域中删除)
a)由被监听的JavaBean实现接口
b)不用再web.xml注册
4.HttpSessionActivationListener:监听指定的JavaBean在Session中的钝化和活化事件.此JavaBean必须同时实现系列化接口,java.io.Serialized
a)由被监听的JavaBean实现接口
b)不用再web.xml中注册
钝化:把内存中的数据写入(系列化)磁盘
活化:把磁盘上的数据恢复到内存
在服务器(Tomcat)在正常关闭时,会在”\work\Catalina\localhost\项目名”此目录中生成一个”SESSIONS.ser”文件,其中保存的是服务器关闭时内存中的Session,如果Session域中也保存了数据,此数据也会随
三.Request(2)
1.ServletRequestListener:监听请求对象的创建与销毁
a)requestInitialized
b)requestDestroyed
2.ServletRequestAttributeListener:请求域中的属性的变化

3.如何创建一个监听器:

创建一个类,并实现相应的接口即可实现此监听器,监听器需在web.xml中注册.


类路径



1

案例一:定时发送生日祝福邮件

需求分析:
需要有一个定时执行的机制,给当天过生日的用户发送祝福邮件

技术分析:
要实现以上需求,要有以下功能:
1.定时执行(每隔24小时执行一次)
2.java语言发送邮件,
3.ServletContextListener,监听服务器启动时间,事件发生,则开始执行定时任务.
127.0.0.1:localhost环路测试ip

定时任务:
TimerTask设置一个定时任务,Time.schedule(TimerTask,延时,间隔)
邮件发送:
JavaMail MainUtils.sendMail()

步骤分析:

一.创建一个ServletContextListener,监听项目启动的事件
二.在项目启动事件中,启动一个定时任务,每隔24小时执行一次
三.在数据库中查找今天过生日的用户列表
四.遍历用户,给这些用户发送邮件

代码实现:

监听项目启动的监听器

public void contextInitialized(ServletContextEvent sce){
Timer timer = new Timer();
timer.schedule(new TimerTsak(){
public void run(){

    }
}
2000,24*60*60*1000
);

}

过滤器Filter

什么是过滤器Filter:
是一种可以控制并加工请求和响应的对象,请求在到达目标之前和离开目录之后,都要经过过滤器的处理,过滤器就相当于门卫的角色.(放行、预处理、后处理)

过滤器只有一种:javax.servlet.Filter.过滤器可以视为一个增强的Servlet.(Struts2,80%功能是由过滤器完成的)

如何开发一个过滤器:
1.创建一个类实现Filter接口
2.web.xml中注册

<!--配置过滤器-->
<filter>
    <filter-name>first</filter-name>
    <filter-class>cn.xxx.filterdemo</filter-class>
</filter>

<filter-mapping>
    <filter-name>first</filter-name>
    <url-pattern>/hello</url-pattern>
</filter-mapping>

doFilter方法中
//放行前的代码段,可以被称为预处理
//放行的动作(可以把它理解成调用目标Servlet的service方法)
chain.doFilter(request,response);
//放行后的代码段,可以被称为后处理

过滤器的生命周期:
项目启动即初始化,项目停止即销毁.Filter和Servlet一样单例模式.
当存在多个过滤器时,执行顺序:首先按web.xml配置文件中注册的顺序执行预处理.逐个放行,当请求到达目标并开始做出响应时,响应时按逆序通过过滤器,返回客户端浏览器.

预处理:统一的字符集设置问题的解决.
后处理:响应页面内容的压缩、页面的静态化.

案例二:统一的字符集处理

当为POST方式时,需要设置字符集setCharacterEncoding
当GET方式时,需要对值本身进行重新编码

需要增强getParamater()方法,

增强一个类的方法的方式:
一.继承
a)必须知道父类,才能继承
二.装饰模式
a)增强类和增强类必须实现相同的接口
b)增强类中必须持有被增强类的对象引用

步骤分析:
一.开发一个过滤器,在过滤器中对request对象进行包装(增强getparameter方法)
二.放行.放行时传入的request对象是增强后的包装类,此时,Servlet中得到的Request对象就是增强后的,在Servlet中调用getParameter方法得到参数值时,自动重新编码,解决中文乱码问题.

案例三:自动登录

需求分析:
在登录时可以由用户选择,是否进行两周内免登录

技术分析:

Cookie:
Filter:
Session:

步骤分析:
一.开发一个登录页面,可以输入用户名和密码,提供一个复选框,代表是否自动登录
二.如果登录时,勾选了自动登录功能,而且登录成功
三.把用户名密码写入Cookie(Cookie.setMaxAge()设置有效期),
四.如果用户再次访问此网站时,需要创建一个过滤器
五.此过滤器实现以下功能:判断当前用户是否已登录(Session中是否存在用户信息)
六.如果是未登录状态,过滤器的预处理代码段需要进行以下操作:
七.从request中取得Cookie中的用户名和密码信息
八,如果存在则调用业务逻辑,进行登录
九.放行

总结
监听器
8个
ServletContext
ServletContextListener
ServletContextAttributListener
Session
HttpSessionListener
HttpSessionAttributeListener
HttpSessionBindeingLIstener
HttpSessionActivationListener
Request
ServletRequestListener:
ServletRequestAttributeListener
过滤器

javax.servlet.Filter
方法:init
destroy
doFilter(ServletRequest,ServletResponse,FilterChain)
chain.doFilter(ServletRequest,ServletResponse)//放行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值