监听器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)//放行