1. 监听器

Posted eaglesour

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

技术分享图片

 

以上是关于1. 监听器的主要内容,如果未能解决你的问题,请参考以下文章

listview OnItemClick 侦听器在片段中不起作用

JavaFX窗口拖动

设置onclick侦听器在android中无法从一个片段移动到另一个活动[重复]

如何在android中去listview适配器项目点击监听器片段?

java 使手势监听器在片段中可行

片段变得可见时的监听器