Spring 的表单处理

38 篇文章 0 订阅

Spring 提供了强大的表单处理功能,简化了 Web 应用程序中用户输入数据的绑定和校验。在这篇文章中,我们将深入探讨 Spring 的表单处理机制,包括表单提交、使用 @ModelAttribute 进行数据绑定、数据绑定与校验,以及使用 @ValidBindingResult 进行数据验证。

表单提交

在 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
}

接下来,在控制器方法中使用 @ValidBindingResult 进行数据校验:

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://java.sun.com/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="${user.name}"><br><br>
        <c:if test="${not empty errors.name}">
            <span style="color:red">${errors.name}</span><br><br>
        </c:if>
        
        <label for="email">Email:</label>
        <input type="email" id="email" name="email" value="${user.email}"><br><br>
        <c:if test="${not empty errors.email}">
            <span style="color:red">${errors.email}</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 进行表单提交、数据绑定与校验,并使用 @ValidBindingResult 进行数据验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值