JavaBeans 是 JSP 實現業務邏輯封裝、資料傳遞的核心組件。本文詳細解析 <jsp:useBean> 機制、四大作用域語義差異、<jsp:setProperty>/<jsp:getProperty> 屬性操作標籤,以及 Bean 類部署路徑規範。
<jsp:useBean> 核心機制<jsp:useBean id="beanName" class="fully.qualified.Class" scope="page|request|session|application" />
容器執行邏輯:
id 與 scope 在對應範圍搜尋現有實例。class 實例化新 Bean,存入指定範圍並返回。此機制保證同一範圍內同 id 僅有一實例,實現共享與複用。
| Scope | 生命週期 | 可見範圍 | 典型用途 |
|---|---|---|---|
| page | 當前頁面請求處理期間 | 僅當前 JSP 頁面 | 暫存頁面級計算結果、表單驗證中介物件 |
| request | 單一 HTTP 請求鏈 (含 forward) | 同請求鏈內所有資源 | Controller 處理結果傳遞給 View、跨資源轉發共享資料 |
| session | 用戶會話期間 (瀏覽器關閉或逾時失效) | 同用戶所有請求 | 用戶登入狀態、購物車、個人化設定 |
| application | Web 應用啟動至關閉 | 全系統所有用戶、所有請求 | 全域配置、快取資料、連線池、計數器 |
注意:使用 session 範圍需確保客戶端啟用 Cookie,否則無法維持會話追蹤。
<jsp:setProperty> 三種用法// 1. 自動匹配:請求參數名與 Bean 屬性名一致時自動注入
<jsp:setProperty name="beanName" property="*" />
// 2. 指定屬性:手動映射參數名與屬性名
<jsp:setProperty name="beanName" property="propName" param="paramName" />
// 3. 指定固定值
<jsp:setProperty name="beanName" property="propName" value="fixedValue" />
<jsp:getProperty> 輸出屬性值<jsp:getProperty name="beanName" property="propName" />
等同於在 Scriptlet 中呼叫 bean.getPropName() 並輸出,但更符合標籤化開發規範。
.class 放入容器共用類別目錄(如 Tomcat $CATALINA_HOME/lib 或 classes),JSP 頁面加 <%@ page import="pkg.BeanClass" %>。WEB-INF/classes/pkg/BeanClass.class(符合包結構),無需額外 import 即可被該應用所有 JSP 使用。Serializable(若需 session 複製/叢集)。${beanName.propName} 取代 <jsp:getProperty>,配合 JSTL 更簡潔。掌握 JavaBeans 在 JSP 中的完整生命週期與作用域語義,是邁向 MVC 架構、實現關注點分離的基石。