Servlet监听器

Servlet中定义了8个监听器接口,可以用于监听ServletContext、HttpSession和ServletRequest对象的生命周期事件,以及这些对象的属性改变事件。
这里写图片描述
这里写图片描述
注意:实现ServletContextListener、ServletContextAttributeListener、HttpSessionListener接口的类需要在web.xml中配置。

HttpSessionAttributeListener接口:用于监听Session中何时添加、删除或替换了某种类型的属性。
HttpSessionBindingListener接口:由属性自身来实现,以便属性知道它自己何时被添加到一个session中。

一、ServletContextListener接口
在Servlet上下文对象初始化时或者将要被销毁时得到通知,可以实现该接口。

public void contextInitialized(ServletContextEvent sce):该方法将在所有的过滤器和Servlet**初始化之前被调用**。
public void contextDestroyed(ServletContextEvent sce):该方法将在所有的Servlet和过滤器销毁之后被调用。

1、自定义监控类,实现ServletContextListener接口
(只要应用程序启动,就会被监控)

//实现ServletContextListener接口的监控类
public class MyServletContextListener implements ServletContextListener {

    //会在servlet上下文对象初始化之前被调用
    public void contextInitialized(ServletContextEvent sce){
        //获得一个上下文对象
        ServletContext servletContext=sce.getServletContext();
        String name=(String) servletContext.getInitParameter("name");
        System.out.println(name);
        System.out.println("初始化之前被调用");
    }

    public void contextDestroyed(ServletContextEvent sce){
        System.out.println("销毁之后被调用");
    }

}

2、具体servlet实现类(用于处理请求)

public class ListenerTest extends HttpServlet {

    public void init(ServletConfig config)throws ServletException{
        System.out.println("servlet初始化");
    }

    @Override
    public void destroy() {
        System.out.println("servlet销毁");
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException{

    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException{
        doGet(request,response);
    }
}

3、web.xml中的配置

 <context-param>
    <param-name>name</param-name>
    <param-value>test listener</param-value>
  </context-param>

<servlet>
    <servlet-name>ListenerTest</servlet-name>
    <servlet-class>org.wdz.listener.ListenerTest</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ListenerTest</servlet-name>
    <url-pattern>/test.jsp</url-pattern>
  </servlet-mapping>

 <!--一定要配置监控类--> 
  <listener>
    <listener-class>org.wdz.listener.MyServletContextListener</listener-class>
  </listener>

4、结果:

//启动Tomcat
test listener
初始化之前被调用
//访问:http://localhost:8080/servletTest/test.jsp
//执行init()初始化方法
servlet初始化
//关闭Tomcat之后
servlet销毁
销毁之后被调用

二、HttpSessionBindingListener接口
如果一个对象实现了HttpSessionBindingListener接口,当这个对象被绑定到Session中或从Session中被删除时,Servlet容器会通知这个对象,而这个对象在接收到通知后,可以做一些初始化或清除状态的操作。

public void valueBound(HttpSessionBindingEvent event);
当对象正被绑定到Session中,Servlet容器调用这个方法来通知该对象。

public void valueUnbound(HttpSessionBindingEvent event)
当从Session中删除对象时,Servlet容器调用这个方法来通知该对象。

1、实现HttpSessionBindingListener接口的User对象

public class User implements HttpSessionBindingListener {
    private String name;
    private int age;

    public User(String name,int age){
        this.name=name;
        this.age=age;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public void valueBound(HttpSessionBindingEvent event){
        System.out.println("user对象绑定到session中");
        //获取该session
        HttpSession session=event.getSession();
        //要绑定到session中属性的名字
        String name=event.getName();
        System.out.println("name="+name);
        //要绑定到session中的属性值
        User user=(User)event.getValue();
        System.out.println("username="+user.getName()+"  age="+user.getAge());

    }
    public void valueUnbound(HttpSessionBindingEvent event){
        System.out.println("user对象从session中删除");
    }

}

2、绑定user对象

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException{
        HttpSession session=request.getSession();
        User user=new User("test",89);
        //绑定User对象
        System.out.println("绑定User对象");
        session.setAttribute("user",user);
        //删除User对象
        System.out.println("删除User对象");
        session.removeAttribute("user");
    }

3、结果

绑定User对象
user对象绑定到session中
name=user
username=test  age=89
删除User对象
user对象从session中删除

三、HttpSessionListener接口
在Session对象创建后或者在Session无效前得到通知:(需要在web.xml中配置)

public class MySessionListener implements HttpSessionListener

四、ServletRequestAttributeListener接口
在Servlet请求对象中的属性发生改变时得到通知:

public class MyRequestAttributeListener implements ServletRequestAttributeListener
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值