创建不映射到实体的表单

时间:2010-03-19 18:55:35

标签: java spring spring-mvc velocity

使用spring MVC,我如何创建一个不映射到实体的表单(即它具有来自多个实体的属性)。

我还要验证并使用具有错误集合等的“结果”对象。

这是什么在线示例?我需要看到它才能理解它(新手)

1 个答案:

答案 0 :(得分:0)

您只需创建一个包含表单所需的所有属性的新类,并将其用作表单的模型属性。在接听电话上,您也可以使用此类型。 Spring会自动为您绑定属性。您还应该考虑使用JSR-303验证注释。

一般方法是加载所有必需的实体,以便在GET请求中创建表单支持对象。然后将该表单支持对象放入模型中。在POST / PUT请求中,您必须重建触摸的实际实体。通常,您再次加载它们,然后将新提交的部分数据应用于它们。

一般来说,构建一个专用组件来处理组装行为可能是一个好主意,以免您使用该代码污染控制器。

/**
 * Prepares the form by setting up a custom form backing object.
 */
@RequestMapping(value = "account/{id}", method = GET)
public String processGet(@PathVariable("id") Long id, Model model) {

  Account account = accountService.getAccount(id);
  return prepareForm(dtoAssembler.createFormFor(account), model);
}


/**
 * Process form submission. Uses JSR-303 validation and explicit error 
 * handling.
 */  
@RequestMapping(value = "account/{id}", method = PUT)
public String processGet(@ModelAttribute("accountForm") @Valid AccountForm form, Errors errors, Model model) {

  if (errors.hasErrors()) {
    return prepareForm(form, model);
  }

  Account account = accountService.getAccount(form.getId());
  accountService.save(dtoAssembler.applyData(account, form));

  return "redirect:/accounts";
}


/**
 * Populates the given {@code Model} with the given {@code AccountForm}
 * and returns the view to show the form.
 */     
private String prepareForm(AccountForm form, Model model) {
  model.addAttribute("accountForm", form);
  return "account";
}

我在这里写这篇文章是为了强调正在发生的事情。在现实世界中,我可能会让DtoAssembler完成服务的所有工作(所以我将服务注入汇编程序)。

为了便于使用Dozer将数据从DTO传输到域对象,BeanUtils或类似的东西可能是合理的。