当前位置: 代码迷 >> 综合 >> ServletContext域对象与 ServletContextListener 实现web访问次数统计
  详细解决方案

ServletContext域对象与 ServletContextListener 实现web访问次数统计

热度:65   发布时间:2023-10-26 13:24:03.0

1. ServletContext 是整个Web的 上下文对象。被Web内的所有Servlet所共享。

2.ServletContextListener 负责监听 ServletContext 的创建和销毁的生命周期。

3.实现原理:

     (1)当tomcat启动时,ServletContextListener第一时间被创建,负责监听 ServletContext的创建与销毁。在监听到ServletContext被创建时,public void contextInitialized(((ServletContextEvent sce))会被调用,在此方法中读取count/count.txt文件,获取访问人数count计数,并且封装到Counter对象, 存储到 全局上下文ServletContext的域中。

   (2) 每当有Servlet的Service(...)方法被调用时,就对访问进行记录。

 (3) 当Web关闭时,ServletContextListener中的 public void contextDestroyed( ServletContextEvent sce )方法被调用,进行计数器的文本存储。

	ServletContextListener监听器	ServletContextListener监听器,能够监听ServletContext对象的生命周期,实际上就是监听Web应用的生命周期;(1) Web应用启动或者关闭时,会发出ServletContextEvent事件,该事件由ServletContextListener来处理。在ServletContextListener接口中定义了处理ServletContextEvent事件的两个方法。1)contextInitialized(ServletContextEvent sce);当Servlet容器启动时Web应用会调用该方法。 然后容器再对Filter初始化,Servlet初始化;2)contextDestroyed(ServletContextEvnet sce);当Servlet容器终止Web应用调用此方法。在调用此方法之前,容器会先销毁所有的Servlet和Filter。(2) 在Web.xml中注册 监听器Listener<listener><listener-class>com.test1.MyServletContextListener</listener-class></listener>		(3) 注册的监听器HttpServletListener会监视所有的Servlet的创建与销毁public class MyServletContextListener implements ServletContextListener  {*  Web应用启动时调用,在Filter之前就被调用
@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("helloApp application is Initialized");//获取ServletContext对象ServletContext context = sce.getServletContext();BufferedReader reader = null;int count = 1;//从文件中读取计数器的值try {String filePath = context.getRealPath("/WEB-INF");filePath = filePath+"/count.txt";File file = new File( filePath );if( file==null || !file.exists() ) {System.out.println("文件不存在");}else {System.out.println("文件存在");}FileInputStream in = new FileInputStream(file);reader = new BufferedReader( new InputStreamReader( in ) );String line = reader.readLine();if( line != null && line.length()>1 ) {System.out.println("line:"+line+"AAAAA"+line.length());count = Integer.parseInt(line);System.out.println("count: "+count);}}  catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {if( reader != null ) {reader.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//创建计数器 仅仅获取一个存储的数值,用来初始化Counter对象Counter counter = new Counter(count);//将计数器保存到Web的ServletContext域中.context.setAttribute("Counter", counter);}*  Web应用关闭时调用,在Filter被销毁之后再被调用@Overridepublic void contextDestroyed(ServletContextEvent sce) {//获取ServletContext对象ServletContext context = sce.getServletContext();Counter counter = (Counter)context.getAttribute("Counter");//存到文件中if( counter != null ) {String filePath = context.getRealPath("/WEB-INF");filePath = filePath+"/count.txt";try {File file = new File(filePath);if( file==null || !file.exists() ) {System.out.println("文件不存在");try {file.createNewFile();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}else {System.out.println("文件存在");}FileOutputStream  outputStream =  new FileOutputStream(file);BufferedWriter  writer = new BufferedWriter( new OutputStreamWriter(outputStream) );try {writer.write(counter.getCount());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {if( outputStream !=null ) {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
   
 *   ServletContext 域对象使用案例:*   		整个Web的访问人数统计ServletContext context = getServletContext();Counter counter = (Counter)context.getAttribute("Counter");//第一次访问if( counter == null ) {counter = new Counter(1);context.setAttribute("Counter", counter);}response.setContentType("text/html;charset=GB2312");PrintWriter out = response.getWriter();out.println("<html><head><title>统计访问次数</title></head>");out.println("<body>");out.println("<h1>欢迎光临本站,您是第 "+counter.getCount()+" 个访问者</h1>");out.println("</body>");counter.add(1);  //计数器+1;




  相关解决方案