package com.tao.springstarter.web.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* 自定义监听器, 实现ServletContextListener
*/
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("web容器启动, context对象被创建...");
System.out.println(sce.getServletContext().toString());
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("web容器关闭, context对象被销毁...");
}
}
<!-- 配置监听器 -->
<listener>
<listener-class>com.tao.springstarter.web.listener.MyListener</listener-class>
</listener>
package com.tao.springstarter.web.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import com.tao.springstarter.entity.JBean;
import com.tao.springstarter.entity.PBean;
/**
* 自定义监听器, 实现ServletContextListener
*/
public class MyListener implements ServletContextListener, ServletRequestListener, HttpSessionListener {
// ====================== context ==========================
// 加载 context
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("web容器启动, context对象被创建...");
// 可以获取 context对象
ServletContext context = sce.getServletContext();
System.out.println("即将启动 " + context.getContextPath());
}
// 卸载 context
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("web容器关闭, context对象被销毁...");
// 可以获取 context对象
ServletContext context = sce.getServletContext();
System.out.println("即将关闭 " + context.getContextPath());
}
// ====================== request ==========================
// 创建 request
@Override
public void requestInitialized(ServletRequestEvent sre) {
// 可以获取request对象
HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
String uri = request.getRequestURI();
uri = request.getQueryString() == null ? uri : (uri + "?" + request.getQueryString());
System.out.println("请求的uri为:" + uri);
// 可以向request对象中放入这次请求中共享的数据
request.setAttribute("startTime", System.currentTimeMillis());
}
// 销毁 request
@Override
public void requestDestroyed(ServletRequestEvent sre) {
// 可以获取request对象, 获取request对象中的共享数据
HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
long costTime = System.currentTimeMillis() - (Long) request.getAttribute("startTime");
System.out.println("本次请求耗时:" + costTime + " ms");
}
// ====================== session ==========================
// 创建 session
@Override
public void sessionCreated(HttpSessionEvent se) {
// 可以获取session对象
HttpSession session = se.getSession();
System.out.println("新创建一个session, id = " + session.getId());
// 向session中添加属性
session.setAttribute("username", "michael");
session.setAttribute("jBean", new JBean("JBean1"));
session.setAttribute("pBean", new PBean("PBean1"));
// 修改session中的属性
session.setAttribute("username", "Tom");
// 删除session中的属性
session.removeAttribute("username");
session.removeAttribute("jBean");
}
// 销毁 session
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// 可以获取session对象
HttpSession session = se.getSession();
System.out.println("销毁一个session, id = " + session.getId());
}
}
package com.tao.springstarter.web.listener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
/**
* 自定义session属性监听器
*/
public class MySessionAttributeListener implements HttpSessionAttributeListener {
// 向session中添加属性时触发
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
HttpSession session = event.getSession();
String key = event.getName();
Object value = event.getValue();
System.out.println("向id = " + session.getId() + " 的session中添加的属性为 <" + key + "," + value + ">");
}
// 从session中移除属性时触发
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
HttpSession session = event.getSession();
String key = event.getName();
Object value = event.getValue();
System.out.println("从id = " + session.getId() + " 的session中移除的属性为 <" + key + "," + value + ">");
}
// 修改session中属性时触发
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
HttpSession session = event.getSession();
String key = event.getName();
System.out.println("修改id = " + session.getId() + " 的session的属性为 key = " + key);
}
}
package com.tao.springstarter.entity;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
/**
* 实现了HttpSessionBindingListener的类的对象能够感知被添加到session中和从session中移除的事件
*/
public class JBean implements HttpSessionBindingListener {
private String name;
public JBean(String name) {
this.name = name;
}
// JavaBean被加到session中触发
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println(name + "被加到session中了...");
}
// 从session中移除JavaBean时触发
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println(name + "从session中被移除了...");
}
}
上述的JBean这个JavaBean实现了HttpSessionBindingListener接口,那么这个JavaBean对象可以感知自己被绑定到Session中和从Session中删除的这两个操作。
(2)实现HttpSessionActivationListener接口
package com.tao.springstarter.entity;
import java.io.Serializable;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
/**
* 实现HttpSessionActivationListener接口的JavaBean, 能够感知随session钝化和活化事件
*/
public class PBean implements HttpSessionActivationListener, Serializable {
private static final long serialVersionUID = 1L;
private String name;
public PBean(String name) {
this.name = name;
}
// 钝化前触发
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println(name + "将要和session一起被序列化(钝化)到硬盘, session id = "+se.getSession().getId());
}
// 活化后触发
@Override
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println(name + "和session一起从硬盘反序列化(活化)回到内存了, session id = "+se.getSession().getId());
}
}
| 欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |