【问题标题】:Spring form handling, mapping an entity to form inputsSpring 表单处理,将实体映射到表单输入
【发布时间】:2010-02-09 19:54:00
【问题描述】:

只看宠物诊所示例应用程序,并尝试学习表单处理。

表格似乎以 1:1 的比例映射到实体?是否有任何其他配置必须完成,或者 spring 只知道所有表单输入都映射到实体,因为这是在 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();
        }
    }

}

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    注意类上的@SessionAttributes注解:

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

    如果没有@SesssionAttributesVisit 将在POST 出现时使用表单输入值重新创建。

    【讨论】:

      【解决方案2】:

      在 jsp 上,您必须弹出表单标签并使用标签将每个变量绑定到模态属性,还必须在表单标签中指定模态属性名称。 Tag ref

      【讨论】:

        猜你喜欢
        • 2015-01-07
        • 1970-01-01
        • 2019-06-14
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 2012-04-21
        • 2015-08-20
        相关资源
        最近更新 更多