2016-11-06 6 views
4

Ich habe eine Frage über Spring MVC Annotation @ModelAttribute. In der ersten Methode namens "addProduct" erstelle ich Model model und nach Aufruf model.addAttribute kann ich den "product" Namen in der jsp Datei verwenden, zum Beispiel product.getProductPrice. Aber in zweiten Methode mit dem gleichen Namen wie die erste, fügte ich Parameter "@ModelAttribute (" Produkt ") Produkt Produkt", aber warum ?? Wenn ich diese Anmerkung löschen wird, mein Programm nach wie vor als gleiche funktioniert, mir bitte erklären) Vielen Dank, sorry für mein Englisch, ich bin aus der Ukraine)Spring MVC Annotation @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

Es ist nicht klar, was Sie fragen. Im ersten Fall erstellen Sie das Produkt im Controller und fügen es in das Modell ein. Im zweiten Fall erhalten Sie die 'Product'-Informationen aus den Anforderungsinhalten. (Und um Himmels willen, programmieren Sie keine verrückte Dateimanipulation! Wenn Sie etwas so haben wollen, verwenden Sie eine Eigenschaft mit '@ Value', um sie zu spezifizieren.) – chrylis

+0

Obwohl es scheint, dass es funktioniert Gleiches gilt für Realität. Besonders wenn Sie mit der Validierung beginnen oder mit '@ SessionAttributes' kombiniert werden, werden Sie seltsames Verhalten bemerken. –

Antwort

2

Zweck @ModelAttribute ist bind param/Eigenschaften von Anfrage ein Modellobjekt, sagen @ModelAttribute("person") Person person in Ihrer Methode, wird es Eigenschaften von Objekt wie Name, Alter zu Person binden und bauen ein Objekt daraus. Es übergibt nichts an Sie, es Job beendet, sobald die Anfrage eingereicht. Nicht auf die Sichtweise dieser Aktion übertragen.

Im Gegensatz dazu, wenn Sie Model model haben, erstellen Sie explizit ein Objekt mit der Eigenschaft hinzugefügt zu seinem Attribut. Es wird zu Ihrer Ansicht getragen, anders als was @ModelAttribute tut über

Verwandte Themen