本篇將計數器邏輯從 JSP Scriptlet 中抽離,封裝為 JavaBean (POJO),實現表現層與業務層分離,為後續 Spring/Hibernate 整合鋪路。

package com.counter.model;
public class CounterBean {
private long count = 0;
private final Object lock = new Object(); // 實例級鎖
public long getCount() { return count; }
public void setCount(long count) { this.count = count; }
// 線程安全的遞增操作
public synchronized long incrementAndGet() {
return ++count;
}
}
<%@ page import="com.counter.model.CounterBean" %>
<%
// 從 application 域取得單例 Bean
CounterBean bean = (CounterBean) application.getAttribute("counterBean");
if (bean == null) {
bean = new CounterBean();
application.setAttribute("counterBean", bean);
}
long count = bean.incrementAndGet();
%>
當前訪問次數:<%= count %>
| 層次 | 職責 | 代碼位置 |
|---|---|---|
| 表現層 | 頁面渲染、參數接收、結果輸出 | JSP / Servlet |
| 業務層 | 計數邏輯、同步控制、狀態封裝 | CounterBean (POJO) |
| 持久層 | (本版暫無)後續可注入 DAO 實現檔案/資料庫持久化 | CounterDao / Hibernate |
CounterBean 可獨立單元測試,無需啟動 Web 容器。synchronized 內建於 Bean 方法,JSP 無需關心併發細節。application 域存放唯一實例,全應用共享計數狀態。application 域,重啟歸零、集群不同步。下一篇將整合 Hibernate,實現 ORM 持久化與 Spring 容器管理 Bean 生命週期。