2010-12-07 56 views
1

我正在加载用户对象,然后将其作为命令对象存储在控制器中的GET模型中。此用户对象具有许多未在jsp页面中映射的属性。提交表单后,我在POST上获取控制器上的命令对象。但奇怪的是,我只能看到命令对象中映射到jsp页面的属性。我加载对象时出现的所有其他属性均丢失。我需要对象中的所有属性能够成功地将它保存在数据库中。Spring MVC基于Annotation的Controller控制器命令对象在POST上丢失值

任何人都可以帮我解决这个问题吗?谢谢!

更新

我加入一些代码,以便更好地理解它。在POST处理程序中,我期待命令对象除了使用jsp绑定的属性外,还具有GET处理程序中加载的所有属性。相反,我失去了除jsp之外的所有propeties。我在这里做错了什么?

@RequestMapping(method = RequestMethod.GET) 
    public String showForm(ModelMap model, HttpSession session, HttpServletRequest request) throws Exception { 
     UserBean user = Util.getUser(session); 
     UserBean command = (UserBean)userProfileService.loadByUserName(user.getUserName()); 
     model.addAttribute("command", command); 
     return formView; 
    } 

@RequestMapping(method = RequestMethod.POST) 
    public String onSubmit(@ModelAttribute("command") UserBean command, BindingResult result, HttpSession session) throws Exception { 
    UserBean user = (UserBean) command; 
     userProfileService.saveUser(user); 
     return "successView"; 
} 

更新

我加入一些代码,以便更好地理解它。在POST处理程序中,我期待命令对象除了使用jsp绑定的属性外,还具有GET处理程序中加载的所有属性。相反,我失去了除jsp之外的所有propeties。我在这里做错了什么?

@RequestMapping(method = RequestMethod.GET) public String showForm(ModelMap model, HttpSession session, HttpServletRequest request) throws Exception { UserBean user = Util.getUser(session); UserBean command = (UserBean)userProfileService.loadByUserName(user.getUserName()); model.addAttribute("command", command); return formView; } 

@RequestMapping(method = RequestMethod.POST) public String onSubmit(@ModelAttribute("command") UserBean command, BindingResult result, HttpSession session) throws Exception { UserBean user = (UserBean) command; userProfileService.saveUser(user); return "successView"; } 

更新

如果我保存命令对象会如何将jsp的绑定化子性质。我以为我需要将它存储在模型中?请问你能解释一下吗?

更新

存储会话的命令对象解决了这个问题。我可以通过使用

@SessionAttributes ("command") 

非常感谢!

+0

添加信息时不要添加一个答案。你应该更新你的问题。我这次是为你做的(你现在应该删除'答案')。 – Bozho 2010-12-07 16:56:01

回答

1

这是预期的行为。 Spring不会把你现有的对象(它会如何得到它) - 它会创建一个新对象并用数据填充它。

您可以使用@ModelAttribute带注释的方法指定一种方法,该方法将通过存储库(db?)的ID(提交)加载现有对象。

@ModelAttribute带注释的方法在所选的@RequestMapping带注释的处理程序方法之前执行。它们有效地预先填充隐含模型和特定属性,通常从数据库加载。然后,可以通过所选处理程序方法中的@ModelAttribute带注释的处理程序方法参数来访问此类属性,可能会对其应用绑定和验证。

15.3.2.8 of the MVC docs

+0

对于懒惰:http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-modelattrib – 2012-06-01 11:01:59

0

弹簧MVC Model值成为你的JSP请求范围的属性。这是一种单向翻译,当用户从页面发布表单时,Spring-MVC不会恢复Model值。

当我需要在GET和POST之间存储信息(即,在GET上设置某些内容并在POST上读取它)时,我设置了一个Session属性。

在你的情况,我相信,你需要做以下之一:

  1. 呼叫Util.getUser(session);onSubmit方法。
  2. 商店command对象在showForm了会议,并在onSubmit法>
0

@ModelAttribute找回它是用来将照片直接设置在从JSP Student对象,在servlet其他明智的价值观,你必须使用request.getattribute()获取属性,而不是调用student setter方法。 所以你可以在jsp页面中使用这两个关键字。

<form action="grade" method="get" name="contact1" modelAttribute="contact1"> 
       </form> 

相关问题