我的要求是由两个实体在JSP为用户提供一个表单的输入域做一个创建操作(例如的UserDetails和EmploymentDetails)如何在Spring MVC中从一个jsp更新两个实体/模型元素?
什么是更新两种形式最有效的方法在单个jsp中使用单个提交?
我知道的一种方法是将两个实体组合成一个包装类,然后将该对象作为模型发送。这是唯一的解决方案吗?
请指导。
我的要求是由两个实体在JSP为用户提供一个表单的输入域做一个创建操作(例如的UserDetails和EmploymentDetails)如何在Spring MVC中从一个jsp更新两个实体/模型元素?
什么是更新两种形式最有效的方法在单个jsp中使用单个提交?
我知道的一种方法是将两个实体组合成一个包装类,然后将该对象作为模型发送。这是唯一的解决方案吗?
请指导。
可以试试映射每个对象到不同的模型属性:
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" />
你确定这种方法可行吗?我需要尝试一下。乍一看看,其中一个模型属性将不被识别。你有没有实现它? – LittleLebowski
和每个对象的一个BindingResult将需要,对不对? – jelies
没有自己尝试过。 不确定关于绑定结果。 虽然我很想知道.. – Solubris
这是一个普遍的做法是任何数量包装类中的对象,并使用它来用单一表单提交数据。此外,你可以在任何物体的使用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保存对象,但在这种情况下,我认为是过度杀伤和过分复杂的。
感谢您的详细解答。我在Spring MVC的早期项目中一直在做这种方法,但只是想知道是否有更好的解决方案。我不知道所有事情,自从我上一个项目以来,Spring已经成熟了许多,因此问道。 – LittleLebowski
你真的有两个不同的HTML表单,或者只有两个实体/模式元素/命令对象在同一个HTML表单中吗? – Ralph
@Ralph,实际上我只有一种形式,但它由两个实体/模型元素组成。直到现在,我一直在围绕另一个课程进行包装,然后使用它。现在只是想知道是否有更好的出路。 – LittleLebowski
然后请更正您的问题! - 这很混乱。 – Ralph