JSP:访客计数实现的几种方式利与弊

一:同时利用application对象和session对象来统计

    这种方法的原理是从打开浏览器到关闭浏览器算是访问一次。优点:刷新、返回等操作不算做一次访问缺陷:当jsp服务器从新启动时,数据也被清零了。

    代码片段:

<body>

     <div>

      <% if(application.getAttribute("count") == null){

            application.setAttribute("count", new Integer(0));

         }

         if(session.isNew()){

            int count = (Integer)application.getAttribute("count");

            count++;

            application.setAttribute("count",count);

         }

       %>

       <font color="red" >到目前为止已有<%=application.getAttribute("count") %>客户访问该网页</font>

     </div>

     <br>

 </body>

二:将统计数据存储在本地的文件当中

    例如一个简单的txt文件。优点:不用担心服务器重启带来的清零烦恼;缺点:影响服务器端响应客户端请求的时间。

   代码片段:

创建一个类:JSPCount


[java]
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;


public class JSPCount {
   //写入文件的方法  
   public static void write2File(String filename, long count){
       try{
           PrintWriter out = new PrintWriter(new FileWriter(filename));
           out.println(count);
           out.close();
       } catch (IOException e) {
           // TODO: handle exception  
           e.printStackTrace();
       }
   }

   //读文件的方法  
   public static long readFromFile(String filename){
       File file = new File(filename);
       long count = 0;
       if(!file.exists()){
           try {
               file.createNewFile();
           } catch (IOException e) {
               // TODO Auto-generated catch block  
               e.printStackTrace();
           }
           write2File(filename, 0);
       }
       try{
           BufferedReader in = new BufferedReader(new FileReader(file));
           try{
               count = Long.parseLong(in.readLine());
           }
           catch (NumberFormatException e) {
               // TODO: handle exception  
               e.printStackTrace();
           } catch (IOException e) {
               // TODO Auto-generated catch block  
               e.printStackTrace();
           }
       } catch (FileNotFoundException e) {
           // TODO: handle exception  
           e.printStackTrace();
       }
       return count;
   }
}

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;


public class JSPCount {
//写入文件的方法
public static void write2File(String filename, long count){
 try{
  PrintWriter out = new PrintWriter(new FileWriter(filename));
  out.println(count);
  out.close();
 } catch (IOException e) {
  // TODO: handle exception
  e.printStackTrace();
 }
}

//读文件的方法
public static long readFromFile(String filename){
 File file = new File(filename);
 long count = 0;
 if(!file.exists()){
  try {
   file.createNewFile();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  write2File(filename, 0);
 }
 try{
  BufferedReader in = new BufferedReader(new FileReader(file));
  try{
   count = Long.parseLong(in.readLine());
  }
  catch (NumberFormatException e) {
   // TODO: handle exception
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 } catch (FileNotFoundException e) {
  // TODO: handle exception
  e.printStackTrace();
 }
 return count;
}
}



在WebRoot目录下建jsp文件:count.jsp

[plain]
<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<%@ page import="org.wwj.count.JSPCount" %>
<html>
 <head>
   <title>java 计数器程序</title>
 </head>
 <body>
 <%
   JSPCount CountFileHandler = new JSPCount();
   //读取文件
   long count = CountFileHandler.readFromFile(request.getRealPath("/")  + "count.txt");
   count = count + 1;  //修改记录 +1
   out.print(count);   //显示数据
   //更新文件内容。
   CountFileHandler.write2File(request.getRealPath("/")  + "count.txt", count);

  %>
 </body>
 </html>

<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<%@ page import="org.wwj.count.JSPCount" %>
<html>
 <head>
   <title>java 计数器程序</title>
 </head>
 <body>
 <%
  JSPCount CountFileHandler = new JSPCount();
  //读取文件
  long count = CountFileHandler.readFromFile(request.getRealPath("/")  + "count.txt");
  count = count + 1; //修改记录 +1
  out.print(count); //显示数据
  //更新文件内容。
  CountFileHandler.write2File(request.getRealPath("/")  + "count.txt", count);

  %>
 </body>
 </html>
程序运行之后会在tomcat下的webapps目录下的对应的web项目生成一个count.txt文本文件



4.第三种方法,只是保存了访问的统计数据罢了,但没有保证刷新页面的时候不会自增,这样还是不好。当然总会有解决的办法的,一般的解决方案就是结合各种方案的优点。下面是由session对象+application对象+txt文本来实现网站的访问统计。

[java]
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServlet;

public class Counter extends HttpServlet{
   //写入文件的方法  
   public static void write2File(String filename, long count){
       try{
           PrintWriter out = new PrintWriter(new FileWriter(filename));
           out.println(count);
           out.close();
       } catch (IOException e) {
           // TODO: handle exception  
           e.printStackTrace();
       }
   }

   //读文件的方法  
   public static long readFromFile(String filename){
       File file = new File(filename);
       long count = 0;
       if(!file.exists()){
           try {
               file.createNewFile();
           } catch (IOException e) {
               // TODO Auto-generated catch block  
               e.printStackTrace();
           }
           write2File(filename, 0);
       }
       try{
           BufferedReader in = new BufferedReader(new FileReader(file));
           try{
               count = Long.parseLong(in.readLine());
           }
           catch (NumberFormatException e) {
               // TODO: handle exception  
               e.printStackTrace();
           } catch (IOException e) {
               // TODO Auto-generated catch block  
               e.printStackTrace();
           }
       } catch (FileNotFoundException e) {
           // TODO: handle exception  
           e.printStackTrace();
       }
       return count;
   }
}

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServlet;

public class Counter extends HttpServlet{
//写入文件的方法
public static void write2File(String filename, long count){
 try{
  PrintWriter out = new PrintWriter(new FileWriter(filename));
  out.println(count);
  out.close();
 } catch (IOException e) {
  // TODO: handle exception
  e.printStackTrace();
 }
}

//读文件的方法
public static long readFromFile(String filename){
 File file = new File(filename);
 long count = 0;
 if(!file.exists()){
  try {
   file.createNewFile();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  write2File(filename, 0);
 }
 try{
  BufferedReader in = new BufferedReader(new FileReader(file));
  try{
   count = Long.parseLong(in.readLine());
  }
  catch (NumberFormatException e) {
   // TODO: handle exception
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 } catch (FileNotFoundException e) {
  // TODO: handle exception
  e.printStackTrace();
 }
 return count;
}
}


jsp文件代码:

[plain]
<%@page import="org.servlet.count.Counter"%>
<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<html>
   <head>
       <title>java 计数器程序</title>
   </head>
   <body>
   <%
   Counter CountFileHandler = new Counter();
   long count = 0;
   if(application.getAttribute("count") == null){
       count = CountFileHandler.readFromFile(request.getRealPath("/") + "count.txt");
       application.setAttribute("count", new Long(count));
   }    
   count = (Long)application.getAttribute("count");
   if(session.isNew()){
       count++;
       application.setAttribute("count", count);
       //更新文件目录
       CountFileHandler.write2File(request.getRealPath("/") + "count.txt",count);
       }
   %>
   访问人数:<%=count %>
       </body>
</html>

<%@page import="org.servlet.count.Counter"%>
<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<html>
<head>
 <title>java 计数器程序</title>
</head>
<body>
<%
  Counter CountFileHandler = new Counter();
  long count = 0;
if(application.getAttribute("count") == null){
 count = CountFileHandler.readFromFile(request.getRealPath("/") + "count.txt");
 application.setAttribute("count", new Long(count));
}  
count = (Long)application.getAttribute("count");
if(session.isNew()){
 count++;
 application.setAttribute("count", count);
 //更新文件目录
 CountFileHandler.write2File(request.getRealPath("/") + "count.txt",count);
 }
%>
访问人数:<%=count %>
 </body>
</html>


本文出自 “8456901” 博客,谢绝转载!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。