Spring MVC - 编辑现有对象时重复值

时间:2016-03-28 19:00:57

标签: java spring jsp spring-mvc

当我想编辑应用程序中的现有用户对象时,我遇到了问题。首先,我有一个控制器类,它提供了以下方法:

@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>
                    &nbsp;&nbsp;&nbsp;&nbsp; <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属性第二次包含相同的值,我不知道原因。例如,我想将用户的surnameUser更改为UserA,我收到了错误消息:

  

org.springframework.validation.BeanPropertyBindingResult:1个错误

     

字段'email'上对象'us​​er'中的字段错误:被拒绝的值   [试验@ 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,*];   默认消息[请提供有效的电子邮件地址]

我不知道为什么会这样,如果你能帮助我,我会很高兴。

1 个答案:

答案 0 :(得分:1)

调用URL editUser时会调用/edit?email=...方法。该方法加载文件UserForm.jsp中定义的视图。 JSP文件包含HTML form标记,但未设置表单标记的action属性。因此,表单将提交到加载表单的同一URL(即/edit?email=...)。

该表单又包含一个名为email的字段。该字段随表单一起提交。这就是您在模型对象中获得两次相同电子邮件地址的原因。

如果您不希望电子邮件地址可编辑,则可以使用文本标签而不是input表单字段。如果您希望电子邮件地址可以编辑,请将URL参数的名称更改为email以外的其他名称。