本篇文章主要是作者学习Listener监听器的一些记录,希望能帮到您,如果有什么不妥当的地方希望得到指出,谢谢阅读
Java学习大纲:https://blog.csdn.net/weixin_39778570/article/details/94667501
JavaWeb:https://blog.csdn.net/weixin_39778570/article/details/97800485
理解
监听器顾名思义就是能够实现监听的工具。当你一个类的对象进行创建或者销毁你希望你能监听到他并作出一些处理,或者进行了属性的设置的时候你能过进行一些处理。而我们只需要配置监听器和实现处理就好了,具体的调用过程是服务器来做的。
方法
ServletContext监听
ServletContextListener:用于对Servlet整个上下文进行监听(创建、销毁)。
public void contextInitialized(ServletContextEvent sce);//上下文初始化
public void contextDestroyed(ServletContextEvent sce);//上下文销毁
public ServletContext getServletContext();//ServletContextEvent事件:取得一个ServletContext(application)对象
ServletContextAttributeListener:对Servlet上下文属性的监听(增删改属性)。
public void attributeAdded(ServletContextAttributeEvent scab);//增加属性
public void attributeRemoved(ServletContextAttributeEvent scab);//属性删除
public void attributeRepalced(ServletContextAttributeEvent scab);//属性替换(第二次设置同一属性)
public String getName();//得到属性名称
public Object getValue();//取得属性的值
Session监听
HttpSessionListener接口:对Session的整体状态的监听。
public void sessionCreated(HttpSessionEvent se);//session创建
public void sessionDestroyed(HttpSessionEvent se);//session销毁
//HttpSessionEvent事件
public HttpSession getSession();//取得当前操作的session
HttpSessionAttributeListener接口:对session的属性监听。
public void attributeAdded(HttpSessionBindingEvent se);//增加属性
public void attributeRemoved(HttpSessionBindingEvent se);//删除属性
public void attributeReplaced(HttpSessionBindingEvent se);//替换属性
//HttpSessionBindingEvent事件
public String getName();//取得属性的名称
public Object getValue();//取得属性的值
public HttpSession getSession();//取得当前的session
Request监听
ServletRequestListener:用于对Request请求进行监听(创建、销毁)。
public void requestInitialized(ServletRequestEvent sre);//request初始化
public void requestDestroyed(ServletRequestEvent sre);//request销毁
//ServletRequestEvent事件
public ServletRequest getServletRequest();//取得一个ServletRequest对象
public ServletContext getServletContext();//取得一个ServletContext(application)对象
ServletRequestAttributeListener:对Request属性的监听(增删改属性)。
public void attributeAdded(ServletRequestAttributeEvent srae);//增加属性
public void attributeRemoved(ServletRequestAttributeEvent srae);//属性删除
public void attributeReplaced(ServletRequestAttributeEvent srae);//属性替换(第二次设置同一属性)
//ServletRequestAttributeEvent事件:能取得设置属性的名称与内容
public String getName();//得到属性名称
public Object getValue();//取得属性的值
例子
这里对多个监听器一个一个进行实验,具体改变监听器的类路径就好了
MyServlet.java文件,打开想要测试的功能进行监听,
package listener;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("=================================>接受请求");
// 监听ServletRequest
// req.setAttribute("属性1", "hello");
// req.setAttribute("属性1", "change");
// req.removeAttribute("属性1");
// 监听ServletContext
// req.getServletContext().setAttribute("new", "hello");
// req.getServletContext().setAttribute("new", "hi");
// req.getServletContext().removeAttribute("new");
// 监听Session
// 一秒后移除,但是至少会发生在下一次请求
req.getSession().setMaxInactiveInterval(1);
req.getSession().setAttribute("new", "hello");
req.getSession().setAttribute("new", "hi");
req.getSession().removeAttribute("new");
// 休眠3秒
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("=================================>接受结束");
}
}
ContextListener.java
package listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ContextListener implements ServletContextListener, ServletContextAttributeListener{
// 添加Context属性
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
System.out.println("添加Context属性");
}
// 移除Context属性
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
System.out.println("移除Context属性");
}
// 修改Context属性
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
System.out.println("修改Context属性");
}
// Context销毁
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("Context销毁");
}
// Contrxt创建
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("Contrxt创建");
}
}
RequsetListener.java打开注释部分可以知道页面被访问了多少此
package listener;
import java.util.Date;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
public class RequsetListener implements ServletRequestListener ,ServletRequestAttributeListener{
// 请求销毁执行
public void requestDestroyed(ServletRequestEvent arg0) {
System.out.println("requestDestroyed" + "," + new Date());
// System.out.println("当前访问次数:" + arg0.getServletContext().getAttribute("count"));
}
// 请求响应前执行
public void requestInitialized(ServletRequestEvent arg0) {
System.out.println("requestInitialized" + "," + new Date());
// 用服务器的ServletContext来统计访问次数
// Object count = arg0.getServletContext().getAttribute("count");
// Integer cInteger = 0;
// if (count != null) {
// cInteger = Integer.valueOf(count.toString());
// }
// System.out.println("历史访问次数::" + (count==null?0:count));
// cInteger++;
//
// ServletContext servletContext = arg0.getServletContext();
// servletContext.setAttribute("count", cInteger);
}
// 添加属性执行
public void attributeAdded(ServletRequestAttributeEvent srae) {
HttpServletRequest request = (HttpServletRequest) srae.getServletRequest();
System.out.println("增加'属性1'--->"+request.getAttribute("属性1"));
}
// 移除属性执行
public void attributeRemoved(ServletRequestAttributeEvent srae) {
HttpServletRequest request = (HttpServletRequest) srae.getServletRequest();
System.out.println("删除'属性1'---->"+request.getAttribute("属性1"));
}
// 替换属性执行,值得一提的是,在ServletRequest创建之后,这里会被执行一次,也就是发生了一次修改
public void attributeReplaced(ServletRequestAttributeEvent srae) {
HttpServletRequest request = (HttpServletRequest) srae.getServletRequest();
System.out.println("提换'属性1'---->"+request.getAttribute("属性1"));
}
}
SessionListener.java
package listener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener{
// Session添加
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
System.out.println("Session添加");
}
// Session移除
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("Session移除");
}
// Session替换
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
System.out.println("Session替换");
}
// Session创建
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("Session创建");
}
// Session销毁
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("Session销毁");
}
}
实验效果图
浏览器输入:http://localhost:8089/listener/listener
连续输入两次后(不超过3秒),如图:
监控ServletContext
测试Request,在进入doGet方法前就有一次替换发生了