Hit Counter trong Servlet

Hit Counter cho một WebPage trong Servlet

Nhiều khi bạn quan tâm đến tổng lượt click trên một trang cụ thể trong Website của bạn. Nó là đơn giản để tính toán những lượt click này bởi sử dụng một Servlet, bởi vì vòng đời của một Servlet được điều khiển bởi Container, mà nó chạy trong đó.

Sau đây là các bước để triển khai một Hit Counter đơn giản dựa trên vòng đời của Servlet:

  • Khởi tạo một biến global trong phương thức init().
  • Tăng biến global này mỗi khi phương thức doGet() hoặc doPost() được gọi.
  • Nếu cần thiết, bạn có thể sử dụng một Database Table để lưu giá trị của biến global này trong phương thức destroy(). Giá trị này có thể được đọc bên trong phương thức init() khi Servlet sẽ được khởi tạo trong lần sau. Bước này là tùy ý.
  • Nếu bạn chỉ muốn tính toán lượng click trên page duy nhất bên trong một Session, thì bạn có thể sử dụng phương thức isNew() để kiểm tra nếu cùng một page đó đã được click bên trong Session đó. Bước này là tùy ý.
  • Bạn có thể hiển thị giá trị của biến global để chỉ tổng lượt click trên Website của bạn. Bước này là tùy ý.

Tại đây, tôi giả sử Web container sẽ không được restart. Nếu nó được restart hoặc Servlet bị hủy, thì hit counter sẽ được reset.

Ví dụ

Ví dụ sau minh họa cách triển khai một hit counter đơn giản:

import java.io.*;
import java.sql.Date;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;


public class PageHitCounter extends HttpServlet{


  private int hitCount; 


  public void init() 
  { 
     // Reset hit counter.
     hitCount = 0;
  } 


  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // Set response content type
      response.setContentType("text/html");
      // This method executes whenever the servlet is hit 
      // increment hitCount 
      hitCount++; 
      PrintWriter out = response.getWriter();
      String title = "Total Number of Hits";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\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() 
  { 
      // This is optional step but if you like you
      // can write hitCount value in your database.
  } 
} 

Biên dịch Servlet trên và tạo các entry sau trong web.xml:

....
 <servlet>
     <servlet-name>PageHitCounter</servlet-name>
     <servlet-class>PageHitCounter</servlet-class>
 </servlet>


 <servlet-mapping>
     <servlet-name>PageHitCounter</servlet-name>
     <url-pattern>/PageHitCounter</url-pattern>
 </servlet-mapping>
....

Bây giờ, chúng ta gọi Servlet này bởi sử dụng http://localhost:8080/PageHitCounter. Nó sẽ tăng lượng đếm thêm 1 mỗi khi trang được refresh và nó sẽ cho kết quả:

Total Number of Hits

6

Hit Counter cho một Website trong Servlet

Nhiều khi bạn quan tâm đến tổng lượt click trên toàn bộ Website của bạn. Điều này cũng đơn giản trong Servlet và chúng ta có thể thực hiện nó bởi sử dụng các Filter:

Sau đây là các bước để triển khai một Hit Couter trên một Website dựa trên vòng đời của Filter:

  • Khởi tạo một biến global trong phương thức init() của một Filter.
  • Tăng giá trị biến global này mỗi khi phương thức doFilter được gọi.
  • Nếu cần thiết, bạn có thể sử dụng Database table để lưu giữ giá trị của biến global này trong phương thức destroy() của Filter. Giá trị này có thể được đọc bên trong phương thức init() khi Filter sẽ được khởi tạo lần tiếp theo. Bước này là tùy ý.

Tại đây, tôi giả sử Web container sẽ không được restart. Nếu nó được restart hoặc Servlet bị hủy, thì hit counter sẽ được reset.

Ví dụ

Sau đây là ví dụ minh họa cách triển khai một Hit counter trên một Website trong Servlet:

// Import required java libraries
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{
     // Reset hit counter.
     hitCount = 0;
  }


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


      // increase counter by one
      hitCount++;


      // Print the counter.
      System.out.println("Site visits count :"+ hitCount );


      // Pass request back down the filter chain
      chain.doFilter(request,response);
  }
  public void destroy() 
  { 
      // This is optional step but if you like you
      // can write hitCount value in your database.
  } 
} 

Biên dịch Servlet trên và tạo các entry sau trong 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>


....

Bây giờ gọi bất kỳ URL nào chẳng hạn như http://localhost:8080/. Nó sẽ tăng lượng đếm thêm 1 mỗi khi bất kỳ trang nào nhận một click và sẽ hiển thị thông báo sau:

Site visits count : 1
Site visits count : 2
Site visits count : 3
Site visits count : 4
Site visits count : 5
..................

Bình luận