1. 概述

在本教程中,我们将在Spring MVC 表单入门的基础上进行扩展,为 JSP 表单添加一个额外的按钮,并将其映射到相同的 URI 上

2. 简要回顾

此前,我们构建了一个小型 Web 应用程序,用于录入员工信息并保存在内存中。

我们首先编写了一个模型类 Employee 用于绑定实体数据,接着创建了一个 EmployeeController 来处理流程和请求映射,最后定义了一个名为 employeeHome 的视图页面,用于展示用户输入表单。

该表单原本只有一个 Submit 按钮,点击后会调用控制器中的 RequestMapping 方法 addEmployee,将用户输入的数据通过模型保存到内存数据库中。

接下来的部分,我们将探讨如何在同一表单中添加另一个 Cancel 按钮,并让这两个按钮共享同一个 RequestMapping 路径

3. 表单修改

首先,我们在 employeeHome.jsp 中添加一个新的按钮:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
...
<body>
    <h3>Welcome, Enter The Employee Details</h3>
    <h4>${message}</h4>
    <form:form method="POST" action="${pageContext.request.contextPath}/addEmployee" 
      modelAttribute="employee">
        <table>
            ...
            <tr>
                <td><input type="submit" name="submit" value="Submit" /></td>
                <td><input type="submit" name="cancel" value="Cancel" /></td>
            </tr>
...

关键点说明:

  • 我们为原有的 Submit 按钮添加了 name="submit" 属性。
  • 新增了一个 Cancel 按钮,并设置其 name="cancel"
  • 在页面顶部添加了一个 ${message} 变量,用于显示取消操作时的提示信息。

4. 控制器调整

接下来,我们对 Controller 进行调整,使用 params 参数来区分不同按钮的点击事件:

@RequestMapping(value = "/addEmployee", method = RequestMethod.POST, params = "submit")
public String submit(@Valid @ModelAttribute("employee") final Employee employee, 
  final BindingResult result, final ModelMap model) {
    // 与之前相同逻辑
}

@RequestMapping(value = "/addEmployee", method = RequestMethod.POST, params = "cancel")
public String cancel(@Valid @ModelAttribute("employee") final Employee employee, 
  final BindingResult result, final ModelMap model) {
    model.addAttribute("message", "You clicked cancel, please re-enter employee details:");
    return "employeeHome";
}

要点解析:

  • 在原有的 submit 方法上添加了 params = "submit",表示只有当请求中包含名为 submit 的参数时才会触发该方法。
  • 添加了新的 cancel 方法,签名类似,但 params = "cancel",确保只响应 Cancel 按钮点击。
  • 注意这里的 params 值必须与表单中对应按钮的 name 属性一致。

⚠️ 踩坑提醒:
如果你不加 params 区分,Spring MVC 会因为无法确定调用哪个方法而抛出异常。所以这个技巧是必须掌握的。

5. 测试验证

部署项目到 Tomcat 等 Web 容器后访问:

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

你将看到如下界面(含两个按钮):

Multiple Button Form

点击 Cancel 后,页面将刷新并显示提示信息:

Cancel Clicked 1

点击 Submit 则正常提交数据,跳转至结果页:

Submit Clicked 1

6. 小结

通过本教程,我们学会了如何在 Spring MVC 应用中,在同一表单中添加多个提交按钮,并将它们映射到控制器中的同一 RequestMapping 接口。

核心技巧总结:

  • 使用 <input type="submit" name="xxx" value="yyy"> 设置按钮名称;
  • @RequestMapping 中通过 params = "xxx" 明确区分不同的按钮点击事件;
  • 可以根据需要添加更多按钮,复用这一机制。

如需查看完整源码,可以访问 GitHub:https://github.com/eugenp/tutorials/tree/master/spring-web-modules/spring-mvc-forms-jsp


原始标题:Multiple Submit Buttons on a Form | Baeldung