1. 程式人生 > >WCM實現互動功能-3-文章點選數(改進版)

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>

到此就實現點選數統計了。