WCM實現互動功能-3-文章點選數(改進版)
在做WCM文章釋出時,文章的點選數統計是一個常見的功能。
在網上搜索了半天,所搜尋到的結果只有一個,其做法是在編寫模板中新增一個數字元素,然後編寫一個jsp元件來對該數字元素進行加1操作,再在演示模板中引用該jsp元件,在訪問文章的時候,執行該jsp元件以使對當前文章的數字元素進行加1操作。相信有不少的人在查詢資料的時候,在WCM中實現點選數或者瀏覽次數的統計的方法,都是這種吧!
作者在起初做文章點選數的時候,也是使用的是這個方法。但是待專案正式上線以後,就出了問題了:
1、訪問文章的速度很慢,若在演示模板中去掉統計的jsp元件,其速度明顯的快了許多。jsp元件的邏輯是獲取當前文章的數字元素,對該數字元素的值加1後,再儲存文章
2、有時該jsp元件執行報異常
3、更大的問題是,使用了才幾天時間,客戶反映資料庫增長過快
若去掉了演示模板中的jsp元件後,以上問題便都沒了。所以在後來才開發出了另外的統計方式,即就是本文所描述的內容。
首先對文章點選數或者門戶訪問量這種資料進行分析,這些資料的要求是訪問運算要快,而持久化則無需實時進行。
故此可以在伺服器端放置一個統計的容器,而客戶端則通過ajax進行統計訪問,是比較好的方案。那麼具體實現文章點選數的步驟如下
編寫一個統計的java類檔案GeneralCounter.java,程式碼如下
package com.comm.count;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import javax.swing.Timer;
public class GeneralCounter
{
private static String path="GeneralCount.log";
private static int delay=120000;//2min=120000ms
private static Properties properties;
private static boolean isReflesh=false;
private static Timer timer;
static
{
properties=new Properties();
File f=new File(path);
if (f.exists()==false)
{
try {
f.createNewFile();
} catch (IOException e1) {
e1.printStackTrace();
}
}
try {
properties.load(new FileInputStream(path));
System.out.println("load ..."+new File(path).getAbsolutePath());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
timer=new Timer(delay, new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if (isReflesh==false)
{
return;
}
try {
FileOutputStream fStream=new FileOutputStream(path);
properties.save(fStream, "gb2312");
fStream.flush();
fStream.close();
//System.out.println("save ..."+new File(path).getAbsolutePath());
} catch (Exception e1) {
e1.printStackTrace();
}
isReflesh=false;
}
});
timer.start();
System.out.println("GeneralCounter static block...");
}
public static String getCount(String key)
{
String count=properties.getProperty(key);
if (count==null)
{
properties.put(key, "1");
//System.out.println("111="+properties.getProperty(key));
} else
{
properties.put(key, Integer.parseInt(count)+1+"");
}
isReflesh=true;
return properties.getProperty(key);
}
public static String getCountWithoutIncrease(String key)
{
return properties.getProperty(key);
}
public static void setDelay(int d)
{
GeneralCounter.delay=d;
timer.setDelay(d);
}
public static String getPath() {
return path;
}
public static int getDelay() {
return delay;
}
public static Properties getProperties() {
return properties;
}
public static boolean isReflesh() {
return isReflesh;
}
public static Timer getTimer() {
return timer;
}
}
匯出為generalCounter.jar包,並放置到目錄下
\IBM\WebSphere\wp_profile\installedApps\<node>\wps.ear\wps.war\WEB-INF\lib\
若你的環境的WEB-INF下面沒有lib資料夾,則建立一個就是了。不要再問我你的WEN-INF下面沒有lib資料夾啊,這種情況我是遇到過的,實在是很無語。
然後重啟portal服務以使jar包生效。
在上面的GeneralCounter.java類中,不難看到該類對統計的資料每2分鐘儲存一次,若需要修改儲存時間,則修改該值即可,並且在儲存的時候,會判斷統計資料有沒有被更新,若更新了才會進行儲存。
統計資料的GeneralCount.log檔案位置在目錄下
\IBM\WebSphere\wp_profile\GeneralCount.log
接著在目錄
\IBM\WebSphere\wp_profile\installedApps\<node>\wps.ear\wps.war\
下建立一個資料夾count,在資料夾count下面建立一個count.js檔案和一個count.jsp檔案
count.js程式碼如下
function doRequest(ask,pid,args)
{
//alert("doRequest");
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
//alert("getDoRequestUrl()="+getDoRequestUrl());
xmlhttp.open("post","/wps/count/count.jsp",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("ask="+ask+"&"+"pid="+pid+"&"+args);
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
try
{
var result=xmlhttp.responseText;
//alert(result);
if(document.getElementById(pid))
{
document.getElementById(pid).innerHTML=result;
}
}catch(err)
{
//alert(err);
}
}
}
}
function doCount(pid,id)
{
new doRequest("",pid,"id="+id);
}
count.jsp程式碼如下
<%
String id=request.getParameter("id");
//System.out.println("id="+id);
out.print(com.comm.count.GeneralCounter.getCount(id));
%>
接下來在演示模板中就可以進行點選數統計了,在演示模板中新增如下程式碼即可
點選數:<span id="clickcount"></span>
<script src="/wps/count/count.js" charset="gb2312"></script>
<script>
doCount("clickcount",'<IDCmpnt context="current" type="content" field="id"/>');
</script>
到此就實現點選數統計了。