符合特定規範的 Java 類,作為可重用軟體組件。核心規範:
Serializable (建議)getXxx()/setXxx() 存取器isXxx() 作為讀取器package com.example.bean;
public class User implements Serializable {
private String userName;
private String password;
// 無參建構子 (隱式或顯式)
public User() {}
// Getter/Setter
public String getUserName() { return userName; }
public void setUserName(String userName) { this.userName = userName; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
}
IDE 技巧:Eclipse/IntelliJ 右鍵 → Source → Generate Getters and Setters 自動生成。
<jsp:useBean id="beanName" class="package.ClassName" scope="page|request|session|application" />
id:頁面內引用變數名 (對應範圍屬性名)class:完整類名scope:生命週期範圍 (預設 page)
page:當前頁面 (PageContext)request:單次請求 (HttpServletRequest)session:用戶會話 (HttpSession)application:整個 Web 應用 (ServletContext)<!-- 單一屬性 --> <jsp:setProperty name="beanName" property="propertyName" value="value" /> <!-- 批次自動映射 (表單參數名 = 屬性名) --> <jsp:setProperty name="beanName" property="*" /> <!-- 指定參數名不同於屬性名 --> <jsp:setProperty name="beanName" property="userName" param="username" />
<jsp:getProperty name="beanName" property="propertyName" />
toString())name 對應 useBean 的 id<%@ page contentType="text/html;charset=UTF-8" %>
<jsp:useBean id="user" class="com.example.bean.User" scope="page" />
<html>
<body>
<% user.setUserName("張三"); user.setPassword("123456"); %>
<h1>用戶: <jsp:getProperty name="user" property="userName" /></h1>
<p>密碼: <jsp:getProperty name="user" property="password" /></p>
</body>
</html>
<!-- index.jsp: 表單頁 -->
<form action="process.jsp" method="post">
學號: <input name="id" type="text" /><br/>
年齡: <input name="age" type="text" /><br/>
班級: <input name="classes" type="text" /><br/>
<input type="submit" value="提交" />
</form>
<!-- Student.java Bean -->
package com.example.bean;
public class Student {
private int id;
private int age;
private String classes;
// 無參建構子 + Getter/Setter...
}
<!-- process.jsp: 處理頁 -->
<jsp:useBean id="student" class="com.example.bean.Student" scope="request" />
<jsp:setProperty name="student" property="*" /> <!-- 神奇的一行:自動映射所有同名參數 -->
<html><body>
學號: <jsp:getProperty name="student" property="id" /><br/>
年齡: <jsp:getProperty name="student" property="age" /><br/>
班級: <jsp:getProperty name="student" property="classes" />
</body></html>
<jsp:useBean id="book" class="com.example.bean.Book" />
<jsp:setProperty name="book" property="bookName" value="《Java 核心技術》" />
<jsp:setProperty name="book" property="author" value="Cay Horstmann" />
<jsp:setProperty name="book" property="category" value="程式設計" />
<jsp:setProperty name="book" property="price" value="128.00" />
<table border="1" align="center">
<tr><td>書名</td><td><jsp:getProperty name="book" property="bookName" /></td></tr>
<tr><td>作者</td><td><jsp:getProperty name="book" property="author" /></td></tr>
<tr><td>分類</td><td><jsp:getProperty name="book" property="category" /></td></tr>
<tr><td>價格</td><td><jsp:getProperty name="book" property="price" /></td></tr>
</table>
| 範圍 | 生命週期 | 適用場景 | 範例 |
|---|---|---|---|
| page | 單次 JSP 處理過程 | 臨時計算、頁面內輔助物件 | 格式化工具、計算器 |
| request | 單次 HTTP 請求 (含 forward) | 請求處理結果、表單數據綁定 | process.jsp 接收表單 |
| session | 用戶會話 (預設 30 分鐘) | 登入用戶資訊、購物車、偏好設定 | User、ShoppingCart |
| application | 整個 Web 應用 (直到重啟) | 全域配置、快取資料、計數器 | 系統參數、首頁熱門商品 |
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<%-- 使用 EL 表達式 ${} 替代 getProperty --%>
<h1>用戶: ${user.userName}</h1>
<%-- JSTL 迴圈 --%>
<c:forEach items="${bookList}" var="book">
<tr><td>${book.bookName}</td><td>${book.price}</td></tr>
</c:forEach>
優勢:語法更簡潔、分離 Java 代碼、支援巢狀屬性、空值安全 (${null.property} 不報錯)。
setProperty property="*" 但表單參數名與屬性名不符 (大小寫敏感)