Spring 2.0引入form標簽庫,徹底解決早期依賴JSTL/<spring:bind>的痛苦體驗,提供類Struts但更優雅的表單綁定體驗。
<%@ taglib prefix="form" uri="https://www.springframework.org/tags/form" %>
<form:form>
用戶名:<form:input path="userName" /><br>
密碼:<form:password path="password" /><br>
Email:<form:input path="email" /><br>
<input type="submit" value="註冊" />
</form:form>
智能特性:
action屬性 → 自動提交到當前控制器URLcommand對象 → 可通過commandName="user"自定義<form id="command" method="post" action="/app/registerUser.html">| 標簽 | HTML輸出 | 適用場景 |
|---|---|---|
| <form:input path="..."/> | <input type="text" .../> | 單行文本 |
| <form:password path="..."/> | <input type="password" .../> | 密碼輸入 |
| <form:textarea path="..." cols="20" rows="3"/> | <textarea ...></textarea> | 多行文本 |
支持級聯屬性:path="user.userName" → 調用getUser().getUserName()
<form:hidden path="times"/> <!-- 生成 <input type="hidden" name="times" value="0"/> -->
<form:form>
性別:<form:radiobutton path="sex" value="0"/>男
<form:radiobutton path="sex" value="1"/>女
</form:form>
sex=0時生成:
<input type="radio" name="sex" value="0" checked="checked"/>男
<input type="radio" name="sex" value="1"/>女
綁定類型 → 選中判斷邏輯:
| 屬性類型 | 選中條件 | 典型場景 |
|---|---|---|
| boolean | 值為true | 單選項(如同意條款) |
| String[]/Collection/Enum | 值在集合中 | 多選項(興趣愛好) |
| 其他 | 值可轉換匹配 | 兼容模式 |
public class UserRegisterController extends SimpleFormController {
// 初始表單對象
protected Object formBackingObject(HttpServletRequest request) {
User user = new User();
user.setFavorites(Arrays.asList("1", "3")); // 默認選中
return user;
}
// 表單顯示數據
protected Map referenceData(HttpServletRequest request) {
Map favoriteMap = new LinkedHashMap<>();
favoriteMap.put("1", "Computer");
favoriteMap.put("2", "Sport");
favoriteMap.put("3", "Entertainment");
favoriteMap.put("4", "Literature");
return new ModelMap("favoriteMap", favoriteMap);
}
}
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<form:form>
興趣愛好:
<c:forEach items="${favoriteMap}" var="fav">
<form:checkbox path="favorites" value="${fav.key}"/>${fav.value}<br>
</c:forEach>
</form:form>
生成HTML包含配對隱藏域:
<input type="checkbox" name="favorites" value="1" checked/>
<input type="hidden" name="_favorites" value="1"/> <!-- 關鍵! -->
作用:未勾選時瀏覽器不提交checkbox值,隱藏域確保Spring檢測到字段存在,觸發setFavorites()將集合置空,避免殘留舊值。
<form:select path="city" items="${cityList}"/>
multiple="multiple")<form:select path="city" items="${cityMap}" itemValue="key" itemLabel="value"/>
生成:
<select name="city">
<option value="1">Beijing</option>
<option value="2">Shanghai</option>
</select>
<input type="hidden" name="_city" value="1"/>
<form:select path="city" items="${cities}" itemValue="code" itemLabel="name"/>
City{code, name}對象集合,自動提取屬性構建選項。
<form:select path="city">
<form:option value="" label="-- 請選擇 --"/>
<form:options items="${cityMap}" itemValue="key" itemLabel="value"/>
</form:select>
默認顯示「請選擇」,未選擇時提交空值。
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "userName", "required.username", "用戶名必填");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "required.password", "密碼不能為空");
<form:form>
用戶名:<form:input path="userName" cssErrorClass="errorInput"/>
<font color="red"><form:errors path="userName"/></font><br>
密碼:<form:password path="password"/>
<font color="red"><form:errors path="password"/></font><br>
</form:form>
path="*":顯示所有錯誤path="lastName*":顯示特定前綴屬性錯誤| 標簽屬性 | HTML屬性 | 說明 |
|---|---|---|
| cssClass | class | 正常樣式類 |
| cssStyle | style | 內聯樣式 |
| cssErrorClass | class(錯誤時) | 驗證失敗時替換樣式 |
<form:input path="userName" cssClass="normal" cssErrorClass="error" cssStyle="width:200px"/>
Spring MVC表單標簽以約定優於配置、智能默認值、類型安全綁定三大特性,實現:
相比Struts標簽,Spring MVC表單標簽更輕量、更直觀、更符合現代Web開發習慣。