Servlet中定义了8个监听器接口,可以用于监听ServletContext、HttpSession和ServletRequest对象的生命周期事件,以及这些对象的属性改变事件。
注意:实现ServletContextListener、ServletContextAttributeListener、HttpSessionListener接口的类需要在web.xml中配置。
HttpSessionAttributeListener接口:用于监听Session中何时添加、删除或替换了某种类型的属性。
HttpSessionBindingListener接口:由属性自身来实现,以便属性知道它自己何时被添加到一个session中。
一、ServletContextListener接口
在Servlet上下文对象初始化时或者将要被销毁时得到通知,可以实现该接口。
public void contextInitialized(ServletContextEvent sce):该方法将在所有的过滤器和Servlet**初始化之前被调用**。
public void contextDestroyed(ServletContextEvent sce):该方法将在所有的Servlet和过滤器销毁之后被调用。
1、自定义监控类,实现ServletContextListener接口
(只要应用程序启动,就会被监控)
//实现ServletContextListener接口的监控类
public class MyServletContextListener implements ServletContextListener {
//会在servlet上下文对象初始化之前被调用
public void contextInitialized(ServletContextEvent sce){
//获得一个上下文对象
ServletContext servletContext=sce.getServletContext();
String name=(String) servletContext.getInitParameter("name");
System.out.println(name);
System.out.println("初始化之前被调用");
}
public void contextDestroyed(ServletContextEvent sce){
System.out.println("销毁之后被调用");
}
}
2、具体servlet实现类(用于处理请求)
public class ListenerTest extends HttpServlet {
public void init(ServletConfig config)throws ServletException{
System.out.println("servlet初始化");
}
@Override
public void destroy() {
System.out.println("servlet销毁");
}
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException{
}
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException{
doGet(request,response);
}
}
3、web.xml中的配置
<context-param>
<param-name>name</param-name>
<param-value>test listener</param-value>
</context-param>
<servlet>
<servlet-name>ListenerTest</servlet-name>
<servlet-class>org.wdz.listener.ListenerTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ListenerTest</servlet-name>
<url-pattern>/test.jsp</url-pattern>
</servlet-mapping>
<!--一定要配置监控类-->
<listener>
<listener-class>org.wdz.listener.MyServletContextListener</listener-class>
</listener>
4、结果:
//启动Tomcat
test listener
初始化之前被调用
//访问:http://localhost:8080/servletTest/test.jsp
//执行init()初始化方法
servlet初始化
//关闭Tomcat之后
servlet销毁
销毁之后被调用
二、HttpSessionBindingListener接口
如果一个对象实现了HttpSessionBindingListener接口,当这个对象被绑定到Session中或从Session中被删除时,Servlet容器会通知这个对象,而这个对象在接收到通知后,可以做一些初始化或清除状态的操作。
public void valueBound(HttpSessionBindingEvent event);
当对象正被绑定到Session中,Servlet容器调用这个方法来通知该对象。
public void valueUnbound(HttpSessionBindingEvent event)
当从Session中删除对象时,Servlet容器调用这个方法来通知该对象。
1、实现HttpSessionBindingListener接口的User对象
public class User implements HttpSessionBindingListener {
private String name;
private int age;
public User(String name,int age){
this.name=name;
this.age=age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void valueBound(HttpSessionBindingEvent event){
System.out.println("user对象绑定到session中");
//获取该session
HttpSession session=event.getSession();
//要绑定到session中属性的名字
String name=event.getName();
System.out.println("name="+name);
//要绑定到session中的属性值
User user=(User)event.getValue();
System.out.println("username="+user.getName()+" age="+user.getAge());
}
public void valueUnbound(HttpSessionBindingEvent event){
System.out.println("user对象从session中删除");
}
}
2、绑定user对象
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException{
HttpSession session=request.getSession();
User user=new User("test",89);
//绑定User对象
System.out.println("绑定User对象");
session.setAttribute("user",user);
//删除User对象
System.out.println("删除User对象");
session.removeAttribute("user");
}
3、结果
绑定User对象
user对象绑定到session中
name=user
username=test age=89
删除User对象
user对象从session中删除
三、HttpSessionListener接口
在Session对象创建后或者在Session无效前得到通知:(需要在web.xml中配置)
public class MySessionListener implements HttpSessionListener
四、ServletRequestAttributeListener接口
在Servlet请求对象中的属性发生改变时得到通知:
public class MyRequestAttributeListener implements ServletRequestAttributeListener