监听器

监听器: 运行在服务器端的程序, 主要用于监听request, application, session这三个对象, 比如这三个对象的创建和销毁, 修改属性等一系列的操作
监听器的配置
创建类实现关于监听器的那些接口
public class TestListener implements ...Listener... {
...实现其中的方法
}

web.xml中的配置
<listener>
<listener-class>定义监听器的类的全路径名</listener-class>
</listener>

使用注解的方式:
@WebListener写在类名的上面

多个监听器的加载顺序
按照web.xml的配置顺序来加载各个监听器
如果在web.xml中配置有监听器, 过滤器, Servlet时, 他们的优先级分别为
监听器 > 过滤器 > Servlet

ServletContext对象的监听
在web.xml中有这样一个标签:
<context-param>
<param-name>初始化的参数名</param-name>
<param-value>初始化的参数值</param-value>
</context-param>

在监听器中可以使用参数对象来获取这个初始化参数
String value = applicationEvent.getServletContext().getInitParameter("hanqi");
HttpSession对象的监听
session在一个用户第一次访问这个页面的时候被创建, session的实例可以创建多个, 有一个用户访问, 就会创建一个session
回忆一下session的过期时间怎么配置
用途: 统计在线人数, 网站的用户访问量

HttpServletRequest对象的监听
只要有请求发送过来, 就会执行监听器中的init()方法和destory()方法
用途: 读取参数, 记录访问历史

3.0版本之后的监听器只需要加上一个@WebListenner注解就可以使用, 但是跟之前在web.xml中配置的时候相比, 有一个缺点, 无法确定监听器的加载顺序

 

 

TestApplicationListener.java

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class TestApplicationListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        System.out.println("application对象销毁");
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        System.out.println("创建application对象");
    }

}

TestRequestListener.java

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;

public class TestRequestListener implements ServletRequestListener {

    @Override
    public void requestDestroyed(ServletRequestEvent arg0) {
        System.out.println("request对象被销毁了");
    }

    @Override
    public void requestInitialized(ServletRequestEvent arg0) {
        System.out.println("初始化request对象");
    }

}
TestSessionListener.java
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class TestSessionListener implements HttpSessionListener {

    private int userCount;
    
    @Override
    public void sessionCreated(HttpSessionEvent sessionEvent) {
        userCount++;
        sessionEvent.getSession().getServletContext().setAttribute("userCount", userCount);
        System.out.println("创建session对象");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent sessionEvent) {
        userCount--;
        sessionEvent.getSession().getServletContext().setAttribute("userCount", userCount);
        System.out.println("session对象被销毁了");
    }

}
TestRequestAttributeListener.java
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;

public class TestRequestAttributeListener implements ServletRequestAttributeListener {

    @Override
    public void attributeAdded(ServletRequestAttributeEvent arg0) {
        System.out.println("request对象添加属性");
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent arg0) {
        System.out.println("移除request属性");
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent arg0) {
        System.out.println("替换request属性");
    }

}

index.jsp

<hr>
当前在线人数: <%=application.getAttribute("userCount") %>
<hr>

posted @ 2017-08-27 22:06  挽你何用  阅读(233)  评论(0编辑  收藏  举报