java 监听 抛砖引玉 ,汲取百家之长~
-
java的监听 分2种吧 自己总结
1.界面化编程使用(一般C/s架构)
2.网页web编程使用(一般B/s架构)
首先,
关闭
可以直接关闭窗口;点击登录
可以在后台实现用户名、密码的校验,并根据校验结果执行不同的操作。总结起来
事件的监听、处理流程:
事件源、事件、监听器之间的关系:
实例展示:
//事件源: 事件监听器注册方法 + 具体操作,触发事件监听器的handler方法 public class Animal { private String name; private AnimalListener animalListener; public Animal(String name) { this.name = name; } public void addAnimalListener(AnimalListener animalListener) { this.animalListener = animalListener; } public void eat() { System.out.println("我是事件源 —— " + name + " "); animalListener.eatEventHandler(new AnimalEvent(this)); } public String getName() { return name; } public void setName(String name) { this.name = name; } public static void main(String[] args) { Animal dog = new Animal("dog"); // 为事件源添加监听器 AnimalListener listener = new AnimalListener(); dog.addAnimalListener(listener); // 触发事件,会被事件监听器监听到 dog.eat(); } }
//事件: 继承Java自带的EventObject,自己只修改了其构造方法,打印了一些信息。 import java.util.EventObject; public class AnimalEvent extends EventObject { public AnimalEvent(Object source) { super(source); Animal animal = (Animal) source; System.out.println("我是事件 —— " + animal.getName() + " 我现在 在干什么!"); } }
//事件监听器: 实现Java自带的EventListener,创建事件handler(入参为具体的事件)
import java.util.EventListener; import java.util.EventObject; public class AnimalListener implements EventListener { public void eatEventHandler(EventObject eventObject) { // 从事件中获取事件源 Animal source = (Animal) eventObject.getSource(); // 打印事件源的名称 System.out.println("某人在干什么 —— " + source.getName() + " 被我监听到了"); } }
虽然事件、事件源、监听器环环相扣,但是自己更喜欢按照下面的步骤实现事件监听定义事件:事件中将包含事件源(可以通过构造函数设置)
定义监听器:监听器中有事件的handler方法,用于处理对应的事件
定义事件源:包含监听器注册方法、具体的操作(生成事件,触发监听器的handler方法)
关于事件监听器(最后类外监听有说明~)
EventListener是一个没有抽象方法的接口,一般JDK中的监听器接口是存在抽象方法的。
在为事件源注册监听器时,需要创建匿名类并实现对应的抽象方法。
例如,为java swing中的按钮注册监听器的代码如下
button1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
label.setText("按钮被单击了 "+(clicks++)+" 次");
}
});
当然 监听也是一种感念 抽象的
下面是网页型~另一种解释~
监听器是Servlet规范定义的一种特殊的类。
监听器用于监听context、sesstion、request等对象。
监听器用于在事件发生前后作出一些必要的处理操作。
多个监听器,是按照web.xml的配置顺序,逐个启动。
在web应用关闭时候,监听器的销毁,也是按照web.xml配置顺序的逆序进行销毁。
第一类、按照对象:
ServletContext对象监听器
HttpSesstion对象监听器
ServletRequest对象监听器
第二类、按照事件:
1,域对象的创建和销毁事件监听器。
2,域对象属性的创建、替换、消除事件监听器
第三类、绑定到sesstion中某个对象的状态事件监听器。(HttpSessionBindingListener)
ServletContextListener
ServletRequestListener
HttpSessionListener
他们都要实现两个方法:
xxx-Initialized方法、xxx-Destroyed方法
Initialized:初始化 Destroyed:摧毁了
使用实例:
package com.pack.listener; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; /** * Created by mapbar_front on 2019/8/22. */ public class MyServletContextListener implements ServletContextListener { @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { } @Override public void contextInitialized(ServletContextEvent servletContextEvent) { ServletContext servletContext = servletContextEvent.getServletContext(); String appname = servletContext.getInitParameter("app_name"); String version = servletContext.getInitParameter("version"); servletContext.setAttribute("appName", appname); servletContext.setAttribute("version", version); System.out.println("AppName:" + appname + "---------version:" + version); } }
ServletRequestAttributeListener
HttpSessionAttributeListener
要实现这么几个方法
attributeAdded、attributeRemoved、attributeReplaced
使用实例:
package com.pack.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;/**
* Created by mapbar_front on 2019/8/22.
*/
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println(servletContextAttributeEvent.getName()+"-------add: "+ servletContextAttributeEvent.getValue());
}@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println(servletContextAttributeEvent.getName()+"-------removed: "+ servletContextAttributeEvent.getValue());
}@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println(servletContextAttributeEvent.getName()+"-------replace: "+ servletContextAttributeEvent.getValue());
}
}
特殊点:不需要在web.xml中配置。
需要实现的方法:
valueBound、valueUnbound。
valueBound 绑定、valueUnbound 不受约束的。
使用实例:
package com.pack.model;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;/**
* Created by mapbar_front on 2019/8/22.
*/
public class User implements HttpSessionBindingListener {
private String username;
private String password;
@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
String name = httpSessionBindingEvent.getName();
System.out.println("value bound:"+name);
}@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
String name = httpSessionBindingEvent.getName();
System.out.println("value unbound:"+name);
}
}
类外监听。在主类之外创建一个监听类,并且在主类中将监听类传入按钮的 addActionListener()中去。(有点类似)
package testListen;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//java事件处理机制之外部类作为时间监听器
public class fra{
JButton bn;
JFrame f = new JFrame();
public static void main(String args[]){
new fra().fr();
}
public void fr(){
f.setLayout(new FlowLayout());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
bn = new JButton("点击登录");
f.add(bn);
f.getContentPane();
bn.addActionListener(new listener());
f.setBounds(200,200,300,150);
f.setVisible(true);
}
}
class listener implements ActionListener{
public void actionPerformed(ActionEvent e){
System.out.print("监听成功");
}
}
类内 监听。也就是在主类当中就可以监听,来看代码:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class fra1 implements ActionListener{ JButton bn = new JButton("点击登录"); JFrame f = new JFrame(); public static void main(String args[]){ new fra1(); } public fra1(){ f.setLayout(new FlowLayout()); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); bn.addActionListener(this); f.add(bn); f.setBounds(200,200,300,150); f.setVisible(true); } public void actionPerformed(ActionEvent e){ System.out.print("监听成功"); } }
效果一样~
上面都是简单的问题,那人生到底选择感性的爱 还是理性的爱 呢~