2016-11-06 170 views
4

我对Spring MVC注解@ModelAttribute有一些疑问。 在第一个名为“addProduct”的方法中,我创建Model模型,并在调用model.addAttribute后,我可以在jsp文件中使用“product”名称,例如product.getProductPrice。 但在与第一个方法相同的第二个方法中,我添加了参数 “@ModelAttribute(”product“)Product product”,但是为什么? 如果我会删除这个注释,我的程序工作是一样一样的,请给我解释一下) 非常感谢你,我的英语很抱歉,我是来自乌克兰)Spring MVC注释@ModelAttribute

@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"; 
} 
+0

这是不言而喻的,你不清楚你在问什么。在第一种情况下,您将在控制器内部创建“Product”并将其放入模型中。在第二种情况下,您从请求内容中获取“产品”信息。 (看在老天的份上,不要硬编码这样疯狂的文件操作!如果你有*有类似的东西,用'@Value'来指定它。) – chrylis

+0

尽管它可能似乎工作实际上它不相同。特别是当开始使用验证或与'@ SessionAttributes'结合时,你会看到奇怪的行为。 –

回答

2

目的@ModelAttribute是绑定PARAM /来自请求模型对象的属性, 说@ModelAttribute("person") Person person在你的方法中,它将绑定来自对象的属性,比如名字,年龄给Person以及构造一个对象。它不会将任何内容传递给您的视图,一旦请求提交,它就会完成。没有落实到该行动的视角。

相比之下,当您有Model model时,您正在显式构造一个属性添加到其属性的对象。它不会像@ModelAttribute高于

相关问题