主题 : 如何实现计数器? |
级别: 秀才
|
1# 发表于:2009-09-16 14:27:59 IP:210.204.*.*
|
||||
---|---|---|---|---|---|
级别: 秀才
|
2# 发表于:2009-09-16 15:41:20 IP:59.130.*.*
实际上jeecms有个默认的计数器,不过还没完善——即多人同时访问时计数问题,可以自己试着改改
|
||
---|---|---|---|
级别: 秀才
|
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计数控制 这个只是一个简单的实现而已,欢迎砸砖 |
||
---|---|---|---|
级别: 秀才
|
5# 发表于:2009-09-16 16:52:16 IP:210.204.*.*
代码部分使用http://java2000-net.javaeye.com/blog/242136 跟老紫竹学Java-计数器-文件版的代码
但是对他处理上的错误进行了修改。。。。。基本上快面目全非了。 |
||
---|---|---|---|
级别: 秀才
|
6# 发表于:2009-09-16 16:53:18 IP:210.204.*.*
论坛我上的不多
大家有问题可以给我邮箱写信(为防止采集采用符号替换) lx0319#gmail。com |
||
---|---|---|---|
级别: 举人
|
7# 发表于:2009-09-27 17:33:36 IP:218.30.*.*
那默认计数器怎么调用啊
|
||
---|---|---|---|
级别: 秀才
|
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); |
||
---|---|---|---|
级别: 秀才
|
9# 发表于:2009-09-28 09:02:22 IP:59.130.*.*
moses, 您的方法还是没有解决大并发量情况下的性能问题。因此,建议还是在内存中使用Map维护计数,定期往数据库中写,如果当机只是影响一部分数据,但较性能成百倍提升,还是值得的。
|
||
---|---|---|---|
级别: 秀才
|
10# 发表于:2009-09-28 19:54:09 IP:124.80.*.*
关于大量并发的问题,可以采用在内存中buffer,
写个deamon现成定时计入文件的形式就可以 而且我也是探讨下, 以文件形式记录 已经太太原始了... 之所以这样写, 是懒得再去弄hibernate的从映射到操作的一系列东西了. |
||
---|---|---|---|
1
共1页