Spring表单处理,将实体映射到表单输入


问题内容

仅查看petclinic示例应用程序,并尝试学习表单处理。

似乎表单映射到实体1:1是正确的吗?还有其他需要完成的配置吗,还是spring会知道所有表单输入都映射到实体,因为那是在GET请求中添加到模型的内容?

@Controller
@RequestMapping("/owners/*/pets/{petId}/visits/new")
@SessionAttributes("visit")
public class AddVisitForm {

    private final Clinic clinic;


    @Autowired
    public AddVisitForm(Clinic clinic) {
        this.clinic = clinic;
    }

    @InitBinder
    public void setAllowedFields(WebDataBinder dataBinder) {
        dataBinder.setDisallowedFields("id");
    }

    @RequestMapping(method = RequestMethod.GET)
    public String setupForm(@PathVariable("petId") int petId, Model model) {
        Pet pet = this.clinic.loadPet(petId);
        Visit visit = new Visit();
        pet.addVisit(visit);
        model.addAttribute("visit", visit);
        return "pets/visitForm";
    }

    @RequestMapping(method = RequestMethod.POST)
    public String processSubmit(@ModelAttribute("visit") Visit visit, BindingResult result, SessionStatus status) {
        new VisitValidator().validate(visit, result);
        if (result.hasErrors()) {
            return "pets/visitForm";
        }
        else {
            this.clinic.storeVisit(visit);
            status.setComplete();
            return "redirect:/owners/" + visit.getPet().getOwner().getId();
        }
    }

}

问题答案:

请注意@SessionAttributes该类上的注释:

  • 当原始GET请求到达时,新创建Visit的存储在会话中。
  • 当后续事件POST出现时,将使用表单中的输入值来更新存储在会话中的对象。
  • Visit最终保留的时间是,status.setComplete()删除会话属性。

不使用时@SesssionAttributesVisit将在出现时使用表单输入值重新创建POST