深入分析JavaWeb Item38 -- 监听器(Listener)快速学习_item监听器 java(1)

* @Description: 设计Person的行为:跑
* @Anthor:孤傲苍狼
*
*/
public void run() {
if (listener != null) {
/**
* 调用监听器的dorun方法监听Person类对象run(跑)这个动作,将事件对象Event传递给doeat方法,
* 事件对象封装了事件源,new Event(this)中的this代表的就是事件源
*/
listener.dorun(new Event(this));
}
}

/\*\*

* @Method: registerListener
* @Description: 这个方法是用来注册对Person类对象的行为进行监听的监听器
* @Anthor:孤傲苍狼
*
* @param listener
*/
public void registerListener(PersonListener listener) {
this.listener = listener;
}
}

/**
* @ClassName: PersonListener(事件监听器)
* @Description: 设计Person类(事件源)的监听器接口
* @author: 孤傲苍狼
* @date: 2014-9-9 下午9:28:06
*
*/
interface PersonListener {

/\*\*

* @Method: doeat
* @Description: 这个方法是用来监听Person对象eat(吃)这个行为动作,
* 当实现类实现doeat方法时就可以监听到Person类对象eat(吃)这个动作
* @Anthor:孤傲苍狼
*
* @param e
*/
void doeat(Event e);

/\*\*

* @Method: dorun
* @Description: 这个方法是用来监听Person对象run(跑)这个行为动作,
* 当实现类实现dorun方法时就可以监听到Person类对象run(跑)这个动作
* @Anthor:孤傲苍狼
*
* @param e
*/
void dorun(Event e);

}

/**
* @ClassName: Event(事件对象)
* @Description:设计事件类,用来封装事件源
* @author: 孤傲苍狼
* @date: 2014-9-9 下午9:37:56
*
*/
class Event {

/\*\*

* @Field: source
* 事件源(Person就是事件源)
*/
private Person source;

public Event() {

}

public Event(Person source) {
    this.source = source;
}

public Person getSource() {
    return source;
}

public void setSource(Person source) {
    this.source = source;
}

}


  经过这样的设计之后,Peron类的对象就是可以被其他对象监听了。测试代码如下:



package me.gacl.observer;

public class PersonTest {

/\*\*

* @Method: main
* @Description: 测试Person类
* @Anthor:孤傲苍狼
*
* @param args
*/
public static void main(String[] args) {
//
Person p = new Person();
//注册监听p对象行为的监听器
p.registerListener(new PersonListener() {
//监听p吃东西这个行为
public void doeat(Event e) {
Person p = e.getSource();
System.out.println(p + “在吃东西”);
}
//监听p跑步这个行为
public void dorun(Event e) {
Person p = e.getSource();
System.out.println(p + “在跑步”);
}
});
//p在吃东西
p.eat();
//p在跑步
p.run();
}
}


运行结果:


  me.gacl.observer.Person@4a5ab2在吃东西   
   me.gacl.observer.Person@4a5ab2在跑步


### 二、JavaWeb中的监听器


##### **2.1、基本概念**


  JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。


##### **2.2、Servlet监听器的分类**


  在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为**ServletContext**,**HttpSession**和**ServletRequest**这三个域对象   
   Servlet规范针对这三个对象上的操作,又把多种类型的监听器划分为三种类型:


* 监听域对象自身的创建和销毁的事件监听器。
* 监听域对象中的属性的增加和删除的事件监听器。
* 监听绑定到HttpSession域中的某个对象的状态的事件监听器。


##### **2.3、监听ServletContext域对象的创建和销毁**


  ServletContextListener接口用于监听ServletContext对象的创建和销毁事件。实现了ServletContextListener接口的类都可以对ServletContext对象的创建和销毁进行监听。


* 当ServletContext对象被创建时,激发contextInitialized (ServletContextEvent sce)方法。
* 当ServletContext对象被销毁时,激发contextDestroyed(ServletContextEvent sce)方法。
* ServletContext域对象创建和销毁时机:   
     创建:服务器启动针对每一个Web应用创建ServletContext   
     销毁:服务器关闭前先关闭代表每一个web应用的ServletContext


范例:编写一个MyServletContextListener类,实现ServletContextListener接口,监听ServletContext对象的创建和销毁


  **1、编写监听器**,代码如下:



package me.gacl.web.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
* @ClassName: MyServletContextListener
* @Description: MyServletContextListener类实现了ServletContextListener接口,
* 因此可以对ServletContext对象的创建和销毁这两个动作进行监听。
* @author: 孤傲苍狼
* @date: 2014-9-9 下午10:26:16
*
*/
public class MyServletContextListener implements ServletContextListener {

@Override
public void contextInitialized(ServletContextEvent sce) {
    System.out.println("ServletContext对象创建");
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
    System.out.println("ServletContext对象销毁");
}

}


  **2、在web.xml文件中注册监听器**


  我们在上面的中讲到,要想监听事件源,那么必须将监听器注册到事件源上才能够实现对事件源的行为动作进行监听,在JavaWeb中,监听的注册是在web.xml文件中进行配置的,如下:



<?xml version="1.0" encoding="UTF-8"?>




index.jsp

ServletContextListener监听器 me.gacl.web.listener.MyServletContextListener ```

经过这两个步骤,我们就完成了监听器的编写和注册,Web服务器在启动时,就会自动把在web.xml中配置的监听器注册到ServletContext对象上,这样开发好的MyServletContextListener监听器就可以对ServletContext对象进行监听了。

2.4、监听HttpSession域对象的创建和销毁

HttpSessionListener 接口用于监听HttpSession对象的创建和销毁
  创建一个Session时,激发sessionCreated (HttpSessionEvent se) 方法
  销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se) 方法。

范例:编写一个MyHttpSessionListener类,实现HttpSessionListener接口,监听HttpSession对象的创建和销毁

1、编写监听器,代码如下:

package me.gacl.web.listener;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/\*\*
\* @ClassName: MyHttpSessionListener
\* @Description: MyHttpSessionListener类实现了HttpSessionListener接口,
\* 因此可以对HttpSession对象的创建和销毁这两个动作进行监听。
\* @author: 孤傲苍狼
\* @date: 2014-9-9 下午11:04:33
\*
\*/ 
public class MyHttpSessionListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println( se.getSession() + "创建了!!");
    }

    /\* HttpSession的销毁时机需要在web.xml中进行配置,如下:
 \* <session-config>
 <session-timeout>1</session-timeout>
 </session-config>
 这样配置就表示session在1分钟之后就被销毁
 \*/
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("session销毁了!!");
    }
}

2、在web.xml文件中注册监听器

<!--注册针对HttpSession对象进行监听的监听器-->
   <listener>
      <description>HttpSessionListener监听器</description>
      <listener-class>me.gacl.web.listener.MyHttpSessionListener</listener-class>
  </listener>
  <!-- 配置HttpSession对象的销毁时机 -->
  <session-config>
      <!--配置HttpSession对象的1分钟之后销毁 -->
      <session-timeout>1</session-timeout>
  </session-config>

当我们访问jsp页面时,HttpSession对象就会创建,此时就可以在HttpSessionListener观察到HttpSession对象的创建过程了,我们可以写一个jsp页面观察HttpSession对象创建的过程。

如下:index.jsp

<%@ page language="java" import="java.util.\*" pageEncoding="UTF-8" %>

<!DOCTYPE HTML>
<html>
  <head>
    <title>HttpSessionListener监听器监听HttpSession对象的创建</title>
  </head>

  <body>
       一访问JSP页面,HttpSession就创建了,创建好的Session的Id是:${pageContext.session.id}
  </body>
</html>


### 结尾

学习html5、css、javascript这些基础知识,学习的渠道很多,就不多说了,例如,一些其他的优秀博客。但是本人觉得看书也很必要,可以节省很多时间,常见的javascript的书,例如:javascript的高级程序设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。

**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/topics/618166371)**

![html5](https://img-blog.csdnimg.cn/img_convert/d35c2cf2d5364b4907e65f1856c923a4.png)

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值