主题 : 如何实现计数器?
级别: 秀才
UID: 30
积分:32 加为好友
威望: 0 精华: 0
主题:4 回复:10
注册时间:2009-06-03
在线时长:0
1#   发表于:2009-09-16 14:27:59  IP:210.204.*.*
想在jeecms系统中首页上添加一个计数器
然后发现不管是用调用标签<% 还是<jsp:usebean
都失败

不知道是什么问题
我猜测是因为文件后缀为html的问题,
那么怎么去改呢?
或者有什么更好的思路么?
级别: 秀才
UID: 283
积分:59 加为好友
威望: 0 精华: 0
主题:0 回复:28
注册时间:2009-07-17
在线时长:0
2#   发表于:2009-09-16 15:41:20  IP:59.130.*.*
实际上jeecms有个默认的计数器,不过还没完善——即多人同时访问时计数问题,可以自己试着改改
级别: 秀才
UID: 30
积分:32 加为好友
威望: 0 精华: 0
主题:4 回复:10
注册时间:2009-06-03
在线时长:0
3#   发表于:2009-09-16 16:42:31  IP:210.204.*.*
准备了一个简单的字节写的方案。
很不完美

一会放出来给大家批评
级别: 秀才
UID: 30
积分:32 加为好友
威望: 0 精华: 0
主题:4 回复:10
注册时间:2009-06-03
在线时长:0
4#   发表于:2009-09-16 16:51:03  IP:210.204.*.*
/WebRoot/WEB-INF/ftl_lib/jeecms/action_cms.ftl中
添加
<#macro JustShow>
<@s.action name='JustShow' namespace='/jeecms/tag/cms' executeResult='true'/>
</#macro>

src/com/jeecms/cms/action/front/ChnlPartAct.java中
添加

String show = "";
    // 一个同步用的锁
    private static final Object lock = new Object();
    // 注意默认的文件目录在tomcat/bin目录下面
    private static File file = null;

    public String justShow() {
Integer count = 0;
synchronized (lock) {
    // 初始化文件名
    if (file == null) {
file = new File(contextPvd.getAppRoot()
+ "/WEB-INF/classes/counter.dat");
    }
    // 我们从文件读取数据
    // 如果文件不存在,则需要初始化
    if (!file.exists()) {
// 创建一个新的文件
try {
    file.createNewFile();
} catch (IOException e) {
    e.printStackTrace();
}
count = 0;
    } else {
// 准备读取文件
BufferedReader reader;

try {
reader = new BufferedReader(new FileReader(file));
 // 从文件里读取int数据
String str_count = reader.readLine();
if(str_count==null){
    System.err.println("没有任何记录."); 
    count = 0;
}else{
    count = Integer.parseInt(str_count);
}

 // 关闭文件
reader.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} catch (NumberFormatException e){
    System.err.println("读取计数器数据错误."); 
    count = 0;
}
    }
    count++;
    // 准备写入文件
    PrintWriter writer;
    try {
writer = new PrintWriter(new FileOutputStream(file));
// 写入
writer.println(""+count);
// 关闭文件
writer.close();
    } catch (IOException e) {
System.err.println("写入计数器数据错误"+e.getMessage()); 
    }
}

String zeroes = "";
String hits = count.toString();

for (int t = 0; t < 8 - hits.length(); t++) {
    zeroes = zeroes + "0";
}
show = zeroes + hits;
return SYS_TPL;
    }
 public String getShow() {
return show;
    }

    public void setShow(String show) {
this.show = show;
    }


src/com/jeecms/cms/struts-front.xml中 添加
<!--栏目标签--><package name="cms.front.tag" namespace="/jeecms/tag/cms" extends="tag-default">内添加
<action name="JustShow" method="justShow" class="cms.chnlPartAct">
<result name="sysTpl">/WEB-INF/ftl_lib/jeecms/cms/just_show.ftl</result>
<result>${tplPath}</result>
</action>


页面处需要添加计数器的位置 添加[@cms.JustShow /]


一个简单的计数器就加上了
大家可以自己添加样式等内容,也可以加入ip计数控制
这个只是一个简单的实现而已,欢迎砸砖
级别: 秀才
UID: 30
积分:32 加为好友
威望: 0 精华: 0
主题:4 回复:10
注册时间:2009-06-03
在线时长:0
5#   发表于:2009-09-16 16:52:16  IP:210.204.*.*
代码部分使用http://java2000-net.javaeye.com/blog/242136 跟老紫竹学Java-计数器-文件版的代码
但是对他处理上的错误进行了修改。。。。。基本上快面目全非了。
级别: 秀才
UID: 30
积分:32 加为好友
威望: 0 精华: 0
主题:4 回复:10
注册时间:2009-06-03
在线时长:0
6#   发表于:2009-09-16 16:53:18  IP:210.204.*.*
论坛我上的不多
大家有问题可以给我邮箱写信(为防止采集采用符号替换)
lx0319#gmail。com
级别: 举人
UID: 632
积分:91 加为好友
威望: 0 精华: 0
主题:12 回复:16
注册时间:2009-08-29
在线时长:0
7#   发表于:2009-09-27 17:33:36  IP:218.30.*.*
那默认计数器怎么调用啊
级别: 秀才
UID: 283
积分:59 加为好友
威望: 0 精华: 0
主题:0 回复:28
注册时间:2009-07-17
在线时长:0
8#   发表于:2009-09-28 08:04:50  IP:59.130.*.*
默认的计数器
于CmsPageAct.java中

首页访问次数统计,已注销
// @ TODO 需要改变统计浏览次数的策略。目前的方法在大量并发下容易出现脏数据,并且频繁更新数据库,性能不佳。
// chnl.setVisitTotal(chnl.getVisitTotal() + 1);


栏目页访问次数统计,已注销
// @ TODO 需要改变统计浏览次数的策略。目前的方法在大量并发下容易出现脏数据,并且频繁更新数据库,性能不佳。
// chnl.setVisitTotal(chnl.getVisitTotal() + 1);

内容页访问次数统计
// @ TODO 需要改变统计浏览次数的策略。目前的方法在大量并发下容易出现脏数据,并且频繁更新数据库,性能不佳。
arti.updateVisit(1);
级别: 秀才
UID: 283
积分:59 加为好友
威望: 0 精华: 0
主题:0 回复:28
注册时间:2009-07-17
在线时长:0
9#   发表于:2009-09-28 09:02:22  IP:59.130.*.*
moses, 您的方法还是没有解决大并发量情况下的性能问题。因此,建议还是在内存中使用Map维护计数,定期往数据库中写,如果当机只是影响一部分数据,但较性能成百倍提升,还是值得的。
级别: 秀才
UID: 30
积分:32 加为好友
威望: 0 精华: 0
主题:4 回复:10
注册时间:2009-06-03
在线时长:0
10#   发表于:2009-09-28 19:54:09  IP:124.80.*.*
关于大量并发的问题,可以采用在内存中buffer,
写个deamon现成定时计入文件的形式就可以
而且我也是探讨下,
以文件形式记录
已经太太原始了...
之所以这样写,
是懒得再去弄hibernate的从映射到操作的一系列东西了.
1 共1页