我目前想扩展我对Spring MVC的知识,所以我正在调查spring发布的示例Web应用程序。我基本上是在查看Petclinic申请。
在GET方法中,Pet对象被添加到模型属性中,因此JSP可以访问javabean属性。我想我理解这个。
@Controller
@RequestMapping("/addPet.do")
@SessionAttributes("pet")
public class AddPetForm {
@RequestMapping(method = RequestMethod.GET)
public String setupForm(@RequestParam("ownerId") int ownerId, Model model) {
Owner owner = this.clinic.loadOwner(ownerId);
Pet pet = new Pet();
owner.addPet(pet);
model.addAttribute("pet", pet);
return "petForm";
}
@RequestMapping(method = RequestMethod.POST)
public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result, SessionStatus status) {
new PetValidator().validate(pet, result);
if (result.hasErrors()) {
return "petForm";
}
else {
this.clinic.storePet(pet);
status.setComplete();
return "redirect:owner.do?ownerId=" + pet.getOwner().getId();
}
}
}
但我无法理解的是在POST操作期间。我抬头看着我的萤火虫,我注意到我的帖子数据只是用户输入的数据,对我来说很好。
但是当我检查控制器上的数据时。所有者信息仍然完整。我查看了JSP中生成的HTML,但是我看不到有关Owner对象的一些隐藏信息。我不太确定Spring在哪里收集所有者对象的信息。
这是否意味着Spring会根据每个线程请求缓存模型对象?
这适用于Spring MVC 2.5。
答案 0 :(得分:5)
此行为的关键是@SessionAttributes("pet")
,这意味着模型的pet
属性将保留在会话中。在setupForm
中,您执行以下操作:
Pet pet = new Pet();
owner.addPet(pet);
model.addAttribute("pet", pet);
这意味着:创建一个Pet
对象,将其添加到请求中指定的所有者(@RequestParam("ownerId") int ownerId
),这可能是宠物所有者属性设置的位置。
在processSubmit
方法中,您在方法签名中声明@ModelAttribute("pet") Pet pet
,这意味着您需要先前存储在会话中的Pet
对象。 Spring检索此对象,然后将其与JSP中设置的任何内容合并。因此填写了所有者ID。