监听器

监听器

监听器存在以下对象

监听者:XxxxxListener - 所的监听者是的接口。

被监听者 :任意对象都可以成为被监听者 - 早已经存在。

监听到的事件:XxxxEvent- 永远是一个具体类,用来放监听到的数据里面都有一个方法叫getSource() – 返回的是监听到对象。

观察者模式
package cn.itcast.demo;

public class MyFrame extends JFrame {

    public MyFrame() {

        JButton btn = new JButton("你好");

        System.err.println("btn: is:"+btn.hashCode());

        btn.addActionListener(new MyListener());

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //获取容器

        Container con= getContentPane();

        //设置布局

        con.setLayout(new FlowLayout());

        con.add(btn);

        

        setSize(300, 300);

        setVisible(true);

    }

    public static void main(String[] args) {

        new MyFrame();

    }

    //实现一个监听者

    class MyListener implements ActionListener{

        //监听方法

        public void actionPerformed(ActionEvent e) {

            System.err.println("我监听到了:"+e.getSource().hashCode());

        }

    }

}

 

package cn.itcast.demo;

public class TestObersver {

    public static void main(String[] args) {

        Person person = new Person();//声明被观察者

        System.err.println("pp:"+person);

        person.addPersonListener(new PersonListener() {

            public void running(PersonEvent pe) {

                System.err.println("你正在跑....."+pe.getSource());

                throw new RuntimeException("他跑了。。。");

            }

        });

        person.run();

    }

}

class Person{

    private PersonListener pl;

    public void addPersonListener(PersonListener pl){

        this.pl = pl;

    }

    public void run(){

        if(pl!=null){

            pl.running(new PersonEvent(this));

        }

        System.err.println("我正在跑步......");

    }

}

interface PersonListener{

    void running(PersonEvent pe);

}

class PersonEvent{

    private Object src;

    public PersonEvent(Object obj) {

        this.src=obj;

    }

    public Object getSource(){

        return src;

    }

}
在JavaWeb中的监听器分类

在Javaweb中存在三个被监听对象:

HttpServletRequest

HttpSessoin

ServletContext

监听者

被监听者

监听到事件对象

HttpSessionActivationListener

HttpSession – 监听HttpSession活化和顿化。

HttpSessionEvent

HttpSessionAttributeListener

HttpSession – 监听session的属性变化的。S.setAttributee();

HttpSessionBindingEvent

HttpSessionBindingListener

HttpSession - 监听哪一个对象,绑定到了session上。S.setAtrri(name,User);

 

HttpSessionListener

HttpSesion – 监听sessioin创建销毁

HttpSessionEvent

ServletContextAttributeListener

ServletContext – 属性变化的

 

ServletContextListener

servletContext 创建销毁

 

ServletRequestListener - serlvetRequestAttibuteListner

Rrequest -创建销毁

 

 

实现一个监听器HttpServletRequest的创建销毁

第一步:实现一个类:

package cn.itcast.listener;

import javax.servlet.ServletRequestEvent;

import javax.servlet.ServletRequestListener;

public class RequestListener implements ServletRequestListener {

    public void requestDestroyed(ServletRequestEvent sre) {

        System.err.println("request销毁了:");

        Object o = sre.getSource();

        System.err.println("这个o is :"+o);//apache.RequestFaced@22222

    }

    public void requestInitialized(ServletRequestEvent sre) {

        System.err.println("request创建了:");

        Object o = sre.getSource();

        System.err.println("这个o是 :"+o);//apache.RequestFaced@22222

    }

}

第二步:必须要配置到web.xml

<listener>

<listener-class>cn.itcast.listener.RequestListener</listener-class>

</listener>

说明:

1:配置一个Listener只要求提供类名就可以了。

2:在tomcat启动时,会自动的初始化这个监听器类。

3:tomcat创建的Listner,Serlvet,Filter都是单列的.

监听seession中的属性变化的

Session.setAttribute(“name”,”Jack”); == > 添加新的属性

Seession.setAttribute(“name”,”Rose”) == > replace重新设置name值。

Session.removeAttribute(“name”) = > 删除某个属性

 

void

attributeAdded(HttpSessionBindingEvent se) Session.setAttribute(“name”,”Jack”); == > 添加新的属性
          Notification that an attribute has been added to a session.

void

attributeRemoved(HttpSessionBindingEvent se) Session.removeAttribute(“name”) = > 删除某个属性
          Notification that an attribute has been removed from a session.

void

attributeReplaced(HttpSessionBindingEvent se)Seession.setAttribute(“name”,”Rose”) == > replace重新设置name值。

          Notification that an attribute has been replaced in a session.

package cn.itcast.listener;

import javax.servlet.http.HttpSession;

import javax.servlet.http.HttpSessionAttributeListener;

import javax.servlet.http.HttpSessionBindingEvent;

public class AttributeListener implements HttpSessionAttributeListener {

    //sessoin.setAttribute("addr",中国北京);

    public void attributeAdded(HttpSessionBindingEvent e) {

        String name = e.getName();//--addr

        Object value = e.getValue();//获取sesion的value值

        System.err.println("添加了一个新的属性:"+name+","+value);

    }

    //session.removeAttribute("addr"); - tomcat容器

    public void attributeRemoved(HttpSessionBindingEvent e){

        String name = e.getName();

        Object value = e.getValue();

        System.err.println("删除了一个属性:"+name+","+value);

    }

    //sessoin.setAttribute("addr",中国北京);

    //sessoin.setAttribute("addr",上海);

    public void attributeReplaced(HttpSessionBindingEvent e) {

        String name = e.getName();

        Object oldValue = e.getValue();

        HttpSession session = e.getSession();

        Object newValue = session.getAttribute(name); 

        System.err.println("重新设置了一个值:"+name+","+oldValue+",newValue:"+newValue);

        

    }

}

ServletContextListener 用于监听SevletContext的创建

在web中的所的监听器都是全局的 - 都是在项目启动时直接由tomcat创建。监听器没有顺序。只是监听的对象不一样。在一个项目中可以存在多个监听器。

package cn.itcast.listener;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.PrintWriter;

import java.net.URL;

import javax.servlet.ServletContextEvent;

import javax.servlet.ServletContextListener;

public class MyContextListener implements ServletContextListener {

    //在启动时读取数据库之前保存的数据

    public void contextInitialized(ServletContextEvent sc) {

        System.err.println("application被创建了:"+sc.getServletContext());

        URL url = MyContextListener.class.getClassLoader().getResource("count.txt");

        String path = url.getFile();

        System.err.println(path);

        try {

            BufferedReader bf = new BufferedReader(new FileReader(path));

            String line = bf.readLine();

            Integer count = Integer.valueOf(line);

            sc.getServletContext().setAttribute("count",count);

            System.err.println("初始的值是:"+count);

        } catch (Exception e) {

            e.printStackTrace();

        }

        

        

        

    }

    //在销毁这个对象时保存一些数据到数据库或是文件中

    public void contextDestroyed(ServletContextEvent e) {

        System.err.println("销毁了:"+e.getServletContext());

        //保存到文件中去

        URL url = MyContextListener.class.getClassLoader().getResource("count.txt");

        String path = url.getFile();

        System.err.println(path);

        File file = new File(path);

        try {

            PrintWriter out = new PrintWriter(file);

            //获取applicat的数据

            Integer count = (Integer) e.getServletContext().getAttribute("count");

            out.print(count);

            out.close();

        } catch (FileNotFoundException e1) {

            e1.printStackTrace();

        }

        

        

    }

}

在项目启动时一次加载所有的配置文件。

HttpSessionBindingListener - 此类是用于监听一个 Bean是否被放到了Session中。

Person p = new Person();.
Session.setAttriute(“pp”, p);
实现此类的Bean不需要配置到web.xml。

HttpSessionActivationListener - 监听一个Sesison被保存到一个文件中的过程

也需要一个Bean。实现HttpSessionActivationListener接口。此类也不需要配置到web.xml

Person p  = new Person()  implemnts HttpSessionActivationListener{

Actived….

}

Session.setAttribute(“p”,p);

第一步:书写Bean实现HttpSessionActivationListener

package cn.itcast.domain;

import java.io.Serializable;

import javax.servlet.http.HttpSessionActivationListener;

import javax.servlet.http.HttpSessionEvent;

public class Person implements Serializable,HttpSessionActivationListener{

    private String name;

    public Person() {

    }

    public Person(String name) {

        this.name = name;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public void sessionWillPassivate(HttpSessionEvent se) {

        System.err.println("保存到文件中去了..."+this.getName());

    }



    public void sessionDidActivate(HttpSessionEvent se) {

        System.err.println("从文件中活化了...."+this.getName());

    }

    @Override

    public String toString() {

        return "Person [name=" + name + "]";

    }

}

第二步:配置这个项目

<Context  docBase="D:\\programfiles\\MyEclipse10\\wk3\\day21\\WebRoot">

    <Manager className="org.apache.catalina.session.PersistentManager"

             saveOnRestart="true">

            <Store className="org.apache.catalina.session.FileStore"

                   directory="d:/a">

            </Store>

    </Manager>

</Context>

第三步:测试

<%

        if(session.getAttribute("p")==null){

            int a = new Random().nextInt(100);

            Person p = new Person(""+a);

            session.setAttribute("p",p);

        }

        //保存cookie

        Cookie c = new Cookie("JSESSIONID",session.getId());

        c.setMaxAge(60*30);

        c.setPath(request.getContextPath());

        response.addCookie(c);

    

    %>

    <hr/>

    ${p}

    <hr/>

    <%=session.getId()%>

你可能感兴趣的:(监听器)