当我想编辑应用程序中的现有用户对象时,我遇到了问题。首先,我有一个控制器类,它提供了以下方法:
@Transactional
@RequestMapping(value = "/edit", method = RequestMethod.GET)
public ModelAndView editUser(HttpServletRequest request) {
String eMail = request.getParameter("email");
User user = userDao.findUserByEMail(eMail);
ModelAndView model = new ModelAndView("UserForm");
model.addObject("user", user);
return model;
}
@Transactional
@RequestMapping(value = "/edit", method = RequestMethod.POST)
public ModelAndView saveEditUser(@Valid User user, BindingResult result) {
System.out.println(user);
if (result.hasErrors()) {
return new ModelAndView("redirect:/");
}
userDao.saveOrUpdate(user);
return new ModelAndView("redirect:/");
}
我有两个JSP文件。第一个显示我的所有用户(存储在数据库中)并提供编辑现有用户的机会(用于添加新用户的相同JSP)。
UserList.jsp
<div align="center">
<h1>Users List</h1>
<h2>
<a href="<c:url value='/new'/>">New User</a>
</h2>
<table border="1">
<th>No</th>
<th>Forename</th>
<th>Surname</th>
<th>Birthdate</th>
<th>E-Mail</th>
<th>Actions</th>
<c:forEach var="user" items="${userList}" varStatus="status">
<tr>
<td>${status.index + 1}</td>
<td>${user.forename}</td>
<td>${user.surname}</td>
<td>${user.birthdate}</td>
<td>${user.email}</td>
<td><a href="<c:url value='/edit?email=${user.email}'/>">Edit</a>
<a href="<c:url value='/delete?email=${user.email}'/>">Delete</a>
</td>
</tr>
</c:forEach>
</table>
</div>
UserForm.jsp
<div align="center">
<h1>New/Edit User</h1>
<table>
<form:form method="post" modelAttribute="user">
<form:hidden path="id" id="id" />
<tr>
<td>Forename:</td>
<td><form:input path="forename" id="forename" /></td>
</tr>
<tr>
<td>Surname:</td>
<td><form:input path="surname" id="surname" /></td>
</tr>
<tr>
<td>Birthdate:</td>
<td><form:input path="birthdate" id="birthdate" /></td>
</tr>
<tr>
<td>E-Mail:</td>
<td><form:input path="email" id="email" /></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit"
value="Save"></td>
</tr>
</form:form>
</table>
</div>
<br />
<br /> Go back to
<a href="<c:url value='/listUsers' />">List of all users</a>
编辑用户后,用户的mail
属性第二次包含相同的值,我不知道原因。例如,我想将用户的surname
从User
更改为UserA
,我收到了错误消息:
org.springframework.validation.BeanPropertyBindingResult:1个错误
字段'email'上对象'user'中的字段错误:被拒绝的值 [试验@ user.com,测试@ user.com];代码 [Email.user.email,Email.email,Email.java.lang.String,电子邮件];参数 [org.springframework.context.support.DefaultMessageSourceResolvable: 代码[user.email,email];参数[];默认消息 [邮件],[Ljavax.validation.constraints.Pattern $标志; @ 653e5537,*]; 默认消息[请提供有效的电子邮件地址]
我不知道为什么会这样,如果你能帮助我,我会很高兴。
答案 0 :(得分:1)
调用URL editUser
时会调用/edit?email=...
方法。该方法加载文件UserForm.jsp
中定义的视图。 JSP文件包含HTML form
标记,但未设置表单标记的action
属性。因此,表单将提交到加载表单的同一URL(即/edit?email=...
)。
该表单又包含一个名为email
的字段。该字段随表单一起提交。这就是您在模型对象中获得两次相同电子邮件地址的原因。
如果您不希望电子邮件地址可编辑,则可以使用文本标签而不是input
表单字段。如果您希望电子邮件地址可以编辑,请将URL参数的名称更改为email
以外的其他名称。