Listener

    还是先把Listener的知识整理成思维导图的形式;便于记忆和整理;



一、监听器简介:

        Listener是JavaWeb三大组件之一------------Servlet、Filter、Listener;这三大组件的共同特点就是都需要实现一个接口,并在web-xml文件中进行配置,所以这三大组件用起来还是相似的。Listener是监听器,就是进行监听的,今天老师举了一个特别形象的例子:

        监听器:       朝阳群众

        监听对象:    明星

        监听的事件: 干坏事

        调用的方法:   报警

总结下来:监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象触发被监听的事件后,监听器某个方法立即被执行。,在JavaWeb项目中,监听器主要监听的是ServletContext,HttpSession,ServletRequest三个域对象的创建与销毁事件,同时还有这些域对象中属性改变的事件。

二、Listener的分类

JavaWeb中的监听器共有三种,共8个监听器
- 生命周期监听器——监听三个生命周期对象的创建和销毁的事件。
- 属性监听器——监听三个对象中属性的变化。
- session对象监听器——将它session中的属性,以及session的活化和钝化。

三、创建监听器的步骤

      1.创建一个类,并实现需要的监听器类型的接口

      2.在web-xml文件中进行配置

1.创建类----以创建一个ServletRequestListener类型的监听器为例:

package com.neuedu.listenner;

import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;

//自定义Listener监听器,实现ServletRequestListener接口
public class servletListener implements ServletRequestListener {
	/*
	 *     实现接口的函数
	 *ServletRequsetlistener 是监听request的监听器
	 *1.当浏览器向服务器发送请求时,会触发监听器的requestInitialized方法
	 *2.当请求结束时,会触发监听器的requestDestroyed方法
	 * 
	 * */
	
	@Override
	public void requestDestroyed(ServletRequestEvent arg0) {
		System.out.println("请求走了")	;
	}

	@Override
	public void requestInitialized(ServletRequestEvent arg0) {
		
		System.out.println("请求来了,我已监听到");	
	}

}

 2.在web-xml文件中进行配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>web-listenner</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
 <!-- 利用全类名向服务器注册一个listener -->
  <listener>
     <listener-class>com.neuedu.listenner.servletListener</listener-class>
  </listener>
</web-app>

 四、生命周期监听器

4.1ServletContextListener(监听当前项目的启动与关闭)
- ServletContext生命周期监听器
- void contextDestroyed(ServletContextEvent sce)
- 该方法在ServletContext对象销毁前调用
 
- void contextInitialized(ServletContextEvent sce)
- 该方法在ServletContext对象创建之后调用。
 
- ServletContextEvent 对象可以获取到ServletContext对象
ServletContextEvent.getServletContext();
 
 

    4.2HttpSessionListener

- HttpSession生命周期监听器
- void sessionCreated(HttpSessionEvent se)
- 该方法在Session创建时调用
 
- void sessionDestroyed(HttpSessionEvent se)
- 在session销毁时调用
 
- HttpSessionEvent
- 可以获取HttpSession对象

     4.3ServletRequestListener(监听浏览器请求的监听器)

- void requestDestroyed(ServletRequestEvent sre)
- 在request对象销毁时调用
 
- void requestInitialized(ServletRequestEvent sre)
- 在request对象创建时调用
 
- ServletRequestEvent
可以获取ServletContext对象和ServletRequest
 
 

五、属性监听器

属性监听器,监听三个域中的属性的变化:添加一个属性,替换一个属性,移除一个属性
 
1. ServletContextAttributeListener(监听整个web应用的属性变化----调用setAttribute或者是removeAttribute的时候)
- 监听ServletContext中的属性的变化
 
void attributeAdded(ServletContextAttributeEvent scab)
- 当向ServletContext中添加属性时调用
 
attributeRemoved(ServletContextAttributeEvent scab)
- 移除属性时调用
 
attributeReplaced(ServletContextAttributeEvent scab)
- 替换一个属性时调用
2.HttpSessionAttributeListener(监听session的属性变化----调用setAttribute或者是removeAttribute的时候)
void attributeAdded(HttpSessionBindingEvent se)
void attributeRemoved(HttpSessionBindingEvent se)
void attributeReplaced(HttpSessionBindingEvent se)
监听器类:
package com.neuedu.listenner;

import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

//自定义一个sessionAttributeListener
public class sessionAttributeListener implements HttpSessionAttributeListener{

	@Override
	public void attributeAdded(HttpSessionBindingEvent arg0) {
		System.out.println("向session中添加属性");
	}
	@Override
	public void attributeRemoved(HttpSessionBindingEvent arg0) {
		System.out.println("移除session中的属性");	
	}
	@Override
	public void attributeReplaced(HttpSessionBindingEvent arg0) {
		System.out.println("替换session中属性");
		
	}

}

servlet类,向session域中添加SetAttribute,使触发监听器

package com.neuedu.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.neuedu.bean.Student;
import com.neuedu.bean.Student2;
import com.sun.org.apache.bcel.internal.generic.NEW;

@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	       request.getSession().setAttribute("username", "火车");
	       request.getSession().removeAttribute("username");
		System.out.println("doGet");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 结果:

 六、session对象监听器

1.HttpSessionBindingListener
> > 该接口由JavaBean来实现,不需要再web.xml文件配置
valueBound(HttpSessionBindingEvent event)
- 当该类的实例,作为属性设置进session域中时调用
valueUnbound(HttpSessionBindingEvent event)
- 当该类的实例,从session域中被移除时调用
 
 
2.HttpSessionActivationListener
> 监听session域中的某类属性,和session一起活化和钝化的事件。
> 该接口由JavaBean来实现,同样不需要再web.xml中配置,但是该JavaBean需要实现Serializable接口!
void sessionDidActivate(HttpSessionEvent se)
- 当前对象和session一起被活化到内存时调用
 
void sessionWillPassivate(HttpSessionEvent se)
- 当前对象和session一起钝化到硬盘时调用
 
 
原文地址:https://www.cnblogs.com/Actexpler-S/p/7376013.html