1. 认识监听器(Listener)
监听器实际是实现了特定接口的类,这个类在web.xml中进行描述。服务器启动时,这个类可以监听一些关键事件的发生,如ServletContext的初始化和撤销、使用初始化参数查找名建立数据库连接、吧数据库连接存储为一个属性,使得web应用的各个部分可以访问等。
2. 监听器分类及用途
接口 | 监听内容 |
ServletContextListener | 监听ServletContext对象的初始化和撤销 |
ServletContextAttributeListener | 监听对ServletContext属性的操作,比如增加、删除、修改 |
HttpSessionListener | 监听Session对象 |
HttpSessionActivationListener | 监听HTTP会话的active和passivate情况,passivate是指非活动的session被写入持久设备(比如硬盘),active相反。 |
HttpSessionAttributeListener | 监听Session中的属性操作 |
ServletRequestListener | 监听Request对象 |
ServletRequestAttributeListener | 监听Requset中的属性操作 |
3. DIY一个监听器
教程来源《Head first Servlet and JSP》,不得不说这是一本令人上瘾的书。第一次正式阅读Haed first系列,只能说这波不亏!
首先,创建一个实力对象Dog
package com.example;
public class Dog {
private String breed;
//构造函数
public Dog(String breed) {
super();
this.breed = breed;
}
public String getBreed() {
return breed;
}
public void setBreed(String breed) {
this.breed = breed;
}
}
然后,创建自己的监听器,需要实现ServletContextListener接口,用户监听ServletContext对象的创建以及撤销操作
package com.example;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void contextInitialized(ServletContextEvent event) {
// TODO Auto-generated method stub
//由事件得到ServletContext
ServletContext sc = event.getServletContext();
//使用上下文得到初始化参数
String dogBreed = sc.getInitParameter("breed");
//new一个Dog出来
Dog d = new Dog(dogBreed);
//使用上下文设置属性
sc.setAttribute("dog", d);
}
}
建立测试类
package com.example;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void contextInitialized(ServletContextEvent event) {
// TODO Auto-generated method stub
//由事件得到ServletContext
ServletContext sc = event.getServletContext();
//使用上下文得到初始化参数
String dogBreed = sc.getInitParameter("breed");
//new一个Dog出来
Dog d = new Dog(dogBreed);
//使用上下文设置属性
sc.setAttribute("dog", d);
}
}
部署web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<!-- 配置servlet -->
<servlet>
<servlet-name>ListenerTester</servlet-name>
<servlet-class>com.example.ListenerTester</servlet-class>
</servlet>
<!-- 配置servlet映射 -->
<servlet-mapping>
<servlet-name>ListenerTester</servlet-name>
<url-pattern>/ListenerTest.do</url-pattern>
</servlet-mapping>
<!-- 配置上下文初始化参数 -->
<context-param>
<param-name>breed</param-name>
<param-value>Great Dane</param-value>
</context-param>
<!-- 配置监听器 -->
<listener>
<listener-class>com.example.MyServletListener</listener-class>
</listener>
</web-app>