A:
Listener监听器:
1:javaweb开发中的监听器,用于监听web常见对象:HttpServletRequest、HttpSession,ServletContext,
监听他们的创建与销毁,属性变化,session绑定javaBean
2:监听机制:
事件:就是一个发生在事件源上的一个事件
事件源:产生这个事情的源头
监听器:用于监听指定的事件的对象
注册监听:要想让监听器可以监听到事件产生,必须对其进行注册(一般是实现要监听对象的接口)
3:监听域对象的创建与销毁
监听ServletContext创建与销毁,实现的接口是:ServletContextListener
监听HttpSession创建与销毁,实现的接口是:HttpSessionListener
监听HttpServletRequest创建与销毁,实现的接口是:ServletRequestListener
4:监听域对象的属性变化
监听ServletContext属性变化,实现的接口是:ServletContextAttributeListener
监听HttpSession属性的变化,实现的接口是:HttpSessionAttributeListener
监听HttpServletRequest属性变化,实现的接口是:ServletRequestAttributeListener
5:监听Session绑定javaBean
用于监听javaBean对象是否绑定到了session域,实现的接口是:HttpSessionBindingListener
用于监听javBean对象的活化与钝化,实现的接口是:HttpSessionActivationListener
6:创建一个监听器的步骤
(1)创建一个类,实现指定的监听器接口
(2)重写接口中的方法
(3)在web.xml文件中对监听器进行注册,例如:<listener>
<listener-class>com.itheima.test.MyServletContextListener</listener-class>
</listener>
B:关于域对象创建与销毁的演示代码
1:ServletContext对象的创建与销毁
注:这个对象是在服务器启动时创建的,在服务器关闭时销毁的
public class MyServletContextListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent sce){
system.out.println("servletContext对象被创建了");
}
public void contextdestroyed(servletContext sce){
system.out.println("servletContext对象被销毁了");
}
}
2:HttpSession对象的创建与销毁
HttpSession session=request.getSession();
Session销毁:
1:默认超时(30分钟)
2:关闭服务器
3:invalidate()方法//使session销毁
4:setMaxInactiveInterval(int interval)可以设置超时时间
注:session对象是一个jsp内置对象,他在第一个jsp页面被装载时自动创建,完成会话期管理
从一个客户打来浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为
一个会话;当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间切换,服务器
应当通过某种方法知道这是同一个客户,就需要session对象
public class MyHttpSessionListener implements HttpSessionListener{
public void sessionCreated(HttpSessionEvent se){
system.out.println("创建session对象");
}
public void sessionDestroyed(HttpSessionEvent se){
system.out.println("销毁了session对象");
}
}
3:HttpServletRequest创建与销毁
Request对象是发送请求服务器就会创建它,当响应产生时,request对象就会销毁
public class MyRequestListener implements ServletRequestListener{
public void requestDestroyed(ServletRequestEvent sre){
System.out.println("request对象销毁了");
}
public void requestInitialized(ServletRequestEvent sre){
System.out.println("request对象创建了");
}
}
C:关于Request域对象中的属性变化
1:监听HttpServletRequest的属性的添加,修改,删除
public class TestHttpServletRequestAttribute implements ServletRequestAttributeListener{
public void attributeAdded(ServletRequestAttributeEvent srae)
{
System.out.println("HttpServletRequest添加了数据了");
}
public void attributeRemoved(ServletRequestAttributeEvent sra)
{
System.out.println("HttpServletRequest删除了数据");
}
public void attributeRequestReplaced(ServletRequestAttributeEvent srae)
{
System.out.println("HttpServletRequest替换了了数据");
System.out.println("替换了属性:"+srae.getName());
}
}
注:在java的监听机制中,它的监听器方法都是有参数的,参数就是事件对象,我们可以通过事件来得到事件源
D:关于Session对象的监听
1:关于session绑定javaBean对象
(1)javaBean对象自动感知被绑定到session中
HttpSessionBindingListener这个接口是由javaBean实现的,并且不需要在web.xml文件中注册
public class User implements Serializable,HttpSessionBindingListener{
public void valueBound(HttpSessionBindingEvent event){
System.out.println("向session中绑定了一个user对象");
}
public void valueUnbound(HttpSessionBindingEvent event){
System.out.println("从session中将user对象移除了");
}
}
(2)在jsp中的代码如下:
<%
User user=new User();
user.setId(1);
user.setUsername("tom");
user.setPassword("123");
user.setRole("admin");
//绑定到session
session.setAttribute("user",user);
//解除绑定
session.removeAttribute("user");
%>
2:javaBean对象可以活化或钝化到session中
HttpSessionActivationListener如果javaBean实现了这个接口,那么当我们正常关闭服务器的时候,session中的javaBean
对象就会被钝化到我们指定的文件中,当下一次再启动服务器的时候,因为我们已经将对象写入到文件中,这时就会自动将javaBean对象活化到session中
public class User implements Serializable,HttpSessionBindingListener,
HttpSessionActivationListener{
public void sessionWillPassivate(HttpSession se){
System.out.println("钝化");
}
public void sessionDidActivate(HttpSessionEvent se){
System.out.println("活化");
}
}
我们还需要个context.xml文件来配置钝化时存储的文件,在meta-inf目录下创建一个context.xml文件
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="it315"/>
</Manager>
</Context>
3:对于定时销毁session对象的步骤:
(1):怎样可以将每一个创建的session全都保存起来?
我们可以做一个HttpSessionListener,当session对象创建时,就将这个session对象装入到一个集合中.
将集合List<HttpSession>保存到ServletContext域中。
(2):怎样可以判断session过期了?
在HttpSession中有一个方法public long getLastAccessedTime()
它可以得到session对象最后使用的时间。
可以使用invalidate方法销毁。
4:创建session和销毁闲置sesison
(1)创建session对象时,就会被放在ServletContext里面的集合当中,代码如下:
public class TestHttpSessionListener implements HttpSessionListener{
//当HttpSession被创建时,放入到ServletContext中的集合
public void sessionCreated(HttpSessionEvent se){
//把HttpSession对象放入到List
HttpSession session=se.getSession();
//得到ServletContext对象
ServletContext application=session.getServletContext();
//从ServletContext中得到List集合
List<HttpSession> list=(List<HttpSession>)application.getAttribute("sessions");
list.add(session);
System.out.prinln("添加了session:"+session.getId());
}
public void sessionDestroyed(HttpSesisonEvent se){
}
}
(2)监视ServletContext对象,当被创建的时候会创建存储session对象的集合,代码如下:
//监听ServletContext,当ServletContext对象被创建时,创建存储HttpSession对象 的集合
public class TestServletContextListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
//创建List集合,放在匿名内部类中变量要使用final修饰
final List<HttpSession> list = new ArrayList<HttpSession>();
//把集合放到ServletContext对象中
ServletContext application = sce.getServletContext();
application.setAttribute("sessions", list);
//定时的扫描集合,把超时的session销毁
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("开始扫描。。。。。");
for(Iterator<HttpSession> ite = list.iterator();ite.hasNext();){
HttpSession session = ite.next();
long t = System.currentTimeMillis()-session.getLastAccessedTime();
if(t>3000)
{
System.out.println("销毁了一个session:"+session.getId());
session.invalidate();//销毁
ite.remove();
//list.remove(session);//从集和中删除该session对象,但集合内部不能自己的元素进行增删操作
}
}
}
}, 2000, 5000);
}
public void contextDestroyed(ServletContextEvent sce) {
}
}