Spring MVC中的表单入门

2023/05/19

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>标签在这里扮演着重要的角色;它与常规的HTML <form>标签非常相似,但modelAttribute属性是关键,它指定支持此表单的模型对象的名称:

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

这将对应于稍后在控制器中的@ModelAttribute。

接下来,每个输入字段都使用了另一个来自Spring Form标签库的有用标签form:prefix。这些字段中的每一个都指定了一个路径属性,这必须对应于模型属性(在本例中为Employee类)的getter/setter。加载页面时,输入字段由Spring填充,它调用绑定到输入字段的每个字段的getter。提交表单时,将调用setter将表单的值保存到对象中。

最后——提交表单时,控制器中的POST处理程序被调用,表单自动绑定到我们传入的员工参数。

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注解注入它。

方法参数上的一个<em>@ModelAttribute </em>表示将从模型中检索参数。如果模型中不存在,参数将首先被实例化,然后添加到模型中。

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!

现在不再抛出异常;相反,错误将在传递给提交方法的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>

6. 显示员工

最后,除了创建一个新员工之外,我们还可以简单地显示一个,这是快速查看代码:

<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

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章