3

我的要求是通过在 JSP 中为用户提供一个表单来执行 CREATE 操作,该表单具有来自两个实体的输入字段(例如UserDetailsEmploymentDetails

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

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

请指导。

4

2 回答 2

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 保存对象,但我认为在这种情况下过于矫枉过正且过于复杂。

于 2012-09-02T08:39:16.440 回答
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" />
于 2012-09-02T03:07:00.923 回答