一、监听器
1、作用
Web可以通过监听器监听域对象的创建和销毁 ServletContext,Session,Request, 属性变更,javabean对象在session中的状态变更(绑定,解绑)
2、意义
观察服务器性能,粗略估计网站的当前的访问人数,网站并发量...
二、第一类监听器的使用
1、什么是第一类监听器
监听域对象的创建和销毁,这种监听器有实际应用意义
2、web.xml中配置监听器
<listener>
<listener-class>cn.itcast.testListener.MyListener001</listener-class>
</listener>
3、监听 servletContext 的生命周期
package cn.itcast.testListener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
//测试ServletContext的创建和销毁
//Servletcontext服务器启动就创建
//Servletcontext服务器停止就销毁
public class MyListener001 implements ServletContextListener {
public MyListener001() {
System.out.println("构造函数");
}
/**
* 初始化时执行的方法
*/
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext被创建了");
ServletContext servletContext = sce.getServletContext();
System.out.println(servletContext.hashCode());
//此处的代码在服务器启动必须执行,类似于javaSe main函数所在类中的static代码段
//监听ServletContext的应用场景:
//当我们自己定义设置了配置文件之后,希望在项目启动就将配置文件中的信息读取到,可以将读取配置文件的代码放置在此处
//servletContext.setAttribute("", "");
}
/**
* 销毁时执行的方法
*/
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext被销毁了");
ServletContext servletContext = sce.getServletContext();
System.out.println(servletContext.hashCode());
}
}
4、监听 Session 的创建销毁
package cn.itcast.testListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
// request.getSession();
//session何时被创建? 服务端首次碰到request.getSession();
//session何时被销毁? 1_超时 2_session.invalidate(); 3_非正常停止服务器
public class MyListener002 implements HttpSessionListener {
public MyListener002() {
}
public void sessionCreated(HttpSessionEvent se) {
System.out.println("sessin被创建");
System.out.println(se.getSession());
}
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("sessin被销毁");
se.getSession();
}
}
5、监听 Request 的创建销毁
package cn.itcast.testListener;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
//request何时创建? 只要对服务端发起请求(serlvet/jsp/html/css/js/png),request就会被创建
public class MyListener003 implements ServletRequestListener {
public MyListener003() {
}
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("request销毁");
}
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("request创建");
ServletRequest servletRequest = sre.getServletRequest();
HttpServletRequest req = (HttpServletRequest) servletRequest;
// day41/BuyServlet
req.getRequestURL();
}
}
三、第二类监听器的使用
1、什么是第二类监听器
监听域对象中属性的变更,没有实际应用 意义,看懂即可
2、监听 servletContext 中域对象属性的变更
package cn.itcast.testListener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
/**
*
* @Description: 监听servletContext中域对象属性的变更
* @author wingzhe
* @date 2017年7月14日 上午10:35:40
* @version V1.0
*/
public class MyListener004 implements ServletContextAttributeListener {
public MyListener004() {
}
/*
* 添加属性
*/
public void attributeAdded(ServletContextAttributeEvent scab) {
System.out.println("servletcontext中被添加了属性");
}
public void attributeReplaced(ServletContextAttributeEvent scab) {
System.out.println("servletcontext中的属性被替换了");
}
public void attributeRemoved(ServletContextAttributeEvent scab) {
System.out.println("servletcontext中的属性被移除了");
}
}
3、监听 Session 中属性的变更
package cn.itcast.testListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
/**
*
* @Description: 监听session中属性的变更
* @author wingzhe
* @date 2017年7月14日 上午10:41:00
* @version V1.0
*/
public class MyListener005 implements HttpSessionAttributeListener {
public MyListener005() {
}
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("session中的属性被移除了");
}
public void attributeAdded(HttpSessionBindingEvent se) {
System.out.println("session中的属性被增加了");
}
public void attributeReplaced(HttpSessionBindingEvent se) {
System.out.println("session中的属性被替换了");
}
}
4、监听 request 中属性的变更
package cn.itcast.testListener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
/**
*
* @Description: 监听request中属性的变更
* @author wingzhe
* @date 2017年7月14日 上午10:41:36
* @version V1.0
*/
public class MyListener006 implements ServletRequestAttributeListener {
public MyListener006() {
}
public void attributeAdded(ServletRequestAttributeEvent srae) {
System.out.println("request中的属性被添加了");
}
public void attributeRemoved(ServletRequestAttributeEvent srae) {
System.out.println("request中的属性被移除了");
}
public void attributeReplaced(ServletRequestAttributeEvent srae) {
System.out.println("request中的属性被替换了");
}
}
四、第三类监听器
1、作用
监听 JavaBean 对象在 session 中状态的变更,包括绑定和解绑
2、应用
package cn.itcast.testListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
/**
*
* @Description: 监听javaBean在session中状态变更
* @author wingzhe
* @date 2017年7月14日 上午10:57:32
* @version V1.0
*/
public class MyListener007 implements HttpSessionBindingListener {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public MyListener007() {
}
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("bean对象被解绑了");
}
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("bean对象被绑定了");
}
}
<%
MyListener007 ml=new MyListener007();
ml.setName("jack");
//将JAVABEAN对象绑定在session中
session.setAttribute("demo", ml);
//将JAVABEAN对象从session移除
session.removeAttribute("demo");
%>
3、测试JavaBean 对象的钝化活化
package cn.itcast.testListener;
import java.io.Serializable;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
//测试JAVABean对象的钝化和活化
//钝化:当session被保存到硬盘上的时候,session中关联的JAVABean对象也应该被保存到硬盘上,这个过程钝化
//活化:当session从硬盘上加载到内存中的时候,session中关联的JAVABean对象也应该被加载到内存,,这个过程活化
//如果想让某个JAVABEAN对象被持久化,这个JAVABEAND对象必须实现序列化接口
public class MyListener008 implements HttpSessionActivationListener, Serializable {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public MyListener008() {
}
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("javaBean对象被活化了");
}
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("javaBean对象被钝化了");
}
}
<%
MyListener008 ml=new MyListener008();
ml.setName("jack");
//将JAVABEAN对象绑定在session中
session.setAttribute("user", ml);
%>