• 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

  • 相关阅读:
    215. Kth Largest Element in an Array
    B:魔兽世界之一:备战
    218. The Skyline Problem
    编程作业: 编程作业—类和对象
    239. Sliding Window Maximum
    313. Super Ugly Number
    hdu3068 manacher模板题
    fzu1901 kmp
    hdu2609 最小表示法
    hdu3374 kmp+最小表示法
  • 原文地址:https://www.cnblogs.com/eaglesour/p/9471060.html
Copyright © 2020-2023  润新知