什么是监听器
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>
部署项目,重启服务器