統計頁面瀏覽次數是常見需求。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 );
<%@ 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) {}
}
%>
INCR 原子操作、批次寫入資料庫管理員功能範例:
<% 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。