文章目录
概述
Servlet三大技术之一。Servlet三大技术包括Servlet、Filter、Listener
如果希望自己的网站收集一些数据,可以通过监听器来获取。
实现
在某一个事件触发监听器之后监听器会执行对应的操作
监听器有三大种类
监听三大作用域创建和销毁的监听器
提供两个方法–域的创建和销毁
ServletContextListener
HttpSessionListener
ServletRequestListener
案例:
package cn.tedu.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionBindingEvent;
@WebListener()
public class SCListener implements ServletContextListener {
// Public constructor is required by servlet spec
public SCListener() {
}
// 在 web 应用被初始化时调用
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("day15 已 启动 。"+servletContextEvent.getServletContext());
}
// 在 web 应用被销毁时调用
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("day15 已 销 毁。"+servletContextEvent.getServletContext());
}
}
监听三大作用域中属性变化的监听器
会提供三个方法,分别为域属性的创建、更新、销毁
ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener
案例:
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;
@WebListener()
public class SCListener implements ServletContextAttributeListener {
// 属性添加时触发
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println(" 属 性"+servletContextAttributeEvent.getName()+" 已经进入servletContext 域");
}
// 属性移除时触发
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println(" 属 性"+servletContextAttributeEvent.getName()+" 已经移除ServletContext 域");
System.out.println(" 属 性"+servletContextAttributeEvent.getName()+" 已经移除ServletContext 域");
}
// 属性更改时触发
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println(" 属 性"+servletContextAttributeEvent.getName()+
":"+servletContextAttributeEvent.getValue()
+" 已经在ServletContext 域中更新"
+servletContextAttributeEvent.getServletContext()
.getAttribute(servletContextAttributeEvent.getName()));
}
}
监听JavaBean在Session域中状态变化的监听器
HttpSessionBindingListener
HttpSessionActivationListener
- 创建一个javabean,在javabean身上实现HttpSessionBingdingListener,然后重写两个方法。方法为session域中添加javabean和session域中销毁javabean。
其中具有两个方法:
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class Person implements HttpSessionBindingListener {
private String name;
private int age;
private String addr;
public Person(String name, int age, String addr) {
this.name = name;
this.age = age;
this.addr = addr;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
//javabean 进入 session 域时触发
@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("javabean 进 入session 域" + name);
}
//javabean 离开 session 域时触发
@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("javabean 离 开session 域" + name);
}
}
监听器案例
开发监听器:
记录web应用启动关闭;
记录资源被访问;
记录用户登录注销的日志。
创建ScListener监听web应用的开启和关闭
@WebListener()
public class ScListener implements ServletContextListener{
//ServletContext创建对象(web应用被加载)触发下面的重写
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("EasyMall项目启动...");
}
//ServletContext对象销毁(web应用被移除)触发下面的重写
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("EasyMall项目关闭...");
}
}
创建RequestListener监听访问资源
package cn.tedu.listener;
import cn.tedu.domain.User;
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.*;
@WebListener()
public class RequestListener implements ServletRequestListener {
//当请求结束时触发下面的重写方法
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
//获取request对象
HttpServletRequest request = (HttpServletRequest) servletRequestEvent.getServletRequest();
//获取用户访问的url路径
String url = request.getRequestURL().toString();
//获取用户的ip
String ip = request.getRemoteAddr();
//访问资源的用户名---初始是游客
String username = "游客";
//判断用户是否登录
if (request.getSession(false) != null && request.getSession().getAttribute("user") != null) {
//用户已登陆
//获取用户名
User user = (User) request.getSession().getAttribute("user");
//把用户名覆盖之前初始的用户名
username = user.getUsername();
}
System.out.println("用户【" + username + "】ip【" + ip + "】访问url【" + url + "】请求结束");
}
//当请求开始时触发下面的重写方法
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
//获取request对象
HttpServletRequest request = (HttpServletRequest) servletRequestEvent.getServletRequest();
//获取用户访问的url路径
String url = request.getRequestURL().toString();
//获取用户的ip
String ip = request.getRemoteAddr();
//访问资源的用户名---初始是游客
String username = "游客";
//判断用户是否登录
if (request.getSession(false) != null && request.getSession().getAttribute("user") != null) {
//用户已登陆
//获取用户名
User user = (User) request.getSession().getAttribute("user");
//把用户名覆盖之前初始的用户名
username = user.getUsername();
}
System.out.println("用户【" + username + "】ip【" + ip + "】访问url【" + url + "】请求开始");
}
}
让JavaBean实现HTTPSessionBingListener
//javabaen可以封装数据以及提供方法
public class User implements HttpSessionBindingListener {
//
// Logger logger=Logger.getLogger(User.class);
//javaben属性要和表的字段对应
private int id;
private String username;
private String password;
private String nickname;
private String email;
//构造方法
//无参构造
public User() {
}
//有参构造
public User(int id, String username, String password, String nickname, String email) {
this.id = id;
this.username = username;
this.password = password;
this.nickname = nickname;
this.email = email;
}
//提供get、set方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
//重写toString方法
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", nickname='" + nickname + '\'' +
", email='" + email + '\'' +
'}';
}
//当javabean对象存放在session对象中触发下面重写方法
@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("用户【"+username+"】登陆");
// logger.info("用户【"+username+"】登陆");
}
//当javabean对象移除在session对象中触发下面重写方法
@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("用户【"+username+"】注销");
// logger.info("用户【"+username+"】注销");
}
}