监听器(Listener)

概念:

java编写的web组件;

对session和application内置对象的状态(创建、销毁)和属性(增加、删除、替换)的变化做监听;

其他内置对象周期较短,没必要做监听;

 

application监听

语法

包声明

包导入

import java.util.* ;

import javax.servlet.* ;

import javax.servlet.http.* ;

状态做监听:实现ServletContextListener接口,实现contextInitialized方法和contextDestroyed方法,注入事件对象,可以通过事件对象取得application内置对象;

public void contextInitialized(ServletContextEvent sce)

{
        this.application = sce.getServletContext() ; //可以获取application对象
}

public void contextDestroyed(ServletContextEvent sce)

 

属性做监听:实现ServletContextAttributeListener接口,实现三个方法,注入事件;

public void attributeAdded(ServletContextAttributeEvent scab)

        

public void attributeRemoved(ServletContextAttributeEvent scab)

        

public void attributeReplaced(ServletContextAttributeEvent scab)

        

部署:打包编译

配置:

与用户的请求没有关系,不需要配置<listener-mapping>

<listener>
        <listener-class>cn.mldn.lxh.listener.ServletContextDemo</listener-class>
</listener>

监听器是tomcat启动后创建最早的对象---->然后是两个config---->application---->filter---->若配置了<load-on-startup>,就是servlet

filter.java

 

demo.jsp

getServletContext().setAttribute("name","LiXingHua") ;

第一次执行

 

第二次执行

 

在原有的属性值上替换一个新的属性值,被监听器监听到就获取被改变的属性名和属性值:getName()、getValue(),然后输出;

全局初始化参数 <context-param> :不属于任何一个组件,封装在application里,任何组件都可以通过application取得全局初始化参数;

局部初始化参数:封装在Config、filterConfig或者servletConfig里,只能由配置初始化信息的组件使用;

 

Application真正的作用:

1.tomcat一启动,就创建监听器对象,并对application对象的创建做监听;

2.application创建后立即把全局初始化参数封装进来;

3.监听器监听到application对象被创建就调用contextInitialized方法,并获取application对象;

4.通过application获取全局初始化参数,getInitparameter(),通过配置信息就可以创建bean工厂;

5.最后再把bean工厂设到application里。

 

Session监听

概念

对session的创建、销毁、属性操作做监听

用户第一次访问服务器或是静态组件,都没有创建session,监听器不会监听

只有用户第一次访问服务器的动态组件,session才会创建,监听器才会监听到,且一个用户只会创建一个session;

语法

包声明

包导入

类名与文件名相同

实现接口和方法

实现HttpSessionListener接口:对session的整体状况监听

public void sessionDestroyed(HttpSessionEvent se):session销毁

HttpSessionEvent事件:

public HttpSession getSession():取得当前操作的session

实现HttpSessionAttributeListener接口:对session的属性监听

public void attributeAdded(HttpSessionBindingEvent se):增加属性

public void attributeRemoved(HttpSessionBindingEvent se):属性删除

public void attributeReplaced(HttpSessionBindingEvent se):属性替换 ----获取的是被替换之前的属性值

HttpSessionBindingEvent事件:

public String getName():取得属性的名称

public Object getValue():取得属性的值

public HttpSession getSession():取得当前的session

问题

session(属性)被移除

session.removeAttribute("name") ;
<h1>name:${name}</h1>

session里属性名为name的属性已经被移除,再调用session.getAttribute方法就会得到NULL,但el表达式会把NULL转换成空串输出;

session被销毁

session.invalidate() ;
<h1>name:${name}</h1>

session已经被销毁,再用el表达式输出属性,就会报500错误,因为会调用session.getAttribute方法,产生空指针异常

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章