何时是一个精确调用的@ModelAttribute注释方法?

时间:2012-07-15 17:12:40

标签: java spring data-binding spring-mvc modelattribute

以下是一个简单的Spring表单控制器来处理“添加项目”用户请求:

@Controller
@RequestMapping("/addItem.htm")
public class AddItemFormController {

    @Autowired
    ItemService itemService;

    @RequestMapping(method = RequestMethod.GET)
    public String setupForm(ModelMap model) {
        return "addItem";
    }

    @ModelAttribute("item")
    public Item setupItem() {
        Item item = new Item();
        return item;
    }

    @RequestMapping(method = RequestMethod.POST)
    protected String addItem(@ModelAttribute("item") Item item) {
        itemService.addItem(item);
        return "itemAdded";
    }

}

我在某处读到:(...) the @ModelAttribute is also pulling double duty by populating the model with a new instance of Item before the form is displayed and then pulling the Item from the model so that it can be given to addItem() for processing.

我的问题是,setupItem()何时以及经常被称为精确调用?如果用户请求多个添加项目,Spring会保留单独的模型副本吗?

1 个答案:

答案 0 :(得分:6)

在调用setupItem方法之前,对于此控制器中的任何@RequestMapping方法的每个请求,将调用@RequestMapping一次。因此,对于您的addItem方法,流程将调用setupItem,创建名为item的模型属性,因为您的addItem参数也标有@ModelAttributeitem将在此时使用POST参数进行增强。