2016-11-06 168 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高於

相關問題