还是先把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一起钝化到硬盘时调用