javaweb学习总结(四十四)——监听器(Listener)学习

1.2、监听器案例——监听window窗口的事件监听器

1 package me.gacl.listener.demo;

2

3 import java.awt.Frame;

4 import java.awt.event.WindowEvent;

5 import java.awt.event.WindowListener;

6

7 public class Demo1 {

8

9 /**

10 *java的事件监听机制

11 *1、事件监听涉及到三个组件:事件源、事件对象、事件监听器

12 *2、当事件源上发生某一个动作时,它会调用事件监听器的一个方法,并在调用该方法时把事件对象传递进去,

13 * 开发人员在监听器中通过事件对象,就可以拿到事件源,从而对事件源进行操作。

14 */15 public static void main(String[] args) {

16

17 Frame f = new Frame();

18 f.setSize(400, 400);

19 f.setVisible(true);

20

21 //注册事件监听器22 f.addWindowListener(new WindowListener(){

23

24 public void windowActivated(WindowEvent e) {

25

26 }

27

28 public void windowClosed(WindowEvent e) {

29

30 }

31

32 /**

33 * 当window窗体关闭时就会WindowListener这个监听器监听到,

34 * 监听器就会调用windowClosing方法处理window窗体关闭时的动作

35 */36 public void windowClosing(WindowEvent e) {

37 //通过事件对象e来获取事件源对象38 Frame f = (Frame) e.getSource();

39 System.out.println(f+“窗体正在关闭”);

40 f.dispose();

41 }

42

43 public void windowDeactivated(WindowEvent e) {

44

45 }

46

47 public void windowDeiconified(WindowEvent e) {

48

49 }

50

51 public void windowIconified(WindowEvent e) {

52

53 }

54

55 public void windowOpened(WindowEvent e) {

56

57 }

58 });

59 }

60 }

1.3、设计一个可以被别的对象监听的对象

我们平时做开发的时候,我们是写监听器去监听其他对象,那么我们如果想设计一个对象,让这个对象可以被别的对象监听又该怎么做呢,可以按照严格的事件处理模型来设计一个对象,这个对象就可以被别的对象监听,事件处理模型涉及到三个组件:事件源、事件对象、事件监听器。

下面我们来按照事件处理模型来设计一个Person对象,具体代码如下:

1 package me.gacl.observer;

2

3 /** 4 * @ClassName: Person(事件源)

5 * @Description: 设计一个Person类作为事件源,这个类的对象的行为(比如吃饭、跑步)可以被其他的对象监听

6 * @author: 孤傲苍狼

7 * @date: 2014-9-9 下午9:26:06

8 *

9 */

10 public class Person {

11 /** 12 * @Field: listener

13 * 在Person类中定义一个PersonListener变量来记住传递进来的监听器

14 */

15 private PersonListener listener;

16

17 /** 18 * @Method: eat

19 * @Description: 设计Person的行为:吃

20 * @Anthor:孤傲苍狼

21 *

22 */

23 public void eat() {

24 if (listener != null) {

25 /**

必看视频!获取2024年最新Java开发全套学习资料 备注Java

26 * 调用监听器的doeat方法监听Person类对象eat(吃)这个动作,将事件对象Event传递给doeat方法,

27 * 事件对象封装了事件源,new Event(this)中的this代表的就是事件源

28 */ 29 listener.doeat(new Event(this));

30 }

31 }

32

33 /** 34 * @Method: run

35 * @Description: 设计Person的行为:跑

36 * @Anthor:孤傲苍狼

37 *

38 */

39 public void run() {

40 if (listener != null) {

41 /** 42 * 调用监听器的dorun方法监听Person类对象run(跑)这个动作,将事件对象Event传递给doeat方法,

43 * 事件对象封装了事件源,new Event(this)中的this代表的就是事件源

44 */ 45 listener.dorun(new Event(this));

46 }

47 }

48

49 /** 50 * @Method: registerListener

51 * @Description: 这个方法是用来注册对Person类对象的行为进行监听的监听器

52 * @Anthor:孤傲苍狼

53 *

54 * @param listener

55 */

56 public void registerListener(PersonListener listener) {

57 this.listener = listener;

58 }

59 }

60

61 /** 62 * @ClassName: PersonListener(事件监听器)

63 * @Description: 设计Person类(事件源)的监听器接口

64 * @author: 孤傲苍狼

65 * @date: 2014-9-9 下午9:28:06

66 *

67 */

68 interface PersonListener {

69

70 /** 71 * @Method: doeat

72 * @Description: 这个方法是用来监听Person对象eat(吃)这个行为动作,

73 * 当实现类实现doeat方法时就可以监听到Person类对象eat(吃)这个动作

74 * @Anthor:孤傲苍狼

75 *

76 * @param e

77 */

78 void doeat(Event e);

79

80 /** 81 * @Method: dorun

82 * @Description: 这个方法是用来监听Person对象run(跑)这个行为动作,

83 * 当实现类实现dorun方法时就可以监听到Person类对象run(跑)这个动作

84 * @Anthor:孤傲苍狼

85 *

86 * @param e

87 */

88 void dorun(Event e);

89

90 }

91

92 /** 93 * @ClassName: Event(事件对象)

94 * @Description:设计事件类,用来封装事件源

95 * @author: 孤傲苍狼

96 * @date: 2014-9-9 下午9:37:56

97 *

98 */

99 class Event {

100

101 /**102 * @Field: source

103 * 事件源(Person就是事件源)

104 */

105 private Person source;

106

107 public Event() {

108

109 }

110

111 public Event(Person source) {

112 this.source = source;

113 }

114

115 public Person getSource() {

116 return source;

117 }

118

119 public void setSource(Person source) {

120 this.source = source;

121 }

122 }

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

1 package me.gacl.observer;

2

3 public class PersonTest {

4

5 /** 6 * @Method: main

7 * @Description: 测试Person类

8 * @Anthor:孤傲苍狼

9 *

10 * @param args

11 */12 public static void main(String[] args) {

13 //

14 Person p = new Person();

15 //注册监听p对象行为的监听器16 p.registerListener(new PersonListener() {

17 //监听p吃东西这个行为18 public void doeat(Event e) {

19 Person p = e.getSource();

20 System.out.println(p + “在吃东西”);

21 }

22 //监听p跑步这个行为23 public void dorun(Event e) {

24 Person p = e.getSource();

25 System.out.println(p + “在跑步”);

26 }

27 });

28 //p在吃东西29 p.eat();

30 //p在跑步31 p.run();

32 }

33 }

运行结果:

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规范针对这三个对象上的操作,又把多种类型的监听器划分为三种类型:

  1. 监听域对象自身的创建和销毁的事件监听器。

  2. 监听域对象中的属性的增加和删除的事件监听器。

  3. 监听绑定到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、编写监听器,代码如下:

1 package me.gacl.web.listener;

2

3 import javax.servlet.ServletContextEvent;

4 import javax.servlet.ServletContextListener;

5

6 /** 7 * @ClassName: MyServletContextListener

8 * @Description: MyServletContextListener类实现了ServletContextListener接口,

9 * 因此可以对ServletContext对象的创建和销毁这两个动作进行监听。

10 * @author: 孤傲苍狼

11 * @date: 2014-9-9 下午10:26:16

12 *

13 */

14 public class MyServletContextListener implements ServletContextListener {

15

16 @Override

17 public void contextInitialized(ServletContextEvent sce) {

18 System.out.println(“ServletContext对象创建”);

19 }

20

21 @Override

22 public void contextDestroyed(ServletContextEvent sce) {

23 System.out.println(“ServletContext对象销毁”);

24 }

25 }

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

最后

很多程序员,整天沉浸在业务代码的 CRUD 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。

我把私藏的这套并发体系的笔记和思维脑图分享出来,理论知识与项目实战的结合,我觉得只要你肯花时间用心学完这些,一定可以快速掌握并发编程。

不管是查缺补漏还是深度学习都能有非常不错的成效,需要的话记得帮忙点个赞支持一下

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值