2012-09-01 22 views
3

我的要求是由两个实体在JSP为用户提供一个表单的输入域做一个创建操作(例如的UserDetailsEmploymentDetails如何在Spring MVC中从一个jsp更新两个实体/模型元素?

什么是更新两种形式最有效的方法在单个jsp中使用单个提交?

我知道的一种方法是将两个实体组合成一个包装类,然后将该对象作为模型发送。这是唯一的解决方案吗?

请指导。

+1

你真的有两个不同的HTML表单,或者只有两个实体/模式元素/命令对象在同一个HTML表单中吗? – Ralph

+0

@Ralph,实际上我只有一种形式,但它由两个实体/模型元素组成。直到现在,我一直在围绕另一个课程进行包装,然后使用它。现在只是想知道是否有更好的出路。 – LittleLebowski

+0

然后请更正您的问题! - 这很混乱。 – Ralph

回答

0

可以试试映射每个对象到不同的模型属性:

public String create(@Valid @ModelAttribute(value="UserDetails") UserDetails userDetails, 
    @Valid @ModelAttribute(value="EmploymentDetails") EmploymentDetails employmentDetails, 
    BindingResult bindingResult, Model uiModel, HttpServletRequest httpServletRequest) 
{ 

在形式,这些都应该被绑定到不同的前缀,如:

<form:input path="UserDetails.name" /> 
+0

你确定这种方法可行吗?我需要尝试一下。乍一看看,其中一个模型属性将不被识别。你有没有实现它? – LittleLebowski

+0

和每个对象的一个​​BindingResult将需要,对不对? – jelies

+0

没有自己尝试过。 不确定关于绑定结果。 虽然我很想知道.. – Solubris

6

这是一个普遍的做法是任何数量包装类中的对象,并使用它来用单一表单提交数据。此外,你可以在任何物体的使用JSR-303验证:

public class MyForm { 

    @Valid 
    private UserDetails userDetails; 

    @Valid 
    private EmploymentDetails employmentDetails; 

    ... 

} 

表单:

<form:form modelAttribute="myForm" method="post"> 
    <form:input path="userDetails.property1"/> 
    <form:input path="userDetails.property2"/> 
    <form:input path="employmentDetails.property1"/> 
    <input type="submit" value="create"/> 
</form:form> 

和控制器:

@RequestMapping(value = "/", method = RequestMethod.POST) 
public ModelAndView create (@Valid MyForm myForm, BindingResult bindingResult) { 

    if (bindingResult.hasErrors()) { 
     // here you can retrieve form errors of both objects 
    } 

    UserDetails userDetails = myForm.getUserDetails(); 
    EmploymentDetails employmentDetails = myForm.getEmploymentDetails(); 

    ... 

} 

另一种方法是通过JSON保存对象,但在这种情况下,我认为是过度杀伤和过分复杂的。

+0

感谢您的详细解答。我在Spring MVC的早期项目中一直在做这种方法,但只是想知道是否有更好的解决方案。我不知道所有事情,自从我上一个项目以来,Spring已经成熟了许多,因此问道。 – LittleLebowski

相关问题