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
你将看到如下界面(含两个按钮):
点击 Cancel 后,页面将刷新并显示提示信息:
点击 Submit 则正常提交数据,跳转至结果页:
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