Spring 提供了强大的表单处理功能,简化了 Web 应用程序中用户输入数据的绑定和校验。在这篇文章中,我们将深入探讨 Spring 的表单处理机制,包括表单提交、使用 @ModelAttribute
进行数据绑定、数据绑定与校验,以及使用 @Valid
和 BindingResult
进行数据验证。
表单提交
在 Spring MVC 中,表单提交通常由 HTML 表单和控制器方法配合实现。HTML 表单用于收集用户输入数据,控制器方法处理这些数据并进行相应的操作。
首先,我们创建一个简单的 HTML 表单,用于收集用户信息:
<!DOCTYPE html>
<html>
<head>
<title>User Form</title>
</head>
<body>
<form action="/submitUser" method="post">
<label for="name">Name:</label>
<input type="text" id="name" name="name"><br><br>
<label for="email">Email:</label>
<input type="email" id="email" name="email"><br><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
这个表单通过 POST 方法提交数据到 /submitUser
URL。
使用 @ModelAttribute
在 Spring MVC 中,@ModelAttribute
注解用于将表单数据绑定到一个模型对象上。这个模型对象通常是一个 JavaBean。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class UserController {
@PostMapping("/submitUser")
public String submitUser(@ModelAttribute User user) {
// 处理用户数据
System.out.println("User Name: " + user.getName());
System.out.println("User Email: " + user.getEmail());
return "userSuccess";
}
}
在这个例子中,@ModelAttribute
注解将表单数据绑定到 User
对象上。
User 类定义:
public class User {
private String name;
private String email;
// Getters and Setters
}
当用户提交表单时,Spring MVC 会自动将表单数据绑定到 User
对象,并传递给 submitUser
方法。
数据绑定与校验
数据绑定是指将表单提交的数据自动转换为模型对象属性的过程。在实际应用中,数据校验是确保用户输入数据符合预期格式和约束的重要步骤。
使用 @Valid 和 BindingResult
Spring 提供了 @Valid
注解和 BindingResult
接口来进行数据校验。@Valid
注解用于触发数据校验,BindingResult
用于存储校验结果。
首先,在 User
类中添加校验注解:
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
public class User {
@NotEmpty(message = "Name is required")
private String name;
@Email(message = "Invalid email address")
@NotEmpty(message = "Email is required")
private String email;
// Getters and Setters
}
接下来,在控制器方法中使用 @Valid
和 BindingResult
进行数据校验:
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import javax.validation.Valid;
@Controller
public class UserController {
@PostMapping("/submitUser")
public String submitUser(@Valid @ModelAttribute User user, BindingResult result) {
if (result.hasErrors()) {
return "userForm";
}
// 处理用户数据
System.out.println("User Name: " + user.getName());
System.out.println("User Email: " + user.getEmail());
return "userSuccess";
}
}
在这个例子中,@Valid
注解用于触发 User
对象的校验,BindingResult
用于存储校验结果。如果存在校验错误,返回到表单视图 userForm
,否则处理用户数据并返回成功视图 userSuccess
。
完整示例
我们将上述所有部分整合成一个完整的示例,包括 HTML 表单、控制器和视图。
HTML 表单
保存为 userForm.jsp
:
<%@ taglib uri="http:///jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<title>User Form</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/submitUser" method="post">
<label for="name">Name:</label>
<input type="text" id="name" name="name" value="${}"><br><br>
<c:if test="${not empty }">
<span >${}</span><br><br>
</c:if>
<label for="email">Email:</label>
<input type="email" id="email" name="email" value="${}"><br><br>
<c:if test="${not empty }">
<span >${}</span><br><br>
</c:if>
<input type="submit" value="Submit">
</form>
</body>
</html>
成功视图
保存为 userSuccess.jsp
:
<!DOCTYPE html>
<html>
<head>
<title>Success</title>
</head>
<body>
<h2>User submitted successfully!</h2>
</body>
</html>
控制器类
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import javax.validation.Valid;
@Controller
public class UserController {
@GetMapping("/userForm")
public String showForm(Model model) {
model.addAttribute("user", new User());
return "userForm";
}
@PostMapping("/submitUser")
public String submitUser(@Valid @ModelAttribute User user, BindingResult result, Model model) {
if (result.hasErrors()) {
model.addAttribute("errors", result.getFieldErrors().stream().collect(
Collectors.toMap(FieldError::getField, FieldError::getDefaultMessage)));
return "userForm";
}
// 处理用户数据
System.out.println("User Name: " + user.getName());
System.out.println("User Email: " + user.getEmail());
return "userSuccess";
}
}
在这个完整示例中,我们展示了如何通过 Spring MVC 进行表单提交、数据绑定与校验,并使用 @Valid
和 BindingResult
进行数据验证。