JAVAWEB学习文章索引点这里
Servlet事件监听器的原理和GUI中的监听器的原理一致。不过这里主要监听的是ServletContext、session、request等对象以及其属性变更。
ServletContextListener接口中:
方法 | 说明 |
contextInitialized(ServletContextEvent event) | 当ServletContext对象被创建时,web容器会调用contextInitialized()方法。且参数event可以用于获取ServletContext对象 |
contextDestroyed(ServletContextEvent event) | 当ServletContext对象即将被销毁时,web容器会调用该方法 |
HttpSessionListener接口中:
方法 | 说明 |
sessionCreated(HttpSessionEvent event) | 当HttpSession对象被创建时,web容器会调用sessionCreated ()方法。且参数event可以用于获取HttpSession对象 |
sessionDestroyed(HttpSessionEvent event) | 当HttpSession对象即将被销毁时,web容器会调用该方法 |
ServletRequestListener接口中:
方法 | 说明 |
requestInitialized(ServletRequestEvent event) | 当ServletRequest对象被创建时,web容器会调用requestInitialized()方法。且参数event可以用于获取ServletRequest对象 |
requestDestroyed(ServletRequestEvent event) | 当ServletRequest对象即将被销毁时,web容器会调用该方法 |
简单测试以上方法:
package com.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class ListenerTest implements ServletContextListener, HttpSessionListener, ServletRequestListener {
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("ServletContext销毁了");
}
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("ServletContext创建了");
}
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("session创建了");
arg0.getSession().setMaxInactiveInterval(2);
}
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("session销毁了");
}
public void requestDestroyed(ServletRequestEvent arg0) {
System.out.println("request销毁了");
}
public void requestInitialized(ServletRequestEvent arg0) {
System.out.println("request创建了");
}
}
操作方式为,打开浏览器,访问这个监听器下的资源,等待一会儿后关闭浏览器,关闭服务器,结果如下:
ServletContext创建了
request创建了
session创建了
request销毁了
session销毁了
ServletContext销毁了
监听器接口中属性变更的方法:
方法 | 说明 |
attributeAdded(ServletContextAttributeEvent event) | 当ServletContext对象中添加一个属性时,web容器会调用该方法 |
attributeAdded(HttpSessionBindindEvent event) | 当HttpSession对象中添加一个属性时,web容器会调用该方法 |
attributeAdded(ServletRequestAttributeEvent event) | 当ServletRequest对象中添加一个属性时,web容器会调用该方法 |
attributeRemoved(ServletContextAttributeEvent event) | 当删除被监听对象中的一个属性时,web容器会调用该方法 |
attributeRemoved(HttpSessionBindindEvent event) | 当删除被监听对象中的一个属性时,web容器会调用该方法 |
attributeRemoved(ServletRequestAttributeEvent event) | 当删除被监听对象中的一个属性时,web容器会调用该方法 |
attributeReplaced(ServletContextAttributeEvent event) | 当被监听对象中的一个属性改变时,web容器会调用该方法 |
attributeReplaced(HttpSessionBindindEvent event) | 当被监听对象中的一个属性改变时,web容器会调用该方法 |
attributeReplaced(ServletRequestAttributeEvent event) | 当被监听对象中的一个属性改变时,web容器会调用该方法 |
测试代码如下:
package com.test;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/ListenerTestServlet")
public class ListenerTestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = request.getServletContext();
HttpSession session = request.getSession();
context.setAttribute("name", "aaa");
context.setAttribute("name", "bbb");
context.removeAttribute("name");
request.setAttribute("name", "ccc");
request.setAttribute("name", "ddd");
request.removeAttribute("name");
session.setAttribute("name", "eee");
session.setAttribute("name", "fff");
session.removeAttribute("name");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
package com.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
@WebListener
public class AttributeListenerTest implements ServletContextAttributeListener, HttpSessionAttributeListener, ServletRequestAttributeListener {
public void attributeAdded(ServletContextAttributeEvent arg0) {
String name = arg0.getName();
System.out.println(name+"-添加1-"+arg0.getServletContext().getAttribute(name));
}
public void attributeReplaced(ServletContextAttributeEvent arg0) {
String name = arg0.getName();
System.out.println(name+"-替换1-"+arg0.getServletContext().getAttribute(name));
}
public void attributeRemoved(ServletContextAttributeEvent arg0) {
String name = arg0.getName();
System.out.println(name+"-销毁1-"+arg0.getServletContext().getAttribute(name));
}
public void attributeAdded(ServletRequestAttributeEvent arg0) {
String name = arg0.getName();
System.out.println(name+"-增加2-"+arg0.getServletRequest().getAttribute(name));
}
public void attributeReplaced(ServletRequestAttributeEvent arg0) {
String name = arg0.getName();
System.out.println(name+"-替换2-"+arg0.getServletRequest().getAttribute(name));
}
public void attributeRemoved(ServletRequestAttributeEvent arg0) {
String name = arg0.getName();
System.out.println(name+"-销毁2-"+arg0.getServletRequest().getAttribute(name));
}
public void attributeAdded(HttpSessionBindingEvent arg0) {
String name = arg0.getName();
System.out.println(name+"-增加3-"+arg0.getSession().getAttribute(name));
}
public void attributeRemoved(HttpSessionBindingEvent arg0) {
String name = arg0.getName();
System.out.println(name+"-销毁3-"+arg0.getSession().getAttribute(name));
}
public void attributeReplaced(HttpSessionBindingEvent arg0) {
String name = arg0.getName();
System.out.println(name+"-替换3-"+arg0.getSession().getAttribute(name));
}
}
HttpSessionBindingListener接口:
在使用javabean时经常会判断该对象是否绑定到session域中,为此提供了这个接口来监听javabean对象从session中的绑定和解绑事件。使用下列两个方法需要实现HttpSessionBindingListener接口
valueBound(HttpSessionBindingEvent event) | 当对象被绑定到session的时候,容器会自动调用该方法 |
valueUnbound(HttpSessionBindingEvent event) | 当对象从session中解绑的时候,容器会自动调用该方法 |
HttpSessionActivationListener接口:
Servlet容器在某些特殊情况下会将session对象从内存中转移到硬盘中,这个过程称为持久化(钝化)。例如:大量用户访问服务器的时候会创建大量的session,所以为了减少内存占用,将一部分一段时间没有访问的session对象钝化。在持久化会话中,Servlet容器不只会持久化session,还会将它所有可以序列化的属性进行持久化,从而确保存放在会话范围内的共享数据不会丢失。而可以序列化的属性的意思是这个属性实现了Serializable接口。当会话从持久化的状态变为运行状态的过程被称为活化(加载)。一般情况下,当服务器重新启动或者单个web应用启动时,处于会话中的客户端向web应用发出http请求时,相应的会话会被激活。
该接口提供方法如下
sessionWillPassivate(HttpSessionEvent event) | 当绑定到session中的对象将要随session对象被钝化之前,容器会自动调用该方法 |
sessionDidActivate(HttpSessionEvent event) | 当绑定到session中的对象将要随session对象被活化之前,容器会自动调用该方法 |