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

Spring MVC 向導式表單處理實戰:AbstractWizardFormController 多步驗證與流程控制全解析

     編輯:Java 相關知識

向導式表單 (向導 1 → 向導 2 → ... → 完成) 是複雜業務數據收集的標準交互模式。Spring MVC 提供 AbstractWizardFormController 內置支援多頁面流轉、逐頁驗證、取消/完成處理,本文以簡歷向導為例完整演示配置與實現。

需求簡化版

  1. 求職意向:期望地點 (必填)、期望薪資。
  2. 基本信息:姓名 (必填)、手機 (必填)。
  3. 工作經歷:文本域。
  4. 項目經驗:文本域。
  5. 完成頁:顯示恭喜信息。

規則:必填項非空驗證,「下一步」驗證當前頁,「上一步」不阻攔但仍驗證,「取消」中斷流程,「完成」提交全部數據。

1. 命令對象 (Command/Form-Backing Object)

package com.unmi.bean;

public class Resume {
    private String workPlace;   // 期望地點
    private int salary;         // 期望薪資
    private String name;        // 姓名
    private String mobile;      // 手機
    private String experience;  // 工作經歷
    private String projects;    // 項目經驗
    // getter/setter 略
}

2. 向導控制器

package com.unmi.webapp.controller;

import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractWizardFormController;
import com.unmi.bean.Resume;

public class ResumeWizardController extends AbstractWizardFormController {

    public ResumeWizardController() {
        setCommandClass(Resume.class);
    }

    // 完成提交處理
    @Override
    protected ModelAndView processFinish(HttpServletRequest request,
                                         HttpServletResponse response,
                                         Object command, BindException errors) {
        Resume resume = (Resume) command;
        // resumeService.submitResume(resume);
        return new ModelAndView("congratulations"); // 邏輯視圖名
    }

    // 逐頁驗證
    @Override
    protected void validatePage(Object command, Errors errors, int page) {
        ResumeValidator validator = (ResumeValidator) getValidator();
        Resume resume = (Resume) command;
        switch (page) {
            case 0: // 求職意向
                validator.validateWorkPlace("workPlace", errors);
                break;
            case 1: // 基本信息
                validator.validateName("name", errors);
                validator.validateMobile("mobile", errors);
                break;
            // 頁 2、3 (經歷/項目) 無必填驗證
        }
    }
}

3. Spring MVC 配置 (resume-servlet.xml)

<beans>
  <bean name="/createResume.html" class="com.unmi.webapp.controller.ResumeWizardController">
    <property name="pages">
      <list>
        <value>intention</value>    <!-- page 0 -->
        <value>baseinfo</value>     <-- page 1 -->
        <value>experience</value>   <-- page 2 -->
        <value>projects</value>     <-- page 3 -->
        <value>congratulations</value> <-- page 4 (完成頁) -->
      </list>
    </property>
    <property name="validator">
      <bean class="com.unmi.webapp.validator.ResumeValidator"/>
    </property>
  </bean>

  <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/resume/"/>
    <property name="suffix" value=".jsp"/>
  </bean>
</beans>

視圖解析:intention → /resume/intention.jsp 等。

4. JSP 頁面關鍵表單結構

通用表單標籤 (Spring 2.0+ form 標籤庫)

<form:form action="/createResume.html" method="post" commandName="command">
  <!-- 頁面特定字段 -->
  <form:input path="workPlace"/>
  <form:errors path="workPlace" cssClass="error"/>

  <!-- 導航按鈕 (關鍵命名規範) -->
  <input type="submit" name="_target0" value="上一步"/>  <!-- 目標頁索引 0 -->
  <input type="submit" name="_target2" value="下一步"/>  <!-- 目標頁索引 2 -->
  <input type="submit" name="_finish" value="完成"/>
  <input type="submit" name="_cancel" value="取消"/>
</form:form>

5. 導航參數規範 (框架約定)

參數名觸發動作說明
_target{index}跳轉到指定頁面索引「上一步」_target0、「下一步」_target{current+1}
_finish調用 processFinish()最終提交,會先觸發當前頁驗證
_cancel調用 processCancel()中斷向導,可覆寫做清理

6. 驗證器實現 (Validator 介面)

package com.unmi.webapp.validator;

import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import com.unmi.bean.Resume;

public class ResumeValidator implements Validator {
    @Override
    public boolean supports(Class clazz) { return Resume.class.equals(clazz); }

    @Override
    public void validate(Object target, Errors errors) {
        // 標準 validate() 不會被 AbstractWizardFormController 自動調用
        // 可在 validatePage(page, true) 中手動調用
    }

    public void validateWorkPlace(String field, Errors errors) {
        // 從資源文件讀取錯誤碼
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, field, "resume.workPlace.required");
    }
    public void validateName(String field, Errors errors) { ... }
    public void validateMobile(String field, Errors errors) { ... }
}

7. 兩個 validatePage 重載選擇


// 版本一:簡單逐頁驗證 (最常用)
protected void validatePage(Object command, Errors errors, int page) { ... }

// 版本二:完成時額外驗證 (含 finish 標誌)
protected void validatePage(Object command, Errors errors, int page, boolean finish) {
    validatePage(command, errors, page);
    if (finish) {
        // 跨頁一致性檢查,如日期邏輯、金額平衡
        // validator.validate(command, errors); // 調用標準 validate()
    }
}

8. 運行效果演示

向導操作演示

  • 必填項為空時點擊「下一步」/「完成」 → 停留當前頁,錯誤信息顯示在字段下方。
  • 「上一步」點擊 → 即使驗證失敗也跳轉上一頁 (數據保留)。
  • 所有頁填寫完成 → 「完成」 → 業務處理 → 顯示祝賀頁。
  • 全程數據自動保持在 Session 中 (框架內置),無需手動管理。

完整項目下載

包含源碼、JAR、國際化資源文件:SpringWizardForm.rar

注意:Spring 3.0+ 推薦使用 @Controller + @SessionAttributes + 手動狀態機實現向導,AbstractWizardFormController 已標記過時。本文方案適用於 Spring 2.x 維護項目或理解向導控制器核心協議 (_target/_finish/_cancel、逐頁驗證、Session 狀態保持) 的教學場景。

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