web监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext,HttpSession,ServletRequest等域对象的创建、销毁、以及属性的变化等,可以在事件发生前、发生后进行一些处理。
监听器的用途
1、统计在线人数和在线用户
2、系统加载时进行信息的初始化工作
3、统计网站的访问量
4、跟Spring结合
监听器的分类
按监听的对象划分,可以分为监听
1、ServletContext对象
2、HttpSession对象
3、ServletRequest对象
按监听的事件划分
1、域对象自身的创建和销毁
2、域对象中属性的创建和消除
3、绑定到session中的某个对象的状态
MyServletContextListener是监听者类。这个类实现了ServletContextListener:
1 package com.moonlit; 2 3 import javax.servlet.ServletContext; 4 import javax.servlet.ServletContextEvent; 5 import javax.servlet.ServletContextListener; 6 7 public class MyServletContextListener implements ServletContextListener { 8 9 @Override 10 public void contextInitialized(ServletContextEvent event) { 11 ServletContext sc = event.getServletContext(); 12 String dogBreed = sc.getInitParameter("breed"); 13 Dog d = new Dog(dogBreed); 14 sc.setAttribute("dog", d); 15 } 16 17 @Override 18 public void contextDestroyed(ServletContextEvent event) { 19 // do nothing here 20 } 21 }
我们需要建立一个属性类Dog。DOg只是一个普通的Java类,它的任务是作为一个属性值,由ServletContextListener实例化,并设置在ServletContext中,一遍servlet获取:
1 package com.moonlit; 2 3 public class Dog { 4 private String breed; 5 6 public Dog(String breed) { 7 this.breed = breed; 8 } 9 10 public String getBreed() { 11 return breed; 12 } 13 }
ListenerTest类是一个Servlet类,它的任务是验证监听者的工作。为此这个Servlet会从上下文得到Dog属性,调用Dog的getBreed(),把结果打印到响应(使我们能在浏览器中看到):
1 package com.moonlit; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 @SuppressWarnings("serial") 12 public class ListenerTester extends HttpServlet { 13 @Override 14 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 15 resp.setContentType("text/html"); 16 PrintWriter out = resp.getWriter(); 17 out.println("test context attributes set by listener<br>"); 18 out.println("<br>"); 19 Dog dog = (Dog) getServletContext().getAttribute("dog"); 20 out.println("Dog's breed is : " + dog == null ? "no " : dog.getBreed()); 21 } 22 }
监听器的编写步骤:
a、编写一个监听器类去实现监听器接口
b、覆盖监听器的方法(实现接口之后因为没没有重写方法,会出现异常,点击之后会自动实现两种方法的)
c、需要在web.xml中进行配置<listener>定义权限类名</listener>
监听对象的方法中的参数,就是连接监听对象的:
sce.getServletContext();
下面这个方法也是获得监听对象的方法,不知过是获取通用的方法,而上面的是指定的方法。
sce.getSource();
ServletContextListener监听器的主要作用:
a、初始化工作:初始化对象 初始化数据---加载数据库驱动 连接池的初始化
b、加载一些初始化的配置文件----spring的配置文件
c、任务调度----定时器 Timer = new Timer();定时器创建的方法
监听器分类作用:
HttpSessionListener和SercletRequestListener
监听Session域中的监听创建与销毁
ServletRequest域创建域销毁的监听器ServletRequestListener
这个没什么用的 老师都没有讲解
三个域对象内属性的变化,貌似也是一种监听器
域对象通用的方法:★记住是域对象通用的三个方法
serAttribute(name,value)
getAttribute(name)
removeAttribute(name)
与session中的绑定的对象相关的监听器(对象感知监听器)
1、即将要被绑定到session中的对象有几种状态
绑定状态:就一个对象被放到session域中(同一个监听器HttpSessionBindingLiseener)
解绑状态:就是这这个对象从session域中移除了(同一个监听器HttpSessionBindingLiseener)
HttpSessionBindingLiseener并不是注册给session的,而是给即将要绑定到session域中的对象的
-------------------------------------------------------------------------------------
钝化状态:是将session内存中的对象持久化(序列化)到磁盘
活化状态:就是将磁盘上的对象再次恢复到session内存中
钝化:把内存中的对象弄到硬盘上,叫钝化。
活化:把对象从磁盘中弄到内存中,叫活化,这两个的功能可以优化内存。