Java统计用户年/月/周/日网站访问量
一:准备工作,引入相关依赖:
二:运行效果图:
下一次访问
三:具体代码如下
(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统计用户年/月/周/日网站访问量的更多相关文章
- c3p0数据库连接池 原创: Java之行 Java之行 5月8日 一、连接池概述 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程
c3p0数据库连接池 原创: Java之行 Java之行 5月8日 一.连接池概述 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程 DB连接池HikariCP为什么如此快 原创: D ...
- Java语言学习day33--8月8日
今日内容介绍1.基本类型包装类2.System类3.Math类4.Arrays类5.大数据运算 ###01基本数据类型对象包装类概述 *A:基本数据类型对象包装类概述 *a.基本类型包装类的产生 在实 ...
- Java语言学习day32--8月07日
###07正则表达式邮箱地址验证 * A: 正则表达式邮箱地址验证 * a: 案例代码 public class RegexDemo2 { public static void main(String ...
- Java语言学习day07--7月6日
今日内容介绍1.流程控制语句switch2.数组 ###01switch语句解构 * A:switch语句解构 * a:switch只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码. * ...
- java试题复盘——11月25日
上: 11.下列表述错误的是?(D) A.int是基本类型,直接存数值,Integer是对象,用一个引用指向这个对象. B.在子类构造方法中使用super()显示调用父类的构造方法,super()必须 ...
- java试题复盘——11月13日
上: 10. AccessViolationException异常触发后,下列程序的输出结果为( A ) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 AccessViol ...
- java试题复盘——9月26日
5.在 JAVA 编程中, Java 编译器会将 Java 程序转换为(A) A. 字节码 B. 可执行代码 C. 机器代码 D. 以上都不对 解析: 编译器将Java源代码编译成字节码cla ...
- java试题复盘——9月8日
上: 1.可将语句块或方法设为同步使用的语句是(A) A synchronized 用于方法或者代码块前,使此方法或者代码变成同步的 B static ...
- Java语言学习day01--6月28日
Java语言学习day01一:Java概述 1.Java语言发展史 任职于太阳微系统的 詹姆斯·高斯林 等人于1990年代初开发Java语言的雏形,最初被命名为 Oak ,目标设置在 家用电器等小型系 ...
随机推荐
- JAVA之反射(一)
反射(一) ** 注:博主的这篇文章是在学习反射的时间写的如有问题请及时联系博主进行修改 ** 何为反射 这里也不说一些很官方的语言了,官方的说明看着头痛,总之一句话,就是在JAVA的运行状态的时候 ...
- springIOC源码解析之Bean的创建
上一篇讲到了beanFactory的配置文件的解析和beanFactory的创建,都集中到了obtainFreshBeanFactory();这一句代码里了,本篇主要讲bean的创建过程 public ...
- t.call is not a function
js 写错了... 代码: $("form").each({$(this).submit(function(){return false;})}); 丢了一个 function() ...
- luogu P5142 区间方差 十分优美的线段树
又来了个维护方差的线段树.... 大致推导过程(字丑多包涵QAQ) 注意取模时要加一些100000007防止出现负数.. #include<cstdio> #include<iost ...
- Codeforces Round #364 (Div. 2) C
Description Sergei B., the young coach of Pokemons, has found the big house which consists of n flat ...
- C# Task任务详解及其使用方式
https://blog.csdn.net/younghaiqing/article/details/81455410 C#多线程编程笔记(4.3)-Task任务中实现取消选项 https://blo ...
- java——方法重载与重写、构造方法、this关键字、static关键字、strictfp关键字、类的导入
Java SE5新增加@Override注解,它并不是关键字,但是可以把它当作关键字使用.当你想要覆写(重写)某个方法时,可以选择添加这个注解,在你不留心重载而并非覆写了该方法时,编译器就会生成一条错 ...
- POJ 2361 Tic Tac Toe
题目:给定一个3*3的矩阵,是一个井字过三关游戏.开始为X先走,问你这个是不是一个合法的游戏.也就是,现在这种情况,能不能出现.如果有人赢了,那应该立即停止.那么可以知道X的步数和O的步数应该满足x= ...
- Python 类总结
Python可以继承多个父类,多重继承. 类支持多个对象的产生,命名空间的继承,运算符重载1).类产生多个实例对象Python OOP模型中的两种对象:类对象和实例对象.类对象提供默认的行为,是实例对 ...
- C#常用控件的属性以及方法(转载)
-----以前看别人的,保存了下来,但是忘了源处,望见谅. C#常用控件属性及方法介绍 目录 1.窗体(Form) 2.Label (标签)控件 3.TextBox(文本框)控件 4.RichText ...