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()
删除会话属性。
不使用时@SesssionAttributes
,Visit
将在出现时使用表单输入值重新创建POST
。