一、监听器
JavaWeb的监听器是监听:
1.ServletRequest(请求对象)
2.ServletContext(代表当前整个web应用)
3.HttpSession对象(session对象)
二、监听器分类
JavaWeb 有8个监听器,分为三大类:
1.生命周期监听器(ServletRequestListener、ServletContextListener、HttpSessionListener)
ServletRequestListener:对于 ServletRequest 对象,发送请求创建对象,请求结束销毁
ServletContextListener:对于 ServletContext 对象,项目加载进服务器创建对象,项目卸载销毁
HttpSessionListener:对于 HttpSession 对象,新会话进来的时候创建对象,session 失效(强制失效,超时)销毁
2.属性监听器(ServletRequestAttributeListener、ServletContextAttributeListener、ServletContextAttributeListener)
3.session固有监听器(HttpSessionActivationListener、HttpSessionBindingListener)
HttpSessionActivationListener:监听 session 活化钝化。钝化:服务器关闭时,保存在 session 中的对象存放在本地文件;活化:服务器启动时,保存 session 的本地文件的对象,读到内存
HttpSessionBindingListener:监听一个对象是否绑定到 session 中(保存到 sesison 中)。绑定:保存在 session 中;解绑:session 中移除就是解绑
三、生命周期监听器和属性监听器的使用
1.maven 依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
2.实现接口
实现 ServletRequestListener 接口,监听 ServletRequest 对象的创建、销毁
@WebListener
public class MyServletRequestListener implements ServletRequestListener {
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("request对象初始化");
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("request对象销毁");
}
}
实现 ServletRequestAttributeListener 接口,监听 ServletRequest 对象的属性的增加、移除、替换
@WebListener
public class MyServletRequestAttributeListener implements ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
String key = srae.getName();
Object value = srae.getValue();
System.out.println(String.format("request域中增加属性 key: %s value: %s", key, value));
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
String key = srae.getName();
Object value = srae.getValue();
System.out.println(String.format("request域中移除属性 key: %s value: %s", key, value));
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
String key = srae.getName();
// 要修该属性的值,旧值
Object oldValue = srae.getValue();
// 修该属性后的值,旧值
Object newValue = srae.getServletRequest().getAttribute(key);
System.out.println(String.format("request域中替换属性 key: %s oldValue: %s newValue: %s", key, oldValue, newValue));
}
}
3.测试servlet
对 ServletRequest 对象进行属性的增加、移除、替换
@WebServlet(name = "HelloServlet", urlPatterns = {"/hello"})
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("HelloServlet Begin");
request.setAttribute("user", "郭富城");
request.setAttribute("talk", "左手画个龙");
request.setAttribute("talk", "右手画个彩虹");
request.removeAttribute("talk");
response.getWriter().write("success");
System.out.println("HelloServlet End");
}
}
4.结果
浏览器访问 http://localhost:8080/hello
request对象初始化
request域中替换属性 key: org.apache.catalina.ASYNC_SUPPORTED oldValue: true newValue: false
HelloServlet Begin
request域中增加属性 key: user value: 郭富城
request域中增加属性 key: talk value: 左手画个龙
request域中替换属性 key: talk oldValue: 左手画个龙 newValue: 右手画个彩虹
request域中移除属性 key: talk value: 右手画个彩虹
HelloServlet End
request对象销毁
四、session固有监听器
1.HttpSessionActivationListener
只需要 JavaBean 实现 HttpSessionActivationListener 接口
/**
* 监听 Person 对象的钝化和活化
* 对象和 session 一起活化钝化必须实现序列化接口
*/
public class Person implements HttpSessionActivationListener, Serializable {
private static final long serialVersionUID = 1L;
private String username;
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println(this.username + "和session一起钝化了");
}
@Override
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println(this.username + "和session一起活化了");
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
2.HttpSessionBindingListener
只需要 JavaBean 实现 HttpSessionBindingListener 接口
public class Person implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("对象从session中绑定");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("对象从session中解绑");
}
}