只需查看petclinic示例应用程序,并尝试学习表单处理。
似乎表单映射到实体1:1正确吗?是否有任何其他配置需要完成,或者只是知道所有表单输入都映射到实体,因为这是在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();
}
}
}
答案 0 :(得分:2)
注意课程上的@SessionAttributes
注释:
GET
请求到来时,新创建的Visit
将存储在会话中。 POST
到来时,会话中存储的对象将使用表单中的输入值进行更新。Visit
时,status.setComplete()
会删除会话属性。如果没有@SesssionAttributes
,Visit
会在POST
到来时使用表单输入值重新创建{{1}}。
答案 1 :(得分:0)
在jsp上,你必须使用标签弹出form标签并将每个变量绑定到modal属性,并且还必须在form标签中指定modalattribute名称。 Tag ref