Servlet窃听器

原创
小哥 3年前 (2022-11-17) 阅读数 111 #大杂烩

什么是监听器

Servlet中的监听器类似于java swing中的监听器,都是需要重写某一种监听事件接口。就是对于某些事件发生时候,比如ServletContext创建的时候,或者毁灭的时候,去调用对应的代码。

类似的,比如,我需要统计完成一个页面访问次数的页面,我们可能会想到用ServletContext来做,但是我们在存储访问次数到数据库的时候,为了避免数据库被频繁调用(例如页面一有人访问就让数据库对应的字段加一),这需要耗费大量的内存和时间,所以我们可以采用在这个servlet被初始化的时候(就是服务器启动的时候,第一访问该servlet时,会先调用里面的init方法),我们可以在这个init方法里面写上从数据库取数据的代码,将这个数据放到内存中,每次访问就加一,然后再destroy的时候,去将它写入数据库,这样就避免数据库的频繁调用。

但是,这样的话,万一要统计的servlet页面一多,所重复的代码也就越多,所以,servlet中引入了监听器的概念,监听器分几种类型。

ServletContext对象监听器
ServletContext对象属性监听器
HttpSession对象监听器
HttpSession对象属性监听器
HttpServletRequest对象监听器
HttpServletRequest对象属性监听器

我们就拿SevletContextListener去举个例子。

创建监听器步骤

1.实现你所需要的监听器的接口代码

2.给你的项目添加监听器

实际上,也就这两步,下面是代码,使用监听器来统计页面访问次数。

因为使用数据库代码太过于长了,我这里就直接访问文件,然后将数据写入文件来实现访问次数的存取。

重写监听器接口代码,当context被初始化时,就是说当服务器被启动时候,将文件times.txt里面的数据写入到context中。

当服务器关闭时,context对象也会被销毁,因此调用destroy方法,将context中的num数据写入文本times.txt中。

当然,不要忘记req和res中设置字符编码为utf-8,我这里是使用了过滤器去过滤的,因此我没有设置,但是你需要。

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ListenerAble implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        ServletContext context = arg0.getServletContext();
        String num = (String) context.getAttribute("num");
        FileWriter writer;
        try {
            writer = new FileWriter("G:\aaa\times.txt");
            writer.write(num);
            writer.flush();
            writer.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        try {
            FileReader reader = new FileReader("G:\aaa\times.txt");
            BufferedReader bReader = new BufferedReader(reader);
            int number= Integer.parseInt(bReader.readLine());

            ServletContext context = arg0.getServletContext();
            context.setAttribute("num",String.valueOf(number));
            bReader.close();
            reader.close();

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

下面是显示访问次数的页面,我就只写了里面的get方法

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

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        ServletContext context =this.getServletContext();
        String str = (String) context.getAttribute("num");
        int a = Integer.parseInt(str);
        a++;
        context.setAttribute("num", String.valueOf(a));
        out.println("这是第"+a+"次访问");

        out.flush();
        out.close();
    }

然后我们在web.xml里为tomcat添加监听器

    
        com.jstu.test.ListenerAble
    

部署项目,重启服务器

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除