一:准备工作,引入相关依赖:

二:运行效果图:

下一次访问

三:具体代码如下

 (1):CountObjectInfo.java

 package cn.csrc.base.count;

 import java.util.Date;

 public class CountObjectInfo {

     // 总访问量合计
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(); public int getDayCount() {
return dayCount;
} public int getMonthCount() {
return monthCount;
} public int getTotalCount() {
return totalCount;
} public int getWeekCount() {
return weekCount;
} public int getYearCount() {
return yearCount;
} public void setDayCount(int i) {
dayCount = i;
} public void setMonthCount(int i) {
monthCount = i;
} public void setTotalCount(int i) {
totalCount = i;
} public void setWeekCount(int i) {
weekCount = i;
} public void setYearCount(int i) {
yearCount = i;
} public Date getDate() {
return date;
} public void setDate(Date date) {
this.date = date;
} public int getTempCount() {
return tempCount;
} public void setTempCount(int i) {
tempCount = i;
} }

(2):CountXml.java:

 package cn.csrc.base.count;

 import java.io.FileReader;
import java.io.FileWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date; import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller; public class CountXml { /** 在这里定义XMLCOUNT.XML的绝对路径,注意此处代码要修改的哦 */
private String fileName = "D:\\mytools\\eclipse_new\\D\\workspace\\requestCount\\WebContent\\WEB-INF\\xmlcount.xml"; private static CountObjectInfo 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 int getTempCount() {
return obj.getTempCount();
} 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() >= 0) {// 只有当临时访问量大于等于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 CountObjectInfo read(String fileName) throws Exception {
FileReader reader = new FileReader(fileName);
CountObjectInfo result = (CountObjectInfo) Unmarshaller.unmarshal(
CountObjectInfo.class, reader);
reader.close();
return result;
} }

(3):具体页面index.jsp:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>
<%@ page import="cn.csrc.base.count.CountXml" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>统计用户年/月/周/日网站访问量测试</title>
</head>
<body>
浏览器访问测试
<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>
临时访问量:<%=xmlcount.getTempCount()%><br>
</body>
</html>

(4):xmlcount.xml文件的初始内容如下: (放在WEB_INF目录下)

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

至此就结束了!

Java统计用户年/月/周/日网站访问量的更多相关文章

  1. c3p0数据库连接池 原创: Java之行 Java之行 5月8日 一、连接池概述 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程

    c3p0数据库连接池 原创: Java之行 Java之行 5月8日 一.连接池概述 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程 DB连接池HikariCP为什么如此快 原创: D ...

  2. Java语言学习day33--8月8日

    今日内容介绍1.基本类型包装类2.System类3.Math类4.Arrays类5.大数据运算 ###01基本数据类型对象包装类概述 *A:基本数据类型对象包装类概述 *a.基本类型包装类的产生 在实 ...

  3. Java语言学习day32--8月07日

    ###07正则表达式邮箱地址验证 * A: 正则表达式邮箱地址验证 * a: 案例代码 public class RegexDemo2 { public static void main(String ...

  4. Java语言学习day07--7月6日

    今日内容介绍1.流程控制语句switch2.数组 ###01switch语句解构​ * A:switch语句解构 * a:switch只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码. * ...

  5. java试题复盘——11月25日

    上: 11.下列表述错误的是?(D) A.int是基本类型,直接存数值,Integer是对象,用一个引用指向这个对象. B.在子类构造方法中使用super()显示调用父类的构造方法,super()必须 ...

  6. java试题复盘——11月13日

    上: 10. AccessViolationException异常触发后,下列程序的输出结果为(   A   ) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 AccessViol ...

  7. java试题复盘——9月26日

    5.在 JAVA 编程中, Java 编译器会将 Java 程序转换为(A) A.  字节码 B.  可执行代码 C.  机器代码 D.  以上都不对 解析: 编译器将Java源代码编译成字节码cla ...

  8. java试题复盘——9月8日

    上: 1.可将语句块或方法设为同步使用的语句是(A) A synchronized              用于方法或者代码块前,使此方法或者代码变成同步的 B static             ...

  9. Java语言学习day01--6月28日

    Java语言学习day01一:Java概述 1.Java语言发展史 任职于太阳微系统的 詹姆斯·高斯林 等人于1990年代初开发Java语言的雏形,最初被命名为 Oak ,目标设置在 家用电器等小型系 ...

随机推荐

  1. 使用idrac远程管理卡操作安装Centos

    浏览器打开远程管理网卡地址(浏览器建议用IE,本次用的IE11,其他浏览器可能不能用) 1.首先设置虚拟控制台插件类型(推荐该为本地) 点击启动后,可能会弹窗,选择允许 2.添加镜像 创建虚拟介质 连 ...

  2. 【Kafka】《Kafka权威指南》入门

    发布与订阅消息系统 在正式讨论Apache Kafka (以下简称Kafka)之前,先来了解发布与订阅消息系统的概念, 并认识这个系统的重要性.数据(消息)的发送者(发布者)不会直接把消息发送给接收 ...

  3. 获取.net应用的版本及依赖信息

    在制作打包安装器时,通常要获取要安装的程序的名称.版本.说明,以及依赖的版本信息,经过翻阅MSDN,stackoverflow,终于搞定了. 1. 获取应用的依赖信息 var ans = System ...

  4. Luogu P2973 [USACO10HOL]赶小猪Driving Out the Piggi 后效性DP

    有后效性的DP:$f[u]$表示到$u$的期望次数,$f[u]=\Sigma_{(u,v)} (1-\frac{p}{q})*f[v]*deg[v]$,最后答案就是$f[u]*p/q$ 刚开始$f[1 ...

  5. Excel打印区域设置

    excel打印区域设置 在打印excel的时候,经常需要来设定打印区域,才能更好的打印我们所要的东西,那怎么设置了,这里做个记录,以备使用查看 1.首先选中你要打印的区域,拖动鼠标框选就可以.如图 选 ...

  6. AD按键-矩阵按键-独立按键:

    原理:利用数组分压+AD采集: 优点:一个IO口可以做成多个按键,节省IO口(矩阵键盘在>4时优点才能体现出来):可备用作为AD基准输入. 缺点:不能做成组合按键(或者电阻要精确选择):且离IO ...

  7. leetcode--Learn one iterative inorder traversal, apply it to multiple tree questions (Java Solution)

    will show you all how to tackle various tree questions using iterative inorder traversal. First one ...

  8. 四,JVM 自带工具之jvisualvm

    http://www.ibm.com/developerworks/cn/java/j-lo-visualvm/index.html?ca=drs- https://visualvm.java.net ...

  9. 用简单的方法学习ES6

    ES6 简要概览 这里是ES6 简要概览.本文大量参考了ES6特性代码仓库,请允许我感谢其作者@Luke Hoban的卓越贡献,也感谢@Axel Rauschmayer所作的[优秀书籍]//explo ...

  10. Teradata 认证系列 - 1. TCPP这是个啥

    一看历史,好几年没发帖...正好最近在自学teradata认证(学也不一定学的完,最后也不一定去考,仅仅安慰一下不想碌碌无为的内心) 网上一搜,百度上的中文相关资料简直为0.这个不奇怪,毕竟都没什么人 ...