学习笔记:年、日、月,周访问量统计

 学习笔记:年、日、月,周访问量统计

学习别人的心得:

------------- 

应某位同学的要求,发布了这个源码,即下面的tt.jar文件,直接放到TOMCAT下面就可以用了

-------------

突然接到一个任务,要用JSP实现一个访问量计数器。无从下手,于是从网络上找,找到了这篇文章,果然同大多数网络文章一样,东西是对的,是好的,但东西就是不发全,很多JAR包还有XML都没发上来,完全没法用。加入我的附件中的JAR包,然后配上初使的XML,即可实现。

 

初使的xmlcount.xml

<?xml version="1.0" encoding="UTF-8"?>
<xml-body>

</xml-body>

 --------serializer.jar和xerceslmpl.jar一定要引入进来,要不然你效果可以实现,但是文件会写不进去,这样服务器关掉之后就取不到数据了。XMLCOUNT.XML里面会是空的

-------------------http://www.blogjava.net/hilor/archive/2009/04/03/135486.html 
    看了champion的文章《灵活的计数器的设计与实现》与源码,(这篇文章在 http://champion.ewuxi.com/old/opensource/my/count.htm),就做了这个练习。用session来计数,它是将访问量保存在一个xml文件中,读写xml文件用的是Castor。

一、这是jsp调用页testcount.jsp

<%@ page import="java.util.Date" %>
<%@ page import="count.CountXml" %>

计算器测试<br>
<%
       CountXml xmlcount=CountXml.getInstance();
  
     if (session.isNew()){
      xmlcount.addcount(new Date());//增加访问量
      int n =xmlcount.getTotalCount();//取总访问量 
      String count=Integer.toString(n);
      session.putValue("count",count); 
      
     } 

%>
您是第<font color="red"><%=session.getValue("count")%></font>位访问者 <br>  
    
总访问量:  <%=xmlcount.getTotalCount() %><br>
本年访问量:<%=xmlcount.getYearCount() %><br>
本月访问量:<%=xmlcount.getMonthCount() %><br>
本周访问量:<%=xmlcount.getWeekCount() %><br>
本日访问量:<%=xmlcount.getDayCount() %><br>

二、用到的两个类
1、CountXml.java

package count;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStream;
import java.util.Properties;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.Calendar;


import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;

public class CountXml{
        private String fileName = "h:\\Tomcat 5.0\\webapps\\zz3zcwbwebhome\\WEB-INF\\xmlcount.xml";
        private static CountObjectInf obj=null;
        private static CountXml instance=null;
       
         public static CountXml getInstance(){
             if(instance==null){
                     instance=new CountXml();
              }
              return instance;
          }

private CountXml() {
         try{
              obj=read(fileName);
         }catch(Exception e){
              System.out.println(e);
         }
         

}

     public int getTotalCount(){
         return obj.getTotalCount();
     }

     public int getDayCount() {
return obj.getDayCount();
}


public int getMonthCount() {
return obj.getMonthCount();
}


public int getWeekCount() {
return obj.getWeekCount();
}


public int getYearCount() {
return obj.getYearCount();
}

public synchronized void addcount(Date da){//比较日期增加计数

             if (new SimpleDateFormat("yyyy-MM-dd").format(this.obj.date)
                           .equals(new SimpleDateFormat("yyyy-MM-dd").format(da)))
                this.obj.setDayCount(this.obj.getDayCount() + 1);
            else
                this.obj.setDayCount(1);

            if (new SimpleDateFormat("yyyy-MM").format(this.obj.date)
                            .equals(new SimpleDateFormat("yyyy-MM").format(da)))
                this.obj.setMonthCount(this.obj.getMonthCount() + 1);
            else
                obj.setMonthCount(1);

            Calendar ca = Calendar.getInstance();
            ca.setTime(da);
            ca.setFirstDayOfWeek(Calendar.MONDAY);

            if (ca.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY && !new SimpleDateFormat("yyyy-MM-dd").format(this.obj.date).equals(new SimpleDateFormat("yyyy-MM-dd").format(da)))
                 obj.setWeekCount(1);
            else
                 obj.setWeekCount(obj.getWeekCount() + 1);

            if (new SimpleDateFormat("yyyy").format(this.obj.date)
                         .equals(new SimpleDateFormat("yyyy").format(da)))
                this.obj.setYearCount(this.obj.getYearCount() + 1);
           else
                obj.setYearCount(1);
           obj.setDate(da);

   obj.setTotalCount(obj.getTotalCount()+1); 
           obj.setTempCount(obj.getTempCount()+1);
           if(obj.getTempCount()>=20){//只有当临时访问量大于等于20时才保存一次
                     obj.setTempCount(0);//临时计数器置0
                      write(fileName);
                      
           }
        }

private void write(String fileName) {
                try {
                        FileWriter writer = new FileWriter(fileName);
                        Marshaller.marshal(obj, writer);
                        writer.close();
                } catch (Exception e) {
                        System.out.println(e);

                }
        }

        private CountObjectInf read(String fileName) throws Exception {
                FileReader reader = new FileReader(fileName);
                CountObjectInf result = (CountObjectInf) 

Unmarshaller.unmarshal(CountObjectInf.class, reader);
                reader.close();
                return result;
         }
}

2、

package count;

import java.util.Date;
public class CountObjectInf {
// 总访问量合计
protected int totalCount = 0;
//日访问量
protected int dayCount = 0;
//周访问量
protected int weekCount = 0;
// 月访问量
protected int monthCount = 0;
//年访问量
protected int yearCount = 0;

//临时访问量
protected int tempCount=0;

protected Date date =new Date();

/**
 * @return
 */
public int getDayCount() {
return dayCount;
}

/**
 * @return
 */
public int getMonthCount() {
return monthCount;
}

/**
 * @return
 */
public int getTotalCount() {
return totalCount;
}

/**
 * @return
 */
public int getWeekCount() {
return weekCount;
}

/**
 * @return
 */
public int getYearCount() {
return yearCount;
}

/**
 * @param i
 */
public void setDayCount(int i) {
dayCount = i;
}

/**
 * @param i
 */
public void setMonthCount(int i) {
monthCount = i;
}

/**
 * @param i
 */
public void setTotalCount(int i) {
totalCount = i;
}

/**
 * @param i
 */
public void setWeekCount(int i) {
  weekCount = i;
}

/**
 * @param i
 */
public void setYearCount(int i) {
  yearCount = i;
}



/**
 * @return
 */
public Date getDate() {
  return date;
}

/**
 * @param date
 */
public void setDate(Date date) {
  this.date = date;
}

/**
 * @return
 */
public int getTempCount() {
   return tempCount;
}

/**
 * @param i
 */
public void setTempCount(int i) {
  tempCount = i;
}

}

已标记关键词 清除标记
相关推荐
程序员的必经之路! 【限时优惠】 现在下单,还享四重好礼: 1、教学课件免费下载 2、课程案例代码免费下载 3、专属VIP学员群免费答疑 4、下单还送800元编程大礼包 【超实用课程内容】  根据《2019-2020中国开发者调查报告》显示,超83%的开发者都在使用MySQL数据库。使用量大同时,掌握MySQL早已是运维、DBA的必备技能,甚至部分IT开发岗位也要求对数据库使用和原理有深入的了解和掌握。 学习编程,你可能会犹豫选择 C++ 还是 Java;入门数据科学,你可能会纠结于选择 Python 还是 R;但无论如何, MySQL 都是 IT 从业人员不可或缺的技能!   套餐中一共包含2门MySQL数据库必学的核心课程(共98课时)   课程1:《MySQL数据库从入门到实战应用》   课程2:《高性能MySQL实战课》   【哪些人适合学习这门课程?】  1)平时只接触了语言基础,并未学习任何数据库知识的人;  2)对MySQL掌握程度薄弱的人,课程可以让你更好发挥MySQL最佳性能; 3)想修炼更好的MySQL内功,工作中遇到高并发场景可以游刃有余; 4)被面试官打破沙锅问到底的问题问到怀疑人生的应聘者。 【课程主要讲哪些内容?】 课程一:《MySQL数据库从入门到实战应用》 主要从基础篇,SQL语言篇、MySQL进阶篇三个角度展开讲解,帮助大家更加高效的管理MySQL数据库。 课程二:《高性能MySQL实战课》主要从高可用篇、MySQL8.0新特性篇,性能优化篇,面试篇四个角度展开讲解,帮助大家发挥MySQL的最佳性能的优化方法,掌握如何处理海量业务数据和高并发请求 【你能收获到什么?】  1.基础再提高,针对MySQL核心知识点学透,用对; 2.能力再提高,常工作中的代码换新貌,不怕问题; 3.面试再加分,巴不得面试官打破沙锅问到底,竞争力MAX。 【课程如何观看?】  1、登录CSDN学院 APP 在我的课程中进行学习; 2、移动端:CSDN 学院APP(注意不是CSDN APP哦)  本课程为录播课,课程永久有效观看时长 【资料开放】 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化。  下载方式:电脑登录课程观看页面,点击右侧课件,可进行课程资料的打包下载。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页