目录
项目中是监听什么?
项目中就 监听三个对象
request对象
session对象
application对象
我们就是学习利用***对那三个对象进行监听,就是监听那三个对象的变化
***(8个)
以上的***都是接口
监听用户日志操作(监听request对象)
1 首先写一个***,对当前的请求进行监听,所以使用监听request的***
package com.listener;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
public class LogListener implements ServletRequestListener,ServletRequestAttributeListener {
ServletRequestListener 这个父类***的方法是下面两个
// request 对象一被销毁,就会执行这个方法
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
}
// request 对象一被创建,就会执行这个方法
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
// XXX在XX时间做了XX操作
HttpServletRequest request = (HttpServletRequest) servletRequestEvent.getServletRequest();
//如何获得客户端IP地址
String remoteAddr = request.getRemoteAddr();
//获得时间
String locale = new Date().toLocaleString();
//获得用户操作的地址 /aa?method=uu
String uri = request.getRequestURI();
String method = request.getQueryString();
try {
PrintWriter out=new PrintWriter(new FileWriter("D:/log.txt",true));
out.println("用户:"+remoteAddr+"在:"+locale+"访问了:"+uri+"?"+method);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
ServletRequestAttributeListener 这个父类***的方法是
下面的3个
就是监听request对象里面有没有设置值
@Override
public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
第一次往request里面设置值的时候,会执行这个方法
// request.setAttribute("emp","123");
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
移除request对象里面的值的时候,走这个方法
// request.removeAttribute("emp");
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
对同一个key设置另一个值,那么会走这个方法
// request.setAttribute("emp","456");
}
}
2 在web.xml里面配置***
<listener>
<listener-class>com.listener.LogListener</listener-class>
</listener>
监听当前的在线人数(监听session对象)
登录成功之后,数量加一,退出,数量减一。
package com.listener;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class OnLineListener implements HttpSessionListener,HttpSessionAttributeListener {
session 销毁的时候走这个
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
ServletContext servletContext = httpSessionEvent.getSession().getServletContext();
Integer online = (Integer) servletContext.getAttribute("online");
if(online==null){
online=0;
}else {
online--;
}
servletContext.setAttribute("online",online);
}
session里面设置值的时候
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
String name = httpSessionBindingEvent.getName();
ServletContext servletContext = httpSessionBindingEvent.getSession().getServletContext();
只有session保存的键是emp的时候,才可以加一
if("emp".equals(name)){
//进行在线人数加一
//获得之前的在线人数
Integer online = (Integer) servletContext.getAttribute("online");
if(online==null){
online=1;
}else{
online++;
}
servletContext.setAttribute("online",online);
}
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
}
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
}
}
HttpSessionBindingListener 绑定***
- HttpSessionBindingListener:
-
监听对象从session 上进行绑定和解绑的操作
- 如果指定的对象绑定到session上的时候就会执行valueBound
- 如果对象从session中解绑的时候或者session注销的时候就会执行valueUnbound
- 需要注意的是使用这个***的时候不需要在web.xml 中进行任何的配置
这个***咋使用
我们在我们的实体类上面,继承这个***,并且重写里面的方法,重写的方法是
@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("session绑定");
}
@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("解绑");
}
我们的员工实体类,继承这个***,并且重写他的两个方法
当这个实体类创建了对象,并且放到session对象里面的时候,那么就会执行这个重写的这个valueBound() 这个方法。这个是针对这个员工实体类的。
这个***不需要在web.xml里面配置,只需要以上写完就可以使用
HttpSessionActivationListener(session 的序列化和反序列化)
这个***也是作用在实体类上面。
session的序列化 和 反序列化
实体类继承这个***,重写他的方法
@Override
public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
// 序列化
System.out.println("sessionWillPassivate");
}
@Override
public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
//反序列化
System.out.println("sessionDidActivate");
}