I currently would like to expand my knowledge on Spring MVC so I am investigating the sample web apps that the spring distribution has. I am basically checking the Petclinic application.
In the GET method, the Pet object was added into the model attributes so the JSP can access the javabean properties. I think I understand this one.
@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();
}
}
}
But the thing that I cannot understand is during the POST operation. I look up at my firebug, and I notice that my post data are only the data that was entered by the user which to me is fine.

But when I inspect the data on my controller. The owner info is still complete. I look up at the generated HTML from the JSP but I cannot see some hidden information about the Owner object. I am quite not sure where does Spring gather the info on the owner object.
Does this mean that Spring is caching the model objects per each thread request?

This is for Spring MVC 2.5.
The key to this behavior is
@SessionAttributes("pet")which means that thepetattribute of the model will be persisted in the session. InsetupFormyou perform the following operations:Which means: create an
Petobject, add it to the owner specified in the request (@RequestParam("ownerId") int ownerId), this is probably where the pet owner attribute gets set.In the
processSubmitmethod, you declare@ModelAttribute("pet") Pet petin the method signature which means that you want thePetobject you previously store in the session. Spring retrieves this object and then merge it with whatever had been set in the JSP. Hence a filled owner id.More information in the Spring documentation