还是先把Listener的知识整理成思维导图的形式;便于记忆和整理;
Listener是JavaWeb三大组件之一------------Servlet、Filter、Listener;这三大组件的共同特点就是都需要实现一个接口,并在web-xml文件中进行配置,所以这三大组件用起来还是相似的。Listener是监听器,就是进行监听的,今天老师举了一个特别形象的例子:
监听器: 朝阳群众
监听对象: 明星
监听的事件: 干坏事
调用的方法: 报警
总结下来:监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象触发被监听的事件后,监听器某个方法立即被执行。,在JavaWeb项目中,监听器主要监听的是ServletContext,HttpSession,ServletRequest三个域对象的创建与销毁事件,同时还有这些域对象中属性改变的事件。
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); } }结果:
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