<jsp:setProperty> 四種屬性設置模式完整演示| # | 模式名稱 | 語法 | 核心屬性 |
|---|---|---|---|
| 1 | 自動匹配 | <jsp:setProperty name="bean" property="*"/> | property="*" 掃描所有請求參數 |
| 2 | 指定屬性 | <jsp:setProperty name="bean" property="name"/> | property="屬性名" 單一綁定 |
| 3 | 參數重命名 | <jsp:setProperty name="bean" property="userName" param="name"/> | param="請求參數名" 映射不同名 |
| 4 | 固定值注入 | <jsp:setProperty name="bean" property="status" value="active"/> | value="字面值" 無視請求 |
form.html<form action="demo.jsp" method="post">
姓名:<input name="name"><br>
年齡:<input name="age"><br>
<input type="submit">
</form>
SimpleBean.javapackage javabean01;
public class SimpleBean implements java.io.Serializable {
private String name;
private int age;
private String status; // 新增屬性演示模式 4
// getters/setters 略
public SimpleBean() {}
}
property="*"<jsp:useBean id="simple" class="javabean01.SimpleBean" scope="page">
<jsp:setProperty name="simple" property="*"/>
</jsp:useBean>
<h3>姓名:<jsp:getProperty name="simple" property="name"/></h3>
<h3>年齡:<jsp:getProperty name="simple" property="age"/></h3>
**優點**:零配置、表單新增欄位自動生效。
**缺點**:請求參數污染風險 (惡意提交額外參數)、無法驗證。
property="name"<jsp:useBean id="simple" class="javabean01.SimpleBean" scope="page">
<jsp:setProperty name="simple" property="name"/>
<jsp:setProperty name="simple" property="age"/>
</jsp:useBean>
**優點**:白名單機制、安全可控。
**缺點**:維護成本隨欄位增長線性上升。
param="xxx"場景:前端參數 user_name,Bean 屬性 userName (駝峰)。
<jsp:setProperty name="simple" property="userName" param="user_name"/>
value="xxx"<jsp:setProperty name="simple" property="status" value="active"/>
**用途**:預設狀態、隱性安全標記、CSRF Token 種子、版本號等。**不受請求參數影響**,防範參數篡改。
<jsp:useBean id="simple" class="javabean01.SimpleBean" scope="request">
<!-- 白名單綁定 -->
<jsp:setProperty name="simple" property="name"/>
<jsp:setProperty name="simple" property="age"/>
<!-- 業務預設值 -->
<jsp:setProperty name="simple" property="status" value="pending"/>
<!-- 來源追蹤 -->
<jsp:setProperty name="simple" property="source" value="web_form"/>
</jsp:useBean>
| JSP 模式 | Spring MVC / Jakarta MVC 等價寫法 |
|---|---|
| 自動匹配 | @ModelAttribute UserForm form (綁定所有) |
| 指定屬性 | @RequestParam("name") String name 逐個聲明 |
| 參數重命名 | @RequestParam(value="user_name", required=false) String userName |
| 固定值注入 | form.setStatus("pending") 在 Controller 手工設置 / @ModelAttribute 方法預填 |
property="*"**,改用白名單模式 2 或框架級綁定。isAdmin, role, balance) **永不綁定請求參數**,僅在服務端授權邏輯中設置。