Latest web development tutorials

Servlet 點擊計數器

網頁點擊計數器

很多時候,您可能有興趣知道網站的某個特定頁面上的總點擊量。 使用Servlet 來計算這些點擊量是非常簡單的,因為一個Servlet 的生命週期是由它運行所在的容器控制的。

以下是實現一個簡單的基於Servlet 生命週期的網頁點擊計數器需要採取的步驟:

  • 在init() 方法中初始化一個全局變量。
  • 每次調用doGet() 或doPost() 方法時,都增加全局變量。
  • 如果需要,您可以使用一個數據庫表來存儲全局變量的值在destroy() 中。 在下次初始化Servlet 時,該值可在init() 方法內被讀取。 這一步是可選的。
  • 如果您只想對一個session 會話計數一次頁麵點擊,那麼請使用isNew() 方法來檢查該session 會話是否已點擊過相同頁面。 這一步是可選的。
  • 您可以通過顯示全局計數器的值,來在網站上展示頁面的總點擊量。 這一步是可選的。

在這裡,我們假設Web 容器將無法重新啟動。 如果是重新啟動或Servlet 被銷毀,計數器將被重置。

實例

本實例演示瞭如何實現一個簡單的網頁點擊計數器:

package com.w3big.test;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class PageHitCounter
 */
@WebServlet("/PageHitCounter")
public class PageHitCounter extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private int hitCount; 
    
	public void init() 
	{ 
		// 重置点击计数器
		hitCount = 0;
	} 
    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		response.setContentType("text/html;charset=UTF-8");
		// 增加 hitCount 
		hitCount++; 
		PrintWriter out = response.getWriter();
		String title = "总点击量";
		String docType = "<!DOCTYPE html> \n";
		out.println(docType +
	        "<html>\n" +
	        "<head><title>" + title + "</title></head>\n" +
	        "<body bgcolor=\"#f0f0f0\">\n" +
	        "<h1 align=\"center\">" + title + "</h1>\n" +
	        "<h2 align=\"center\">" + hitCount + "</h2>\n" +
	        "</body></html>");
	}
	
	public void destroy() 
	{ 
		// 这一步是可选的,但是如果需要,您可以把 hitCount 的值写入到数据库
	} 

}

現在讓我們來編譯上面的Servlet,並在web.xml 文件中創建以下條目:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet>
    <servlet-name>PageHitCounter</servlet-name>
    <servlet-class>com.w3big.test.PageHitCounter</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>PageHitCounter</servlet-name>
    <url-pattern>/TomcatTest/PageHitCounter</url-pattern>
  </servlet-mapping>
</web-app>

現在通過訪問http://localhost:8080/TomcatTest/PageHitCounter 來調用這個Servlet。 這將會在每次頁面刷新時,把計數器的值增加1,結果如下所示:

總點擊量

6


網站點擊計數器

很多時候,您可能有興趣知道整個網站的總點擊量。 在Servlet 中,這也是非常簡單的,我們可以使用過濾器做到這一點。

以下是實現一個簡單的基於過濾器生命週期的網站點擊計數器需要採取的步驟:

  • 在過濾器的init() 方法中初始化一個全局變量。
  • 每次調用doFilter 方法時,都增加全局變量。
  • 如果需要,您可以在過濾器的destroy() 中使用一個數據庫表來存儲全局變量的值。 在下次初始化過濾器時,該值可在init() 方法內被讀取, 這一步是可選的。

在這裡,我們假設Web 容器將無法重新啟動。 如果是重新啟動或Servlet 被銷毀,點擊計數器將被重置。

實例

本實例演示瞭如何實現一個簡單的網站點擊計數器:

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

public class SiteHitCounter implements Filter{
    
  private int hitCount; 
               
  public void  init(FilterConfig config) 
                    throws ServletException{
     // 重置点击计数器
     hitCount = 0;
  }

  public void  doFilter(ServletRequest request, 
              ServletResponse response,
              FilterChain chain) 
              throws java.io.IOException, ServletException {

      // 把计数器的值增加 1
      hitCount++;

      // 输出计数器
      System.out.println("网站访问统计:"+ hitCount );

      // 把请求传回到过滤器链
      chain.doFilter(request,response);
  }
  public void destroy() 
  { 
      // 这一步是可选的,但是如果需要,您可以把 hitCount 的值写入到数据库
  } 
} 

現在讓我們來編譯上面的Servlet,並在web.xml 文件中創建以下條目:

....
<filter>
   <filter-name>SiteHitCounter</filter-name>
   <filter-class>SiteHitCounter</filter-class>
</filter>

<filter-mapping>
   <filter-name>SiteHitCounter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

....

現在訪問網站的任意頁面,比如http://localhost:8080/。 這將會在每次任意頁面被點擊時,把計數器的值增加1,它會在日誌中顯示以下消息:

网站访问统计: 1
网站访问统计: 2
网站访问统计: 3
网站访问统计: 4
网站访问统计: 5
..................