概念:
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方法,产生空指针异常;