知識庫 / Spring / Spring MVC RSS 訂閱

使用 Spring MVC 快速入門表單開發

Spring MVC
HongKong
9
03:02 PM · Dec 06 ,2025

1. 概述

本文將討論 Spring 形式和數據綁定到控制器。此外,我們還將深入瞭解 Spring MVC 中主要註解之一,即 @ModelAttribute

當然,Spring MVC 是一項複雜的主題,需要您理解許多內容才能充分發揮其潛力,因此請務必深入研究該框架。

2. 模型

首先,讓我們定義一個簡單的實體,我們將用於顯示並將其綁定到表單上:

public class Employee {
    private String name;
    private long id;
    private String contactNumber;

    // standard getters and setters
}

這將是我們的表單後端對象。

3. 視圖

接下來,讓我們定義實際的表單,以及包含它的 HTML 文件。我們將使用一個頁面,用於創建/註冊新員工:


<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<html>
    <head>
    </head>
    <body>
        <h3>Welcome, Enter The Employee Details</h3>
        <form:form method="POST" 
          action="/spring-mvc-xml/addEmployee" modelAttribute="employee">
             <table>
                <tr>
                    <td><form:label path="name">Name</form:label></td>
                    <td><form:input path="name"/></td>
                </tr>
                <tr>
                    <td><form:label path="id">Id</form:label></td>
                    <td><form:input path="id"/></td>
                </tr>
                <tr>
                    <td><form:label path="contactNumber">
                      Contact Number</form:label></td>
                    <td><form:input path="contactNumber"/></td>
                </tr>
                <tr>
                    <td><input type="submit" value="Submit"/></td>
                </tr>
            </table>
        </form:form>
    </body>
</html>

首先,請注意我們正在將一個標籤庫包含到我們的 JSP 頁面中——form 標籤庫——以幫助定義我們的表單。

接下來,<form:form> 標籤在此處起着重要作用;它與常規 HTML 的 <form> 標籤非常相似,但 modelAttribute 屬性是關鍵,它指定了支持此表單的模型對象的名稱:

<form:form method="POST" 
  action="/SpringMVCFormExample/addEmployee" modelAttribute="employee">

這將在後續的控制器中對應到 ModelAttribute

接下來——每個輸入字段都使用了 Spring Form taglib 中的另一個有用的標籤——form: prefix。這些字段指定了 一個 path 屬性——這必須與模型屬性的 getter/setter 對應(在本例中是 Employee 類)。當頁面加載時,輸入字段由 Spring 填充,這會調用與每個綁定到輸入字段的 getter。當表單提交時,setter 會被調用以將表單的值保存到對象中。

最後——當 表單提交時,控制器的 POST 處理程序會被調用,並且表單會自動綁定到我們傳遞的 employee 參數。

4. 控制器

現在,讓我們來看一下負責處理後端邏輯的 控制器

@Controller
public class EmployeeController {

    @RequestMapping(value = "/employee", method = RequestMethod.GET)
    public ModelAndView showForm() {
        return new ModelAndView("employeeHome", "employee", new Employee());
    }

    @RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
    public String submit(@Valid @ModelAttribute("employee")Employee employee, 
      BindingResult result, ModelMap model) {
        if (result.hasErrors()) {
            return "error";
        }
        model.addAttribute("name", employee.getName());
        model.addAttribute("contactNumber", employee.getContactNumber());
        model.addAttribute("id", employee.getId());
        return "employeeView";
    }
}

控制器定義了兩個簡單的操作:GET 用於以表單形式顯示數據,以及通過表單提交進行的 POST 操作。

請注意,如果名為“employee”的對象未添加到模型中,當我們嘗試訪問 JSP 時,Spring 會抱怨,因為 JSP 會配置為將表單綁定到“employee”模型屬性上。

java.lang.IllegalStateException: 
  Neither BindingResult nor plain target object 
    for bean name 'employee' available as request attribute
  at o.s.w.s.s.BindStatus.<init>(BindStatus.java:141)

為了訪問我們的表單後置對象,我們需要通過使用 @ModelAttribute 註解進行注入。

@ModelAttribute 註解應用於方法參數上,表示該參數將從模型中檢索。如果該參數不在模型中,則會首先實例化該參數,然後將其添加到模型中。

5. 處理綁定錯誤

默認情況下,Spring MVC 在請求綁定過程中發生錯誤時會拋出異常。這通常不是我們想要的,而是應該將這些錯誤呈現給用户。我們將通過將 BindingResult 添加為控制器方法的參數來實現這一點:

public String submit(
  @Valid @ModelAttribute("employee") Employee employee,
  BindingResult result,
  ModelMap model)

BindingResult 參數需要位於我們表單後置對象之後,這是少數幾個參數順序真正重要的案例。否則,我們將會遇到以下異常:

java.lang.IllegalStateException: 
  Errors/BindingResult argument declared without preceding model attribute. 
    Check your handler method signature!

現在,不再拋出異常;相反,錯誤將被註冊到傳遞給 submit 方法的 BindingResult 對象上。 在此時,我們可以用多種方式處理這些錯誤——例如,可以取消操作:

@RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
public String submit(@Valid @ModelAttribute("employee")Employee employee, 
  BindingResult result,  ModelMap model) {
    if (result.hasErrors()) {
        return "error";
    }
    
    //Do Something
    return "employeeView";
}

請注意,如果結果包含錯誤,我們將會返回另一個視圖給用户,以便正確地顯示這些錯誤。讓我們來查看一下這個視圖——error.jsp

<html>
    <head>
    </head>

    <body>
        <h3>Please enter the correct details</h3>
        <table>
            <tr>
                <td><a href="employee">Retry</a></td>
            </tr>
        </table>
    </body>

</html>

顯示員工信息

此外,除了創建新員工之外,我們還可以簡單地顯示一個員工,以下是用於快速查看員工信息的代碼:

<body>
    <h2>Submitted Employee Information</h2>
    <table>
        <tr>
            <td>Name :</td>
            <td>${name}</td>
        </tr>
        <tr>
            <td>ID :</td>
            <td>${id}</td>
        </tr>
        <tr>
            <td>Contact Number :</td>
            <td>${contactNumber}</td>
        </tr>
    </table>
</body>

JSP 頁面只是使用 EL 表達式來顯示模型中 Employee 對象屬性的值。

7. 測試應用程序

簡單的應用程序可以部署——例如,在 Tomcat 服務器上進行部署,並進行本地訪問:

http://localhost:8080/spring-mvc-xml/employee

這是包含主表單的視圖——在提交操作之前:

Spring MVC 表單示例——提交

提交後,數據將顯示出來:

Spring MVC 表單示例——查看

一切都完成了——一個使用 Spring MVC 的簡單表單的運行示例,包含驗證。

本 Spring MVC 教程的實現可以在 GitHub 項目 中找到——這是一個 Maven 類型的項目,因此應該很容易導入和運行。

正如我在文章的開頭所説,您應該深入研究 Spring MVC。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.