Spring MVC 2.5使用@modelAttribute形成后备对象

时间:2011-01-26 19:35:01

标签: spring-mvc

@RequestMapping(method = RequestMethod.GET)
public String setupForm(@RequestParam("username") String username, ModelMap model, HttpServletRequest request) {
    User userFromDB = userService.getUser(username);
    UserPersonalDetails userDetails = userService.getUserPersonalDetails(username);
    UserBackingObject user = new UserBackingObject(userDetails.getFirstName() + " " + userDetails.getLastName(), username, userDetails.getEmail(), userDetails.getTelephone());
    model.addAttribute("user", user);

    return EDIT_USER_VIEW;
}


@RequestMapping(method = RequestMethod.POST, params="save")
public String processSave(@ModelAttribute("user") UserBackingObject user, BindingResult result, ModelMap model, HttpServletRequest request) {


    return LISTUSERS_VIEW;
}

以jsp的形式,我只显示用户详细信息(无法编辑或更改),并且我有提交按钮。

当我调试post方法时,用户对象(UserBackingObject)只有用户名,其余字段为null。我不明白为什么会发生这种情况,即使我已创建用户对象并添加到模型中'get'方法。为什么它没有在post方法中显示电子邮件或电话号码?支持对象的目的是发送和接收?有人可以解释清楚吗

1 个答案:

答案 0 :(得分:4)

Spring MVC采用无状态方法。 这意味着(默认情况下)Spring不会在请求之间在服务器上存储与特定用户的任何对话状态。

因此,您在POST方法中获得的UserBackingObject实例与您在GET方法中添加到模型的实例不同。 POST方法中的UserBackingObject是从POST方法的HTTP参数重建的,即来自表单字段的值。这意味着只会填充HTML页面中具有相应字段的属性。

如果需要,您可以覆盖此默认行为by using @SessionAttributes annotation

因此,您可以使用@SessionAttributes在表单中添加其他字段(可能隐藏)或存储模型属性。