将两个相同类型的实例绑定到两个Spring MVC表单时发生自动数据绑定

时间:2015-02-06 03:30:13

标签: spring-mvc spring-form

在jsp文件中:

<sf:form ... action="queryUser" modelAttribute="user_a">
    <sf:input path="name"/>
   <input type="submit" id="submit1"/>
</sf:form>

<sf:form ...action="addUser" modelAttribute="user_b">
    <sf:input path="name"/>
   <input type="submit" id="submit2"/>
</sf:form>

在Java文件中:

@Controller
@RequestMapping("/user")
@SessionAttributes("user_a")
public class UserController
{
   ...
   RequestMapping("/addUser")
   public void function(@ModelAttribute("user_a") User user_a,@ModelAttribute("user_b") User user_b,BindingResult bindingResult)
{
  ...
}

}

这是问题所在:当我点击submit2时。 请求实体user_b将传递给user_a和user_b !!

谁知道如何区分他们?

1 个答案:

答案 0 :(得分:0)

我想我弄明白了这个问题。 在遇到问题的情况下:

RequestMapping("/addUser")
public void function(@ModelAttribute("user_a") User user_a,@ModelAttribute("user_b") User user_b,BindingResult bindingResult)
{
  ...
}

在一个控制器的功能中使用两个相同类型的对象并且不想同时修改某个对象的唯一可能性是其中一个已经先前已经填充过,并且您想要使用它它在这个功能。或者您同意修改它们(在这种情况下,您将传递两个不同的实体)。 因此,在我遇到的情况下,只是不要在函数的参数中列出对象。您可以通过以下代码访问现成的模型属性:

RequestMapping("/addUser")
public void function(Model model,@ModelAttribute("user_b") User user_b,BindingResult bindingResult)
{
  // if this is a session attribute, it will not be changed.
  User user_a = model.get("user_a");
  //more codes go here
}

总之,当只有一个有效对象并且函数参数列表中有多个相同类型的对象时,spring MVC框架会将请求的一个有效对象绑定到所有相同类型的变量。 一句话原则: 当且仅当您在函数的参数列表中列出变量时,才会发生变量的绑定操作。