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

JSP JavaBean 完整指南:規範定義、屬性存取、useBean/getProperty/setProperty 標籤實戰與最佳實務

     編輯:JSP 入門

JSP JavaBean 完整開發指南


JavaBean 是 JSP 開發核心元件,封裝資料與業務邏輯。掌握 Bean 規範、屬性存取標籤、作用域管理與實際應用模式,建構可維護的企業級應用。


JavaBean 規範定義

符合以下條件的 Java 類別即為 JavaBean:

規範項目要求
建構子提供公用無參數建構子
序列化實作 java.io.Serializable 介面
屬性存取提供 getter/setter 方法 (可唯讀/唯寫)
命名慣例getPropertyName() / setPropertyName()

StudentsBean 範例

package com.example.model;

public class StudentsBean implements java.io.Serializable {
    private String firstName = null;
    private String lastName = null;
    private int age = 0;
    
    // 無參數建構子
    public StudentsBean() { }
    
    // Getter 方法
    public String getFirstName() { return firstName; }
    public String getLastName() { return lastName; }
    public int getAge() { return age; }
    
    // Setter 方法
    public void setFirstName(String firstName) { this.firstName = firstName; }
    public void setLastName(String lastName) { this.lastName = lastName; }
    public void setAge(int age) { this.age = age; }
}

編譯與部署

# 編譯
javac StudentsBean.java

# 部署至 Web 應用
# 目標路徑:WEB-INF/classes/com/example/model/StudentsBean.class

部署目錄結構


JSP 標準動作標籤操作 Bean

<jsp:useBean> - 宣告與實例化

<jsp:useBean id="bean名稱" 
           scope="page|request|session|application" 
           class="完整類別名稱" />

<!-- 或包含主體進行初始化 -->
<jsp:useBean id="bean名稱" scope="session" class="com.example.StudentsBean">
    <jsp:setProperty name="bean名稱" property="*" />
</jsp:useBean>

scope 作用域對照

scope 值生命週期共用範圍
page單一頁面請求僅當前頁面 (預設)
request單一 HTTP 請求同請求轉發/包含的頁面
session使用者 Session同使用者所有請求
application應用程式存活期間所有使用者、所有請求

<jsp:setProperty> - 設定屬性值

<!-- 單一屬性設定 -->
<jsp:setProperty name="bean名稱" property="屬性名" value="值" />

<!-- 自動對應請求參數 (property="*") -->
<jsp:setProperty name="bean名稱" property="*" />

<!-- 指定參數名對應不同屬性 -->
<jsp:setProperty name="bean名稱" property="屬性名" param="請求參數名" />

<jsp:getProperty> - 取得屬性值

<jsp:getProperty name="bean名稱" property="屬性名" />

完整實戰範例

基本使用

<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<html><body>
<jsp:useBean id="date" class="java.util.Date" />
<p>目前時間:<%= date %></p>
</body></html>

StudentsBean 完整操作

<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<html><head><title>JavaBean 操作範例</title></head><body>

<jsp:useBean id="student" class="com.example.model.StudentsBean" scope="request">
    <jsp:setProperty name="student" property="firstName" value="小強"/>
    <jsp:setProperty name="student" property="lastName" value="王"/>
    <jsp:setProperty name="student" property="age" value="20"/>
</jsp:useBean>

<p>學生名字:<jsp:getProperty name="student" property="firstName"/></p>
<p>學生姓氏:<jsp:getProperty name="student" property="lastName"/></p>
<p>學生年齡:<jsp:getProperty name="student" property="age"/></p>

</body></html>

執行結果

學生名字:小強
學生姓氏:王
學生年齡:20

表單自動繫結 (property="*")

<html><body>
<form action="process.jsp" method="post">
    名字:<input type="text" name="firstName" /><br/>
    姓氏:<input type="text" name="lastName" /><br/>
    年齡:<input type="number" name="age" /><br/>
    <input type="submit" value="送出" />
</form>
</body></html>
<!-- process.jsp -->
<jsp:useBean id="student" class="com.example.model.StudentsBean" scope="request">
    <jsp:setProperty name="student" property="*" />
</jsp:useBean>

<p>收到資料:${student.firstName} ${student.lastName}, ${student.age} 歲</p>

進階應用模式

1. 作用域選擇指南

場景建議 Scope理由
頁面暫存計算結果page請求結束即釋放,不佔記憶體
表單驗證錯誤回填request轉發至表單頁面共用
使用者登入資訊session跨請求保持登入狀態
系統設定、快取資料application全域共用、啟動載入
購物車session用戶專屬、跨頁面存取

2. Bean 作為表單支援類別 (Form Bean)

public class RegisterFormBean implements Serializable {
    private String username;
    private String email;
    private String password;
    private String confirmPassword;
    // getter/setter...
    
    // 業務驗證方法
    public boolean isValid() {
        return username != null && email != null 
            && password != null && password.equals(confirmPassword);
    }
    
    public List<String> getErrors() {
        List<String> errors = new ArrayList<>();
        if (username == null || username.trim().isEmpty()) 
            errors.add("使用者名稱必填");
        if (!email.contains("@")) errors.add("Email 格式錯誤");
        if (password == null || password.length() < 6) 
            errors.add("密碼至少 6 碼");
        if (!password.equals(confirmPassword)) 
            errors.add("兩次密碼不一致");
        return errors;
    }
}

3. 工具型 Bean (Utility Bean)

<jsp:useBean id="utils" class="com.example.util.StringUtils" scope="application" />
<p>格式化金額:${utils.formatCurrency(order.total)}</p>
<p>截斷文字:${utils.truncate(description, 100)}</p>

4. 資料傳輸物件 (DTO/VO)

public class OrderVO implements Serializable {
    private Long id;
    private String orderNo;
    private BigDecimal total;
    private List<OrderItemVO> items;
    private CustomerVO customer;
    private Date createTime;
    // getter/setter...
}

EL 整合 JavaBean

現代 JSP 推薦使用 EL 直接存取 Bean 屬性:

<jsp:useBean id="student" class="com.example.StudentsBean" scope="request">
    <jsp:setProperty name="student" property="*" />
</jsp:useBean>

<!-- EL 取代 jsp:getProperty -->
<p>姓名:${student.firstName} ${student.lastName}</p>
<p>年齡:${student.age}</p>

<!-- EL 取代 jsp:setProperty (僅讀取) -->
<c:if test="${student.age >= 18}">
    成年人
</c:if>

常見問題與解決

問題原因解決
Bean 找不到類別class 路徑錯誤、未部署至 WEB-INF/classes檢查 package 名稱、編譯輸出路徑
屬性無法設定缺少 setter、型別不符、property 名稱錯誤確認 setter 存在、型別轉換、名稱大小寫
作用域不生效scope 拼錯、轉發未包含目標頁面使用正確 scope、request 轉發而非 redirect
property="*" 不動作請求參數名與屬性名不符、型別轉換失敗參數名=屬性名、提供 String→目標型別轉換
Thread Safety 問題application/session scope Bean 非執行緒安全使用同步機制、ThreadLocal、無狀態設計

最佳實務總結

  1. 遵循規範:無參建構子、Serializable、標準 getter/setter
  2. 最小作用域原則:能用 page 就不用 request,能用 request 就不用 session
  3. 善用 property="*":表單自動繫結減少樣板碼
  4. EL 取代標籤:${bean.property} 比 <jsp:getProperty> 更簡潔
  5. 業務邏輯封裝:Bean 中加入驗證、計算、格式化方法
  6. 無狀態設計:共用 Scope Bean 應為無狀態或執行緒安全
  7. 資源清理:實作 AutoCloseable 或提供 close() 方法
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved