| 標籤 | 用途 | 關鍵屬性 |
|---|---|---|
<jsp:useBean> | 聲明/查找/實例化 Bean | id (頁面變量名)、class (全限定類名)、scope (page/request/session/application)、type (聲明類型)、beanName (Beans.instantiate 名稱) |
<jsp:setProperty> | 設置 Bean 屬性 | name (匹配 useBean id)、property (* / 屬性名)、param (請求參數名)、value (固定值/EL) |
<jsp:getProperty> | 讀取 Bean 屬性並輸出 | name、property |
com.example.UserBeanpackage com.example;
import java.io.Serializable;
public class UserBean implements Serializable {
private String username;
private String email;
private int age;
// 無參構造器
public UserBean() {}
// Getter/Setter
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
@Override public String toString() { return "User["+username+","+email+","+age+"]"; }
}
register.jsp<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<html><body>
<h2>用戶註冊</h2>
<form method="post" action="process.jsp">
用戶名:<input name="username" required><br>
郵箱:<input name="email" type="email" required><br>
年齡:<input name="age" type="number" min="1" max="120"><br>
<button type="submit">提交</button>
</form>
</body></html>
process.jsp<%@ page contentType="text/html;charset=UTF-8" %>
<jsp:useBean id="user" class="com.example.UserBean" scope="request" />
<jsp:setProperty name="user" property="*" /> <!-- 自動綁定所有同名請求參數 -->
<h3>註冊成功!</h3>
<p>用戶名:<jsp:getProperty name="user" property="username" /></p>
<p>郵箱:<jsp:getProperty name="user" property="email" /></p>
<p>年齡:<jsp:getProperty name="user" property="age" /></p>
<!-- 進階:手動設置/EL 設置 -->
<jsp:setProperty name="user" property="username" value="admin" />
<jsp:setProperty name="user" property="age" value="${param.age + 1}" />
| Scope | 生命週期 | 適用場景 |
|---|---|---|
page (默認) | 當前頁面請求處理期間 | 臨時計算工具、頁面級輔助對象 |
request | 一次 HTTP 請求 (含 forward/include) | 表單提交處理、請求級數據傳遞 |
session | 用戶會話期間 (默認 30 分鐘無操作超時) | 登入用戶信息、購物車、向導式多步驟流程 |
application | Web 應用生命週期 (容器啟動到關閉) | 全局配置、緩存數據、統計計數器 (需線程安全) |
target/classes,打包進 WEB-INF/classes。javac -d webapps/myapp/WEB-INF/classes -cp "..." src/com/example/UserBean.javaWEB-INF/lib/。PropertyEditor (Spring MVC 提供 ConversionService 更強大)。IllegalArgumentException,或使用 JSR-303 Bean Validation (@NotNull, @Size 等) 配合框架攔截器。property="*" 風險自動綁定**所有**請求參數,惡意用戶可提交額外參數篡改敏感屬性 (如 balance=0, role=admin)。
防範:
<jsp:setProperty name="user" property="username"/> <jsp:setProperty name="user" property="email"/> ...@InitBinder 設置 setAllowedFields / setDisallowedFields。JSP 標準動作 (useBean/setProperty/getProperty) 提供了聲明式的 Bean 整合方式,配合合理的 Scope 選擇與安全綁定策略,能快速構建清晰的 MVC 應用。現代項目多改用 Spring MVC @ModelAttribute + Thymeleaf/Facelets,但理解原生機制有助於維護舊系統與排查問題。