监听监听~


 

监听监听~_第1张图片

 


监听监听~_第2张图片

 


监听监听~_第3张图片

 


 java 监听 抛砖引玉 ,汲取百家之长~

-

java的监听 分2种吧 自己总结 

1.界面化编程使用(一般C/s架构)

2.网页web编程使用(一般B/s架构)

首先

  • 进行过Java图形界面编程的同学会发现,各种控件的点击、打开、关闭等操作,都注册了对应的事件监听器,并可以根据不同的事件执行不同操作。
  • 例如,同样是button,点击 关闭 可以直接关闭窗口;点击登录可以在后台实现用户名、密码的校验,并根据校验结果执行不同的操作。
  • 在上面的例子中:button是事件源,点击操作是事件,事件发生后,根据事件执行不同的操作(关闭窗口、校验用户名及密码),这是监听器的行为。

总结起来

  • 事件源:执行某些操作时,产生事件;事件源中注册了监听器,将产生的事件传给监听器,由监听器处理事件
  • 事件:由事件源执行某些操作时产生,事件中包含事件源,这样监听器可以根据事件源执行特定的处理操作
  • 监听器:很多事件的处理方法,根据事件或事件源,执行不同操作

 事件的监听、处理流程:

 

 事件源、事件、监听器之间的关系:

  • 事件源通过事件监听器注册方法,为自身添加事件监听器
  • 事件监听器中,实现了事件的handler方法:根据传入的事件或事件的事件源,执行具体操作
  • 事件源的某个动作,将(主动)触发事件监听器的handler方法处理事件

实例展示:

     

//事件源: 事件监听器注册方法 + 具体操作,触发事件监听器的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++)+" 次");
            }
        }

);


监听监听~_第4张图片


 当然 监听也是一种感念 抽象的

下面是网页型~另一种解释~

什么是Java监听器

  • 监听器是Servlet规范定义的一种特殊的类。

  • 监听器用于监听context、sesstion、request等对象。

  • 监听器用于在事件发生前后作出一些必要的处理操作。

应用场景

  • 1,统计在线人数
  • 2,页面访问量统计
  • 3,应用启动时的初始化工作
  • 4,Spring结合

监听器实现

  • 编写java代码,实现监听器接口
  • 在web.xml中注册监听器

监听器执行顺序

  • 多个监听器,是按照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);
    }
}

属性监听器


ServletContextAttributeListener

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());
    }
}

HttpSessionBindingListener监听器

特殊点:不需要在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);
    }
}
 

监听监听~_第5张图片

最后 还有:

 类外监听。在主类之外创建一个监听类,并且在主类中将监听类传入按钮的 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("监听成功");
    }
}

监听监听~_第6张图片

 类内 监听。也就是在主类当中就可以监听,来看代码:

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("监听成功");
    }
}

效果一样~

监听监听~_第7张图片

上面都是简单的问题,那人生到底选择感性的爱 还是理性的爱 呢~

你可能感兴趣的:(灌篮高手,网络)