在上海乐字节学习的第二十天(持续更新中)

监听器

监听事件的发生需要如下因素:

1.事件 ActionEvent
2.事件源 JButton
3.监听器 ActionListener
4.注册监听 addActionListener();
监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。

在javaweb中有什么监听器,有什么作用?

javaweb中的监听器,主要用于监听javaweb中常用对象
request(HttpServletRequest)
session(HttpSession)
application(ServletContext)

监听器的作用

1.对象的创建与销毁
2.对象的属性变化
3.session绑定javaBean

1.监听创建与销毁

HttpServletRequest
监听器:ServletRequestListener可以监听request对象的创建与销毁。
HttpSession
监听器:HttpSessionListener可以监听session对象的创建与销毁。
ServletContext
监听器:ServletContextListener可以监听application对象的创建与销毁。

2.监听web对象的属性变化

HttpServletRequest属性变化
监听器:ServletRequestAttributeListener监听request对象的属性变化
HttpSession属性变化
监听器:HttpSessionAttributeListener 监听session对象的属性变化
ServletContext属性变化
监听器:ServletContextAttributeListener监听application对象的属性变化。

编写监听器

和编写其它事件监听器一样,编写servlet监听器也需要实现一个特定的接口,并针对相应动作覆盖接口中的相应方法。

和其它事件监听器略有不同的是,servlet监听器的注册不是直接注册在事件源上,而是由WEB容器负责注册,开发人员只需在web.xml文件中使用标签配置好监听器,web容器就会自动把监听器注册到事件源中。

一个 web.xml 文件中可以配置多个 Servlet 事件监听器,web 服务器按照它们在 web.xml 文件中的注册顺序来加载和注册这些 Serlvet 事件监听器。

创建监听器步骤

1.创建一个类,去实现指定的监听器接口。
2.重写接口中方法。
3.在web.xml文件中配置注册监听。



    cn.itcast.listener.demo.MyServletContextListener


具体实现
1.监听application对象的创建与销毁.

问题:application对象什么时候创建,什么时候销毁的?
application对象是服务器启动时创建,服务器关闭时销毁。

2.监听session对象创建与销毁

问题:session对象什么时候创建,什么时候销毁?
session对象创建:
reqeust.getSession();它是用于获取session

是否创建,分以下几种情况:
1.请求中如果没有jsessionid,那么就是创建session对象。
2.如果请求头中有jsessionid值:
1.如果在服务器端,有一个session的id值与其一样,不创建,直接使用。
2.如果在服务器端,没有这个session的id值,那么会创建。

session对象销毁:
1.默认超时 30 分钟
2.设置session超时时间
setMaxInactiveInterval(int interval)
3.invalidate()手动销毁
4.关闭服务器

3.监听request对象创建与销毁
问题:request对象什么时候创建,什么时候销毁?
请求发生,request对象创建,响应产生request对象销毁。

ServletContext监听器

ServletContextListener 接口用于监听 ServletContext 对象的创建和销毁事件。

当 ServletContext 对象被创建时,激发 contextInitialized (ServletContextEvent sce)方法

当 ServletContext 对象被销毁时,激发 contextDestroyed(ServletContextEvent sce)方法。

提问,servletContext域对象何时创建和销毁:

创建:服务器启动针对每一个web应用创建servletcontext
销毁:服务器关闭前先关闭代表每一个web应用的servletContext
示例1 简单任务调度Timer与TimerTask使用

Servlet监听器

在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为 ServletContext, HttpSession 和 ServletRequest 这三个域对象。

Servlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型。

监听三个域对象创建和销毁的事件监听器
监听域对象中属性的增加和删除的事件监听器
监听绑定到 HttpSession 域中的某个对象的状态的事件监听器。(查看API文档)
在javaweb中servlet规范中定义了三种技术 : servlet Listener Filter。

HttpSession监听器

HttpSessionListener接口用于监听 HttpSession 的创建和销毁
创建一个Session时,sessionCreated(HttpSessionEvent se) 方法将会被调用。
销毁一个Session时,sessionDestroyed (HttpSessionEvent se) 方法将会被调用。

ServletRequest监听器

ServletRequestListener 接口用于监听 ServletRequest 对象的创建和销毁。

Request 对象被创建时,监听器的requestInitialized方法将会被调用。
Request对象被销毁时,监听器的requestDestroyed方法将会被调用。
当向被监听器对象中增加一个属性时,web容器就调用事件监听器的 attributeAdded 方法进行相应,这个方法接受一个事件类型的参数,监听器可以通过这个参数来获得正在增加属性的域对象和被保存到域中的属性对象。

各个域属性监听器中的完整语法定义为:
public void attributeAdded(ServletContextAttributeEvent scae)
public void attributeAdded (HttpSessionBindingEvent hsbe)
public void attributeAdded(ServletRequestAttributeEvent srae)

监听三个域的属性变化

Servlet规范定义了监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器。

这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener ServletRequestAttributeListener
这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同。

当向被监听器对象中增加一个属性时,web容器就调用事件监听器的 attributeAdded 方法进行相应,这个方法接受一个事件类型的参数,监听器可以通过这个参数来获得正在增加属性的域对象和被保存到域中的属性对象
各个域属性监听器中的完整语法定义为:

public void attributeAdded(ServletContextAttributeEvent scae)
public void attributeAdded (HttpSessionBindingEvent hsbe)
public void attributeAdded(ServletRequestAttributeEvent srae)
当删除被监听对象中的一个属性时,web 容器调用事件监听器的这个方法进行相应处理

各个域属性监听器中的完整语法定义为:

public void attributeRemoved(ServletContextAttributeEvent scae)
public void attributeRemoved (HttpSessionBindingEvent hsbe)
public void attributeRemoved (ServletRequestAttributeEvent srae)
当监听器的域对象中的某个属性被替换时,web容器调用事件监听器的这个方法进行相应处理

各个域属性监听器中的完整语法定义为:
public void attributeReplaced(ServletContextAttributeEvent scae)
public void attributeReplaced (HttpSessionBindingEvent hsbe)
public void attributeReplaced (ServletRequestAttributeEvent srae)

演示监听session的属性变化

public class MySessionAttributeListener implements HttpSessionAttributeListener {

    public void attributeAdded(HttpSessionBindingEvent arg0) {

        // arg0.getSession(); 获取事件源,也就是获取session对象.
        System.out.println(arg0.getName());
        System.out.println(arg0.getValue());
        System.out.println("向session中添加属性");
    }

    public void attributeRemoved(HttpSessionBindingEvent arg0) {
        System.out.println("从session中移除属性");
    }

    public void attributeReplaced(HttpSessionBindingEvent arg0) {
        System.out.println("将session中的属性修改");
    }

}

问题:在监听器中是否可以得到属性值?

常识:在java的监听机制中,是可以在监听器中获取事件源的。
我们在开发中,如果用到了事件触发机制,那么一般情况下,都可以使用方法的参数(事件对象)来获取想要的信息。
思考一个问题:这些监听器在开发中有什么用?

在主流中应用比较少,但是可以完成一些性能监试操作。

监听器案例

功能:扫描session对象在指定时间内没有使用,人为销毁。

分析:

1.怎样知识session多长时间没有使用?
当前时间-最后使用时间(public long getLastAccessedTime())
2.什么时候开始扫描,扫描多长时间?
可以使用Timer完成
完成定时扫描session,如果超时没有使用,销毁案例:

1.要将所有的session对象得到,保存到集合中。
1.创建一个监听器 ServletContextListener,它服务器启动时,创建一个集合保存到ServletContext域。
2.创建一个监听器 HttpSessionListener,当创建一个session时,就从ServletContext域中获取集合,将session对象储存到集合中。
2.定时扫描
问题:
1.session超时,不能只销毁session,还要从集合中移除。
2.我们的操作,它是多线程的,要考虑集合的同步问题。
1.集合需要是线程安全的。
2.需要使用迭代器进行遍历。

Session绑定监听器

保存在Session域中的对象可以有多种状态:

绑定到 Session 中;
从 Session 域中解除绑定;
随 Session 对象持久化到一个存储设备中(钝化);
随 Session 对象从一个存储设备中恢复(活化);
Servlet 规范中定义了两个特殊的监听器接口来帮助JavaBean对象了解自己在 Session域中的这些状态。

HttpSessionBindingListener接口
HttpSessionActivationListener接口
实现这两个接口的类不需要 在 web.xml 文件中进行注册
实现了HttpSessionBindingListener接口的 JavaBean 对象可以感知自己被绑定到 Session 中和从 Session中删除的事件

当对象被绑定到 HttpSession 对象中时,web服务器调用该对象的 void valueBound(HttpSessionBindingEvent event) 方法
当对象从 HttpSession 对象中解除绑定时,web服务器调用该对象的 void valueUnbound(HttpSessionBindingEvent event)方法
实现了HttpSessionActivationListener接口的 JavaBean对象可以感知自己被活化和钝化的事件

当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被钝化之前,web 服务器调用如下方法sessionWillPassivate(HttpSessionBindingEvent event) 方法
当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被活化之后,web 服务器调用该对象的 void sessionDidActive(HttpSessionBindingEvent event)方法
钝化—>将session中的javaBean保存到文件中.
活化—>从文件中将javaBean直接获取。
需要创建一个配置文件context.xml

这个文件保存到META-INF目录下.







这两个监听器特点;
1.它们是由javaBean实现。
2.它们不需要在web.xml文件中配置。

你可能感兴趣的:(在上海乐字节学习的第二十天(持续更新中))