Spring MVC 3.0: How do I bind to a persistent object

后端 未结 4 409
面向向阳花
面向向阳花 2020-12-10 07:59

I\'m working with Spring MVC and I\'d like it to bind a a persistent object from the database, but I cannot figure out how I can set my code to make a call to the DB before

4条回答
  •  甜味超标
    2020-12-10 08:50

    There are several options:

    • In the simpliest case when your object has only simple properties you can bind all its properties to the form fields (hidden if necessary), and get a fully bound object after submit. Complex properties also can be bound to the form fields using PropertyEditors.

    • You may also use session to store your object between GET and POST requests. Spring 3 faciliates this approach with @SessionAttributes annotation (from the Petclinic sample):

      @Controller
      @RequestMapping("/owners/*/pets/{petId}/edit")
      @SessionAttributes("pet") // Specify attributes to be stored in the session       
      public class EditPetForm {    
          ...
          @InitBinder
          public void setAllowedFields(WebDataBinder dataBinder) {
              // Disallow binding of sensitive fields - user can't override 
              // values from the session
              dataBinder.setDisallowedFields("id");
          }
          @RequestMapping(method = RequestMethod.GET)
          public String setupForm(@PathVariable("petId") int petId, Model model) {
              Pet pet = this.clinic.loadPet(petId);
              model.addAttribute("pet", pet); // Put attribute into session
              return "pets/form";
          }
          @RequestMapping(method = { RequestMethod.PUT, RequestMethod.POST })
          public String processSubmit(@ModelAttribute("pet") Pet pet, 
              BindingResult result, SessionStatus status) {
              new PetValidator().validate(pet, result);
              if (result.hasErrors()) {
                  return "pets/form";
              } else {
                  this.clinic.storePet(pet);
                  // Clean the session attribute after successful submit
                  status.setComplete();
                  return "redirect:/owners/" + pet.getOwner().getId();
              }
          }
      }
      

      However this approach may cause problems if several instances of the form are open simultaneously in the same session.

    • So, the most reliable approach for the complex cases is to create a separate object for storing form fields and merge changes from that object into persistent object manually.

提交回复
热议问题