关于Spring MVC和JSP。
我的JSP迭代用户列表。每个用户都显示在一行表格中。
每行都有一个编辑和一个删除按钮。
当点击任一按钮时,我想调用关联的控制器方法,为关联的行传递用户模型。
为此,我在循环中添加了一个表单。但是,当我单击该按钮时,控制器中的用户模型值始终为空。
这是我的控制器方法:
@RequestMapping(value = "/user/delete", method = RequestMethod.POST)
public ModelAndView deleteUser(@ModelAttribute("user") User user) {
....
}
这是我的JSP
<c:forEach var="user" items="${users}">
<form:form action="/" id="user${user.id}Form" method="post" commandName="user">
<tr>
<td class="col-xs-8 col-sm-8 col-md-8 col-lg-8">${user.id}: ${user.firstName} ${user.lastName}</td>
<td class="col-xs-4 col-sm-4 col-md-4 col-lg-4">
<div class="btn-toolbar pull-right" role="btn-toolbar">
<div class="btn-group" role="group">
<input class="btn btn-default btn-default"
type="Submit"
value="Edit"
id="${user.id}"
onclick="document.getElementById('user${user.id}Form').action='${pageContext.request.contextPath}/user/updateLoad'">
</div>
<div class="btn-group" role="group">
<input class="btn btn-default btn-default"
type="Submit"
value="Delete"
id="${user.id}"
onclick="document.getElementById('user${user.id}Form').action='${pageContext.request.contextPath}/user/delete'">
</div>
</div>
</td>
</tr>
</form:form>
</c:forEach>
请将用户模型传递给控制器需要做什么?
如果我执行以下操作,我可以在控制器中获取值,但是,由于开销,我不认为这是一个实用的解决方案。
<c:forEach var="user" items="${users}">
<form:form action="/" id="user${user.id}Form" method="post" commandName="user">
<input type="hidden" name="id" value="${user.id}"/>
<input type="hidden" name="firstName" value="${user.firstName}"/>
<input type="hidden" name="lastName" value="${user.lastName}"/>
<input type="hidden" name="phone" value="${user.phone}"/>
<input type="hidden" name="address" value="${user.address}"/>
答案 0 :(得分:0)
方法参数上的@ModelAttribute指示应从模型中检索参数。如果模型中不存在,则应首先实例化参数,然后将其添加到模型中。 一旦出现在模型中,参数的字段应该从所有具有匹配名称的请求参数中填充。
WebDataBinder类将请求参数名称与名称模型属性字段匹配。在必要时应用类型转换(从String到目标字段类型)后填充匹配字段。
您的案例:
1.Spring首先创建模型用户的实例,如果它没有实例化,然后它尝试绑定数据。正确?
2.现在问题是,在你的情况下,spring会如何将请求参数名称与名称的模型属性字段匹配?
Spring创建实例但是在绑定数据时失败,因此您获得了一个null实例。这就是为什么不能用这个approch来完成的。
我认为做这件事的唯一方法就是使用你已经在问题中发布的第二种方法。