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。