Listener

mac2022-06-30  86

    还是先把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

最新回复(0)