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

Spring MVC 數據綁定與表單標簽庫完整實戰指南

     編輯:Java 相關知識

核心概念

數據綁定:自動將 HTTP 請求參數(String)轉換綁定到控制器方法參數或命令對象屬性,支持類型轉換、格式化、驗證。失敗時自動回顯表單數據,提升用戶體驗。

表單標簽庫啟用

<%@ taglib prefix="form" uri="https://www.springframework.org/tags/form" %>

常用標簽速查表

標簽渲染 HTML核心屬性典型場景
<form:input><input type="text">path, id, cssClass單行文本輸入
<form:password><input type="password">path, showPassword密碼輸入
<form:textarea><textarea>path, rows, cols多行文本
<form:checkbox><input type="checkbox">path, value, label單選/布爾值
<form:checkboxes>多個 checkboxpath, items, itemValue, itemLabel多選綁定集合
<form:radiobutton><input type="radio">path, value, label單選組
<form:radiobuttons>多個 radiopath, items, itemValue, itemLabel單選綁定集合
<form:select><select>path, items, itemValue, itemLabel下拉選單
<form:option><option>value, label手動添加選項
<form:options>多個 optionitems, itemValue, itemLabel批量綁定選項
<form:errors><span>path, cssClass顯示驗證錯誤

完整實戰示例

1. 領域模型

public class User {
    private String username;
    private String password;
    private Boolean married;
    private List<String> hobbies;
    private String career;
    private String remark;
    // getter/setter 省略
}

2. 控制器

@Controller
public class UserController {
    @GetMapping("/user/input")
    public String showForm(Model model) {
        Map<Integer, String> hobbyMap = Map.of(
            1, "籃球", 2, "羽毛球", 3, "游泳", 4, "閱讀"
        );
        model.addAttribute("user", new User());
        model.addAttribute("hobbyMap", hobbyMap);
        model.addAttribute("careers", new String[]{"教師", "工程師", "醫生", "其他"});
        return "userForm";
    }

    @PostMapping("/user/save")
    public String save(@ModelAttribute User user, BindingResult result) {
        if (result.hasErrors()) return "userForm";
        userService.save(user);
        return "redirect:/user/list";
    }
}

3. 表單視圖 (userForm.jsp)

<form:form modelAttribute="user" method="post" action="save">
    <div>
        <label>用戶名:</label>
        <form:input path="username" />
        <form:errors path="username" cssClass="error" />
    </div>
    
    <div>
        <label>密碼:</label>
        <form:password path="password" />
    </div>
    
    <div>
        <label>婚姻狀況:</label>
        <form:checkbox path="married" value="true" label="已婚" />
    </div>
    
    <div>
        <label>興趣愛好:</label>
        <form:checkboxes items="${hobbyMap}" path="hobbies" itemKey="key" itemValue="value" />
    </div>
    
    <div>
        <label>職業:</label>
        <form:select path="career">
            <form:option value="" label="--請選擇--" />
            <form:options items="${careers}" />
        </form:select>
    </div>
    
    <div>
        <label>備註:</label>
        <form:textarea path="remark" rows="4" />
    </div>
    
    <button type="submit">提交</button>
</form:form>

關鍵配置

編碼過濾器 (web.xml)

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
    <init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param>
</filter>

類型轉換與格式化

Spring 內置支持基本類型、日期、集合等轉換。自定義轉換器實現 Converter<S, T> 並註冊到 FormattingConversionService。

常見問題與解決

  1. 中文亂碼:POST 請求必須配置 CharacterEncodingFilter,表單 method="post"
  2. 集合綁定空指針:模型屬性初始化集合 hobbies = new ArrayList<>()
  3. Checkbox 未選中不提交:Spring 自動生成隱藏域 _propertyName 為 off,無需手動處理
  4. 日期格式化:在字段加 @DateTimeFormat(pattern="yyyy-MM-dd") 或全局註冊 Formatter

總結

Spring MVC 表單標簽庫通過 path 屬性實現雙向綁定,極大簡化了表單開發。結合 Bean Validation (JSR-380) 與 <form:errors>,可構建健壯的服務端驗證體系。掌握 checkboxes/select 的 items/itemKey/itemValue/itemLabel 組合用法,是處理複雜表單的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved