Jsp表单将一个空对象传递给Spring控制器

时间:2016-02-05 21:20:30

标签: java spring jsp spring-mvc

在当前的控制器中,我用我的userWrapper填充了无权使用应用程序的用户集合,并将其作为属性发送到jsp,它将在那里呈现。

ascii

在jsp中存在与UserWrapper集合用户的User对象绑定的复选框。我的jsp页面看起来像:

@RequestMapping(value = "/cockpit")
    public String cockpit(Model model, UserWrapper receivedUserWrapper) {
        siftOutEnabled(receivedUserWrapper);

        try {
            List<User> users = userService.findAllUsersWhoNotAccepted();
            UserWrapper userWrapper = new UserWrapper();
            userWrapper.setUsers(users);
            model.addAttribute("wrapper", userWrapper);
            model.addAttribute("users", userWrapper.getUsers());
        } catch (UsersNotFoundException e) {
        }

        return "cockpit";
    }

这个jsp页面呈现正确的结果:

<form:form method="POST" commandName="wrapper" action="cockpit">
        <table>
            <tr>
                <th>id</th>
                <th>mail</th>
                <th>pass</th>
                <th>registrationDate</th>
                <th></th>
            </tr>
            <c:forEach items="${users}" var="user" varStatus="loop">
                <tr>
                    <td>${user.id}</td>
                    <td>${user.email}</td>
                    <td>${user.password}</td>
                    <td>${user.registrationDate}</td>
                    <td><form:checkbox path="users[${loop.index}].enabled" />
                </tr>
            </c:forEach>
        </table>
        <input type="submit" name="submit" value="submit" />
    </form:form>

每一行附近都存在checbox,当我检查一些行,并将帖子发送到控制器时,我只捕获这些值吗?复选框工作。

id  mail    pass    registrationDate    
1   market@test.ra  pass    2016-02-02 21:46:40.0   
2   tara@ra.ra  passwd  2016-02-03 20:37:18.0   

为什么值为null或0? 这是我的UserWrapper类和User consrtuctor:

[User [id=0, email=null, password=null, enabled=true], 
User [id=0, email=null, password=null, enabled=false]]

更新 我还会问:如何将对象从控制器发送到jsp,在那里更改该对象,然后将此已经更改的对象发送回控制器......

更新

public class User implements Serializable {
...
public User(long id, String email, String password, Date registrationDate, boolean enabled) {
        this.setEmail(email);
        this.setPassword(password);
        this.registrationDate = registrationDate;
        this.setEnabled(enabled);
        roles = new HashSet<>();
    }
...
}

public class UserWrapper {

    private boolean checked;
    private List<User> users;

...
}

1 个答案:

答案 0 :(得分:1)

问题出在你的jsp代码中,只有复选框可以在名称和值对中发送表单数据。因此,您只获得复选框的值。尝试按如下方式更新您的jsp。

<td>${user.id}<input type="hidden" name="users[${loop.index}].id" value="${user.id}"/></td>
<td>${user.email}<input type="hidden" name="users[${loop.index}].email" value="${user.email}"/></td>
<td>${user.password}<input type="hidden" name="users[${loop.index}].password" value="${user.password}"/></td>
<td>${user.registrationDate}<input type="hidden" name="users[${loop.index}].registrationDate" value="${user.registrationDate}"/></td>
<td><form:checkbox path="users[${loop.index}].enabled" />

<强>被修改

对于日期,您需要在控制器类中注册CustomDateEditor:

@InitBinder
public void initBinder(WebDataBinder binder) {
    CustomDateEditor editor = new CustomDateEditor(new SimpleDateFormat("MM/dd/yyyy"), true);
    binder.registerCustomEditor(Date.class, editor);
}