参考资料:https://www.jb51.net/article/93748.htm
JavaWEB中的监听器主要监听JavaWEB中的request、session、ServletContext对象的各种变化。
尽量不要定义全局变量,全局变量数据共享,容易造成线程不安全。
主要监听的任务:
1、监听request、ServletContext 、session对象的创建和销毁
1、新建一个普通java类实现以下接口。
2、在web.xml文件中注册监听器类
ServletRequestListener
//web.xml文件中注册监听器
<!--注册针对ServletRequest对象进行监听的监听器-->
<listener>
<description>ServletRequestListener监听器</description>
<listener-class>com.demo.listener.MyServletRequestListener</listener-class>
</listener>
//MyServletRequestListener类实现了ServletRequestListener接口,因此可以对ServletRequest对象的创建和销毁这两个动作进行监听。
public class MyServletRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println(sre.getServletRequest() + "销毁了!!");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println(sre.getServletRequest() + "创建了!!");
}
}
ServletContextListener
<!-- 注册针对ServletContext对象进行监听的监听器 -->
<listener>
<description>ServletContextListener监听器</description>
<!--实现了ServletContextListener接口的监听器类 -->
<listener-class>com.demo.listener.MyServletContextListener</listener-class>
</listener>
//MyServletContextListener类实现了ServletContextListener接口,因此可以对ServletContext对象的创建和销毁这两个动作进行监听。
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext对象创建");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext对象销毁");
}
}
HttpSessionListener
//web.xml文件中注册监听器
<!--注册针对HttpSession对象进行监听的监听器-->
<listener>
<description>HttpSessionListener监听器</description>
<listener-class>com.demo.listener.MyHttpSessionListener</listener-class>
</listener>
<!-- 配置HttpSession对象的销毁时机 -->
<session-config>
<!--配置HttpSession对象的1分钟之后销毁 -->
<session-timeout>1</session-timeout>
</session-config>
//MyHttpSessionListener类实现了HttpSessionListener接口,因此可以对HttpSession对象的创建和销毁这两个动作进行监听。
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println( se.getSession() + "创建了!!");
}
/* HttpSession的销毁时机需要在web.xml中进行配置,如下:
* <session-config>
<session-timeout>1</session-timeout>
</session-config>
这样配置就表示session在1分钟之后就被销毁
*/
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("session销毁了!!");
}
}
2、监听request、session、ServletContext 对象存放的数据变化情况
ServletContextAttributeListener
//web.xml配置监听器
<listener>
<listener-class>com.demo.listener.MyServletContextAttributeListener</listener-class>
</listener>
//ServletContext域对象中属性的变更的事件监听器
package webtest.listener;
import java.text.MessageFormat;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class MyServletContextAttributeListener implements
ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent scab) {
String str =MessageFormat.format(
"ServletContext域对象中添加了属性:{0},属性值是:{1}"
,scab.getName()
,scab.getValue());
System.out.println(str);
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scab) {
String str =MessageFormat.format(
"ServletContext域对象中删除属性:{0},属性值是:{1}"
,scab.getName()
,scab.getValue());
System.out.println(str);
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scab) {
String str =MessageFormat.format(
"ServletContext域对象中替换了属性:{0}的值"
,scab.getName());
System.out.println(str);
}
}
HttpSessionAttributeListener
//web.xml配置监听器
<listener>
<listener-class>com.demo.listener.MyAttributeListener</listener-class>
</listener>
//MyAttributeListener.java
package com.test;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class MyAttributeListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
String attributeName = event.getName();
Object attributeValue = event.getValue();
System.out.println("HttpSessionAttributeListener Attribute added : " + attributeName + " : "
+ attributeValue);
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
String attributeName = event.getName();
Object attributeValue = event.getValue();
System.out.println("HttpSessionAttributeListener Attribute removed : " + attributeName + " : "
+ attributeValue);
}
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
String attributeName = event.getName();
Object attributeValue = event.getValue();
System.out.println("Attribute replaced : " + attributeName + " : "
+ attributeValue);
}
}
ServletRequestAttributeListener
//web.xml配置
<!-- 自定义ServletRquestListener的监听 -->
<listener>
<listener-class>com.demo.listener.ServletRquestListeners</listener-class>
</listener>
/**
* Request请求时调用这个监听
*/
public class ServletRquestListeners implements ServletRequestListener,ServletRequestAttributeListener
{
//这个是在请求后调用
public void requestDestroyed(ServletRequestEvent s)
{
System.out.println("销毁了ServletReqeust");
}
//它是在请求前调用
public void requestInitialized(ServletRequestEvent s)
{
ServletRequest servletRequest = s.getServletRequest();
HttpServletRequest request = (HttpServletRequest) servletRequest;
String pathInfo = request.getServletPath();
System.out.println("请求地址:"+pathInfo);
}
public void attributeAdded(ServletRequestAttributeEvent srae)
{
HttpServletRequest request = (HttpServletRequest) srae.getServletRequest();
System.out.println("增加request--->"+request.getAttribute("requestName"));
}
public void attributeRemoved(ServletRequestAttributeEvent srae)
{
HttpServletRequest request = (HttpServletRequest) srae.getServletRequest();
System.out.println("删除request--->"+request.getAttribute("requestName"));
}
public void attributeReplaced(ServletRequestAttributeEvent srae)
{
HttpServletRequest request = (HttpServletRequest) srae.getServletRequest();
System.out.println("提换request--->"+request.getAttribute("requestName"));
}
}
3、监听session中保存的JavaBean的状态
HttpSessionBindingListener
public class TestListener implements HttpSessionBindingListener{
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("HttpSessionBindingListener.valueBound");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("HttpSessionBindingListener.valueUnbound");
}
}