JSP实现网页访问统计

最近学习Jave EE 中的jsp网页开发,需要实现网页访问量的统计,刚开始不知道如何实现,后来问了一下老师,老师是这样回答我的:要实现网页访问的统计,你可以利用application对象来实现,不能用seesion对象,因为session是属于同一个会话的,关掉浏览器数据就没有了,而application是在同一浏览器下的,只要是同一个浏览器,将数据保存在applicaiton对象中,这样就可以保证数据的不变性。其实这些我都懂,我只是不知道如何在jsp用代码实现。后来我只能上网看看有没有具体的解决方案,搜了很久,没有我想要的答案,我想要实现的只是简单的统计,没有实现更加复杂的功能。后来还是在CSDN这里找到了答案,在这里简单总结一下实现网页访问统计的几种方法:
1. 利用application对象进行统计,得到的效果是每进入一次该网页就统计一次。但效果不怎么好,因为一般统计网页访问量,刷新是不算进统计里的,这里就是这种缺点。
具体实现是:

<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<html>
 <head>
 <title>java 计数器程序</title>
 </head>
 <body>
 <%
 if (application.getAttribute("count") == null) {
  application.setAttribute("count", new Integer(0));
 }
 Integer count = (Integer) application.getAttribute("count");
 application
   .setAttribute("count", new Integer(count.intValue() + 1));
 count = (Integer) application.getAttribute("count");
 %>
  <center>这是第<%=count.intValue()%>个访问者</center>
 </body>
 </html>

2.为了解决上面的问题,有了另一种方法,就是同时利用application对象和session对象来统计,这种方法的原理是从打开浏览器到关闭浏览器算是访问一次,刷新、返回等操作不算做一次访问。但还是有缺陷,当jsp服务器从新启动时,数据也被清零了。
下面还是具体实现:

<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<html>
 <head>
 <title>java 计数器程序</title>
 </head>
 <body>
 <%
 int n = 0; String counter = (String)application.getAttribute("counter");
 if(counter != null){
  n = Integer.parseInt(counter);
 }
 if(session.isNew())
  ++n;
 %>
  <center>这是第<%out.print(n);%>个访问者</center>
  <%
  counter = String.valueOf(n);
  application.setAttribute("counter", counter);
   %>
 </body>
 </html> 

3. 第三种方法是将统计数据存储在本地的文件当中,比如存储在一个txt文件当中。
这是为了解决重启服务器之后数据不用担心会丢失。
创建一个类:JSPCount

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

<%@ 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文本来实现网站的访问统计。

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文件代码:

<%@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> 

以上四种方法,是每一次改进才得到的方法,如果要实现网站访问统计,当然最后一种是最好的,知识不是一步登天,需要在问题上不断改进,获得最终的解决方案,当然最后一种不一定是最好的,实现策略上,如果可以利用数据库也是可以的,但我认为每次访问网站都要读和写数据库,这样效率就降低了。

(0)

相关推荐

  • JavaScript实现网站访问次数统计代码

    作为一个网站的管理员或者说站长,都希望知道到底有多少人访问了网站,这个时候就需要有一个统计功能来满足需要,当然功能比较单一和简单,如果想要强大的统计效果,那最好还是使用现在比较成熟的统计工具,比如站长统计或者腾讯统计等等. 代码一: 代码如下: <script type="text/javascript"> var caution=false function setCookie(name,value,expires,path,domain,secure) { var cu

  • JS实现统计复选框选中个数并提示确定与取消的方法

    本文实例讲述了JS实现统计复选框选中个数并提示确定与取消的方法.分享给大家供大家参考.具体实现方法如下: javascript部分如下: <script type="text/javascript"> function yesno() { var inputs = document.getElementsByName("ck[]"); var checked_counts = 0; for(var i=0;i<inputs.length;i++){

  • JavaScript统计字符串中每个字符出现次数完整实例

    本文实例讲述了JavaScript统计字符串中每个字符出现次数的方法.分享给大家供大家参考,具体如下: 这是一个面试题,要求随便给你一个字符串,让你求出字符串中每个字符出现的次数. 先来看看运行效果截图: 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&

  • js实现统计字符串中特定字符出现个数的方法

    本文实例讲述了js实现统计字符串中特定字符出现个数的方法.分享给大家供大家参考,具体如下: //js统计字符串中包含的特定字符个数 function getPlaceholderCount(strSource) { //统计字符串中包含{}或{xxXX}的个数 var thisCount = 0; strSource.replace(/\{[xX]+\}|\{\}/g, function (m, i) { //m为找到的{xx}元素.i为索引 thisCount++; }); return th

  • javascript实现动态统计图开发实例

    本文实例讲述了javascript实现动态统计图的代码.分享给大家供大家参考.具体如下: 运行效果截图如下: 具体代码如下 html代码: <div id="content"> <div class="legend"> <h1>汽车销量:</h1> <div class="skills"> <ul> <li class="jq">大众</

  • JS基于cookie实现来宾统计记录访客信息的方法

    本文实例讲述了JS基于cookie实现来宾统计记录访客信息的方法.分享给大家供大家参考.具体如下: 这里使用JavaScript记录访客的来宾信息,记录是第几次来访,显示的信息有:您的名字;您浏览该网页的次数;您上次浏览网页的时间.可以更改姓名. 运行效果如下图所示: 具体代码如下: <html> <head> <title>记录客户信息</title> <script language="JavaScript"> <!

  • javascript实现用户点击数量统计

    在微信上做一次推广活动,页面共计三个按钮,需要分别统计点击次数,pc上的相关统计用的是"百度统计",因为H5活动页的时效性等原因,并没有使用百度统计,而是自己实现一个简单的统计小方案:前端点击时请求一个空白小gif图,带有参数,后端同事根据nginx请求日志做统计,通过在cookie中存入一个不会重叠的时间戳作为key值来区分是否同一用户(uv). 请求的图片存在七牛中,是固定不变的,主要变化是后面两个参数:用户标识uid和按钮标识,其中生成不重复(把重复率降到最低)的用户标识很有意思

  • Javascript实现字数统计

    字数统计功能,原理是给textarea添加onKeyup事件,事件读取textarea内容并获得长度,并赋值给统计字数的那个文本节点,这里有一点要注意的是添加onKeypress和onKeydown事件也能实现效果,但都有些不足,会在某些情况下造成误解,我都试了下,感觉只用一个onKeyup事件是最明智的选择. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title&g

  • JavaScript统计网站访问次数的实现代码

    本文实例讲述了JavaScript统计网站访问次数的实现代码.分享给大家供大家参考.具体如下: 运行效果截图如下: 完整代码: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>New Page 5</title> <meta name="GENERATOR&qu

  • javascript实现的网站访问量统计代码

    网站一般都有访问量统计工具,比较高效实用的工具多种多样,并且非常的精确.实用javascript也可以简单的实现此功能,尽管没有网络上常用的精确,不过的确也实现了一定的功能,下面就是一段代码实例,感兴趣的朋友可以参考一下: 废话不多说了,直接给大家贴js代码了. <script type="text/javascript"> /** * vlstat 浏览器统计脚本 */ var statIdName = "vlstatId"; var xmlHttp;

随机推荐