首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> JSP 入門

JSP 頁面點擊計數器實作

     編輯:JSP 入門

JSP 頁面點擊計數器實作

統計頁面瀏覽次數是常見需求。JSP 可利用 application 隱含物件 (ServletContext) 在伺服器端儲存計數器,生命週期跨越所有使用者 Session。


核心原理

  • application.getAttribute("key") 讀取計數值
  • application.setAttribute("key", value) 寫入更新值
  • 伺服器重啟會重置,生產環境建議持久化至資料庫

基本實作範例

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>頁面訪問統計</title>
</head>
<body>
  <%
    Integer count = (Integer) application.getAttribute("hitCounter");
    if (count == null || count == 0) {
      count = 1;
      out.println("歡迎首次訪問!");
    } else {
      count++;
      out.println("歡迎再次訪問!");
    }
    application.setAttribute("hitCounter", count);
  %>
  <h2>本頁面總訪問次數:<%= count %></h2>
</body>
</html>

進階:多頁面獨立計數

使用頁面路徑作為 Key:

String key = "hitCounter_" + request.getRequestURI();
Integer count = (Integer) application.getAttribute(key);
// ... 同邏輯更新

持久化方案:資料庫儲存

資料表設計

CREATE TABLE page_hits (
  page_url VARCHAR(255) PRIMARY KEY,
  hit_count BIGINT DEFAULT 0,
  last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

JSP 整合 JDBC (簡易示範)

<%@ page import="java.sql.*" %>
<%
  String url = request.getRequestURI();
  Connection conn = null;
  try {
    // 取得連線 (建議使用連線池)
    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "pass");
    
    // 查詢並更新 (使用 UPSERT 語法)
    String sql = "INSERT INTO page_hits (page_url, hit_count) VALUES (?, 1) " +
                 "ON DUPLICATE KEY UPDATE hit_count = hit_count + 1, last_updated = NOW()";
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setString(1, url);
    ps.executeUpdate();
    
    // 讀取最新計數
    ps = conn.prepareStatement("SELECT hit_count FROM page_hits WHERE page_url = ?");
    ps.setString(1, url);
    ResultSet rs = ps.executeQuery();
    long count = 0;
    if (rs.next()) count = rs.getLong(1);
    
    out.println("頁面瀏覽次數:" + count);
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    if (conn != null) try { conn.close(); } catch (Exception ignore) {}
  }
%>

分散式環境考量

  • 多台伺服器需共享計數器 → 使用 Redis、資料庫或分散式快取
  • 高併發下效能 → Redis INCR 原子操作、批次寫入資料庫
  • 排除機器人流量 → 結合 User-Agent、IP 限流、驗證碼

重置計數器

管理員功能範例:

<% if ("admin".equals(session.getAttribute("role"))) { %>
  <form method="post" action="resetCounter.jsp">
    <input type="hidden" name="page" value="<%= request.getRequestURI() %>">
    <button type="submit" onclick="return confirm('確定歸零?')">重置計數</button>
  </form>
<% } %>

resetCounter.jsp 執行 application.removeAttribute(key) 或資料庫 DELETE。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved