Servlet 监听器

什么是监听器

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添加监听器

    <listener>
        <listener-class>com.jstu.test.ListenerAble</listener-class>
    </listener>

部署项目,重启服务器

猜你喜欢

转载自blog.csdn.net/qq_26024867/article/details/81152456
今日推荐