Spring表单处理,映射实体以形成输入

时间:2010-02-09 19:54:01

标签: java spring spring-mvc

只需查看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();
        }
    }

}

2 个答案:

答案 0 :(得分:2)

注意课程上的@SessionAttributes注释:

  • 当原始GET请求到来时,新创建的Visit将存储在会话中。
  • 当后续POST到来时,会话中存储的对象将使用表单中的输入值进行更新。
  • 最终保留Visit时,status.setComplete()会删除会话属性。

如果没有@SesssionAttributesVisit会在POST到来时使用表单输入值重新创建{{1}}。

答案 1 :(得分:0)

在jsp上,你必须使用标签弹出form标签并将每个变量绑定到modal属性,并且还必须在form标签中指定modalattribute名称。 Tag ref