1. 监听器

1.  什么是监听器

  • 监听器也叫Listener,是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。
  • 所谓的监听器,是指对整个web环境的监听,当被见识的对象发生变化时,立即调用相应的方法进行处理。

2.监听器最常见的应用场景:

  • Java SE GUI编程;
  • Android 手机开发编程。

3. 监听器术语

  • 事件源:被监听对象。(目标对象);
  • 监听器对象:用于监听"事件源"的对象;
  • 注册(绑定):将"监听器对象"注册给"事件源"。当"事件源"发生某些行为时,监听对象将被执行;
  • 事件:事件源行为的称呼;
  • 事件对象:在“监听器对象”中获得“事件源”。

4. 监听器的编写流程

  • 编写监听器实现类,需要实现指定的接口;
  • 在web.xml文件配置监听器(部分监听不需要配置);

5. JavaEE规范规定了8个监听器接口用于监听不同的web对象

  • 监听域对象创建与销毁
  • 监听域对象属性变更(添加、替换、删除)
  • 监听session作用域特殊Javabean

6. 域对象监听器

  • ServletRequestListener
  • HttpSessionListener
  • ServletContext

7. 域对象属性监听器(

4大域对象:ServletContext 、Request、Session、PageContext

7.1 作用域属性操作

  setAttribute(k,v)    getAttribute(k)    removeAttribute(k)

7.2 域对象属性变更监听器

  • ServletRequestAttributeListener
  • HttpSessionAttributeListener
  • ServletContextAttributeListener

  7.3 特殊的Javabean监听器(Session作用域)

  • HttpSessionBindingListener
  • HttpSessionActivationListener(钝化和活化)

前面六个监听器需要在web.xml中配置,最后的两个监听器不需要再web.xml中配置

8. 实例

  8.1 ServletRequestListener

  监听request对象创建或销毁,其中request对象的特点如下:

  • 类型:Javax.servlet.http.HttpServletRequest
  • 描述:来自客户端的请求经Servlet容器处理后,由request对象进行封装。注:客户端和服务器的一次通信就是一次请求(发送请求或得到相应)。
  • 作用域:request。说明,这次请求结束后,它的生命周期 就结束了。
  • 举例:
    • 创建ServletRequestListener实现类MyServletRequestListener;
 1 package com.eagle.listener;
 2 
 3 import javax.servlet.ServletRequestEvent;
 4 import javax.servlet.ServletRequestListener;
 5 
 6 public class MyServletRequestListener implements ServletRequestListener {
 7 
 8     public MyServletRequestListener() {
 9         super();
10         System.out.println("request对象的构造方法");
11     }
12 
13     public void requestInitialized(ServletRequestEvent sre) {
14         System.out.println("request创建了!");
15     }
16 
17     public void requestDestroyed(ServletRequestEvent sre) {
18         System.out.println("request对象销毁了!");
19     }
20 
21 }
MyServletRequestListener
    • 在web.xml文件配置监听器。
1   <listener>
2     <listener-class>com.eagle.listener.MyServletRequestListener</listener-class>
3   </listener>
web.xml

服务器启动就先构造了request对象,然后每个页面请求都会触发

MyServletRequestListener.requestInitialized(ServletRequestEvent sre)方法和

MyServletRequestListener.requestDestroyed(ServletRequestEvent sre)方法

  8.2 HttpSessionListener

  • 类型:Javax.servlet.http.HttpSession
  • 描述:表示一个会话,用来保存用户信息,以便跟踪每个用户的状态。(不要用来保存业务数据,request)
  • 定义:是指在一段时间内客户端和服务器之间的一连串的相关的交互过程。
  • 作用域:session。
  • 举例
    • 创建MyHttpSessionListener
 1 package com.eagle.listener;
 2 
 3 import javax.servlet.http.HttpSessionEvent;
 4 import javax.servlet.http.HttpSessionListener;
 5 
 6 public class MyHttpSessionListener implements HttpSessionListener {
 7 
 8     public MyHttpSessionListener() {
 9 
10         super();
11         System.out.println("session对象构造方法");
12     }
13 
14     public void sessionCreated(HttpSessionEvent arg0) {
15         System.out.println("创建session对象");
16     }
17 
18     public void sessionDestroyed(HttpSessionEvent arg0) {
19         System.out.println("销毁session对象");
20     }
21 
22 }
MyHttpSessionListener
    • 创建servlet CreateSession
 1 package com.eagle.web;
 2 
 3 import java.io.IOException;
 4 import javax.servlet.ServletException;
 5 import javax.servlet.http.HttpServlet;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 import javax.servlet.http.HttpSession;
 9 
10 public class CreateSession extends HttpServlet {
11 
12     private static final long serialVersionUID = 1L;
13 
14     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
15         request.setCharacterEncoding("utf-8");
16         response.setContentType("text/html;charset=utf-8"); 
17         HttpSession httpSession = request.getSession();
18         httpSession.setMaxInactiveInterval(10);
19         String id = httpSession.getId();
20         if(httpSession.isNew()) {
21             httpSession.setAttribute("name", "狼");        
22             String name = (String) httpSession.getAttribute("name");
23             response.getWriter().print("恭喜session创建成功,sessionid="+id+";name="+name);
24         }else {
25             String name = (String) httpSession.getAttribute("name");
26             response.getWriter().print("服务器已经存在session了,sessionid="+id+";name="+name);
27         }
28     }
29 
30     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
31         doGet(request, response);
32     }
33 }
CreateSession
    • web.xml文件中配置监听器
1   <listener>
2     <listener-class>com.eagle.listener.MyHttpSessionListener</listener-class>
3   </listener>
web.xml

 

  8.3 servletContextListener

  • 类型:javax.servlet.ServletContext
  • 描述:从servlet配置对象获得的servlet上下文
  • 作用域:application
  • 这个对象的生命周期是最长的。服务器启动的时候就会创建application对象。从服务器存在到服务器终止,都一直存在,且只保留一个对象,所有用户共享一个application。不是很常用。
  • 举例:
    • 创建MyServletContextListener监听器
 1 package com.eagle.listener;
 2 
 3 import javax.servlet.ServletContextEvent;
 4 import javax.servlet.ServletContextListener;
 5 
 6 public class MyServletContextListener implements ServletContextListener {
 7 
 8     public MyServletContextListener() {
 9         System.out.println("ServletContext对象构建!");
10     }
11 
12     public void contextInitialized(ServletContextEvent sce) {
13         System.out.println("ServletContext对象初始化!");
14     }
15     
16     public void contextDestroyed(ServletContextEvent sce) {
17         System.out.println("ServletContext对象销毁!");
18     }
19 }
MyServletContextListener
    • 在web.xml文件中配置监听器
1  <listener>
2       <listener-class>com.eagle.listener.MyServletContextListener</listener-class>
3   </listener>
web.xml

 ./shutdown.sh   //停止Apache服务

  

  8.4 ServletRequestAttributeListener

  • 编写servlet    ServletRequestAttribute;
 1 package com.eagle.web;
 2 
 3 import java.io.IOException;
 4 import javax.servlet.ServletException;
 5 import javax.servlet.http.HttpServlet;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 
 9 public class ServletRequestAttribute extends HttpServlet {
10 
11     private static final long serialVersionUID = 1L;
12 
13     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
14         // 编码
15         request.setCharacterEncoding("utf-8");
16         response.setContentType("text/html;charset=utf-8");
17         request.setAttribute("name", "first");
18         String name = (String) request.getAttribute("name");
19         response.getWriter().print("name="+name);
20         request.removeAttribute("name");
21     }
22 
23     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
24         doGet(request, response);
25     }
26 }
ServletRequestAttribute
  • 编写ServletRequestAttributeListener;
 1 package com.eagle.listener;
 2 
 3 import javax.servlet.ServletRequestAttributeEvent;
 4 import javax.servlet.ServletRequestAttributeListener;
 5 
 6 public class MyRequestAttribute implements ServletRequestAttributeListener {
 7 
 8     public MyRequestAttribute() {
 9         super();
10         System.out.println("requestattribute初始化!");
11     }
12 
13     public void attributeAdded(ServletRequestAttributeEvent sre) {
14         System.out.println("request对象添加了新属性!");
15     }
16 
17     public void attributeRemoved(ServletRequestAttributeEvent sre) {
18         System.out.println("reqeust对象移除了属性!");
19     }
20 
21     public void attributeReplaced(ServletRequestAttributeEvent sre) {
22         System.out.println("request修改了属性!");
23     }
24 
25 }
MyRequestAttribute
  • 配置web.xml。
<listener>
    <listener-class>com.eagle.listener.MyRequestAttribute</listener-class>
  </listener>
web.xml

  8.5 HttpSessionAttributeListener

  • 编写servlet
 1 package com.eagle.web;
 2 
 3 import java.io.IOException;
 4 import javax.servlet.ServletException;
 5 import javax.servlet.http.HttpServlet;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 import javax.servlet.http.HttpSession;
 9 
10 public class SessionAttribute extends HttpServlet {
11 
12     private static final long serialVersionUID = 1L;
13 
14     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
15         HttpSession session = request.getSession();
16         session.setAttribute("name", "first");
17         session.setAttribute("name", "second");
18         session.getAttribute("name");
19         session.removeAttribute("name");
20         response.getWriter().write("hello haohao...");
21     }
22 
23     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
24         doGet(request, response);
25     }
26 }
SessionAttribute
  • 编写HttpSessionAttributeListener
 1 package com.eagle.listener;
 2 
 3 import javax.servlet.http.HttpSessionAttributeListener;
 4 import javax.servlet.http.HttpSessionBindingEvent;
 5 
 6 public class MySessionAttributeListener implements HttpSessionAttributeListener {
 7 
 8     public MySessionAttributeListener() {
 9         super();
10         System.out.println("sessionAttributeListener初始化!");
11     }
12 
13     public void attributeAdded(HttpSessionBindingEvent hbe) {
14         System.out.println("sessionAttributeListener 添加了新属性!");
15     }
16 
17     public void attributeRemoved(HttpSessionBindingEvent hbe) {
18         System.out.println("sessionAttributeListener 移除了属性!");
19     }
20 
21     public void attributeReplaced(HttpSessionBindingEvent hbe) {
22         System.out.println("sessionAttributeListener 修改了属性!");
23     }
24 
25 }
MySessionAttributeListener
  • 配置web.xml
1   <listener>
2     <listener-class>com.eagle.listener.MySessionAttributeListener</listener-class>
3   </listener>
web.xml

注:设置session引发request属性修改监听器

  8.6 ServletContextAttributeListener

  • 编写servlet
 1 package com.eagle.web;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.ServletContext;
 6 import javax.servlet.ServletException;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 public class ServletContextAttribute extends HttpServlet {
12 
13     private static final long serialVersionUID = 1L;
14 
15     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
16         ServletContext servletContext = request.getServletContext();
17         servletContext.setAttribute("name", "first");
18         servletContext.setAttribute("name", "second");
19         servletContext.removeAttribute("name");
20         response.getWriter().write("hello haohao...");
21     }
22 
23     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
24         doGet(request, response);
25     }
26 }
ServletContextAttribute
  • 编写ServletContextAttributeListener
 1 package com.eagle.listener;
 2 
 3 import javax.servlet.ServletContextAttributeEvent;
 4 import javax.servlet.ServletContextAttributeListener;
 5 
 6 public class MyServletContextAttributeListener implements ServletContextAttributeListener {
 7 
 8     public MyServletContextAttributeListener() {
 9         super();
10         System.out.println("ServletContextAttributeListener对象构造!");
11     }
12 
13     public void attributeAdded(ServletContextAttributeEvent sce) {
14         System.out.println("ServletContextAttributeListener对象添加属性!");
15     }
16 
17     public void attributeReplaced(ServletContextAttributeEvent sce) {
18         System.out.println("ServletContextAttributeListener对象修改属性!");
19     }
20 
21     public void attributeRemoved(ServletContextAttributeEvent sce) {
22         System.out.println("ServletContextAttributeListener对象移除属性!");
23     }
24 }
MyServletContextAttributeListener
  • 配置web.xml
1   <listener>
2     <listener-class>com.eagle.listener.MyServletContextAttributeListener</listener-class>
3   </listener>
web.xml

  

  8.7 HttpSessionBindingListener

  • 编写servlet
 1 package com.eagle.web;
 2 
 3 import java.io.IOException;
 4 import javax.servlet.ServletException;
 5 import javax.servlet.http.HttpServlet;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 import javax.servlet.http.HttpSession;
 9 
10 import com.eagle.listener.MyHttpSessionBindingListener;
11 
12 public class ServletHttpSessionBindingListener extends HttpServlet {
13 
14     private static final long serialVersionUID = 1L;
15 
16     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
17         MyHttpSessionBindingListener ml = new MyHttpSessionBindingListener();
18         HttpSession hs = request.getSession();
19         hs.setAttribute("ml", ml);
20         hs.invalidate();
21         response.getWriter().write("hello haohao...");
22     }
23 
24     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
25         doGet(request, response);
26     }
27 }
ServletHttpSessionBindingListener
  • 编写HttpSessionBindingListener
 1 package com.eagle.listener;
 2 
 3 import javax.servlet.http.HttpSessionBindingEvent;
 4 import javax.servlet.http.HttpSessionBindingListener;
 5 
 6 public class MyHttpSessionBindingListener implements HttpSessionBindingListener {
 7 
 8     public MyHttpSessionBindingListener() {
 9         super();
10         System.out.println("httpSessionBindingListening对象初始化");
11     }
12 
13     public void valueBound(HttpSessionBindingEvent hse) {
14         System.out.println("httpSessionBindingListening对象绑定!");
15     }
16 
17     public void valueUnbound(HttpSessionBindingEvent hse) {
18         System.out.println("httpSessionBindingListening对象解绑!");
19     }
20 
21 }
MyHttpSessionBindingListener

  8.8 HttpSessionActivationListener

   参照:https://www.cnblogs.com/eaglesour/p/9474540.html

原文地址:https://www.cnblogs.com/eaglesour/p/9471060.html