Spring MVC注解 @ModelAttribute 的含义

4

我有关于Spring MVC注解@ModelAttribute的一些问题。

在第一个名为“addProduct”的方法中,我创建了Model model,并在调用model.addAttribute后可以在jsp文件中使用“product”名称,例如product.getProductPrice。但在第二个同名方法中,我添加了参数“@ModelAttribute(“product”)Product product”,但是为什么?如果我删除此注释,我的程序将像以前一样工作,请解释一下。

非常感谢,对不起我的英语,我来自乌克兰。

@RequestMapping("/admin/productInventory/addProduct")
public String addProduct(Model model) {
    Product product = new Product();
    // add default for radio button!
    product.setProductCategory("Mobile Phone");
    product.setProductCondition("New");
    product.setProductStatus("active");

    model.addAttribute("product", product);

    return "addProduct";
}

@RequestMapping(value = "/admin/productInventory/addProduct", method = RequestMethod.POST)
public String addProduct(@ModelAttribute("product") Product product, HttpServletRequest request) {
    productDao.addProduct(product);

    MultipartFile productImage = product.getProductImage();
    String rootDirectory = request.getSession().getServletContext().getRealPath("/");
    System.out.println(rootDirectory);
    // product id as the file name
    // !!!! TODO
    // path = Paths.get(rootDirectory + "/WEB-INF/resources/image/" +
    // product.getProductId() + ".png");

    path = Paths.get("F:\\Spring\\eMusicStore\\src\\main\\webapp\\WEB-INF\\resources\\images\\"
            + product.getProductId() + ".png");

    if (productImage != null && !productImage.isEmpty()) {
        try {
            productImage.transferTo(new File(path.toString()));
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("Product image saving failed", e);
        }
    }
    return "redirect:/admin/productInventory";
}

不清楚你的问题是什么。在第一种情况下,您将在控制器内创建Product并将其放入模型中。在第二种情况下,您将从请求内容中获取Product信息。(请不要硬编码疯狂的文件操作!如果您必须使用此类东西,请使用具有@Value属性来指定它。) - chrylis -cautiouslyoptimistic-
尽管在表面上看起来可能是相同的,但实际上并非如此。特别是在开始使用验证或与@SessionAttributes结合使用时,您会看到奇怪的行为。 - M. Deinum
1个回答

2

Purpose @ModelAttribute 是从请求中绑定参数/属性到一个模型对象,比如说在你的方法中使用 @ModelAttribute("person") Person person,它会将属性如姓名、年龄绑定到Person对象并构造出一个对象。它不会向你的视图传递任何东西,一旦请求提交,它的工作就完成了。它不会被传递到该操作的视图中。

相反,当你拥有 Model model 时,你正在显式地构造一个带有属性添加到其属性的对象。与上述的 @ModelAttribute 不同,它将被传递到你的视图中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接