2016-11-06 3 views
4

У меня есть вопрос о примечании MVC Spring @ModelAttribute. В первом методе, называемом «addProduct», я создаю модель модели и после вызова model.addAttribute я могу использовать имя «product» в jsp-файле, например product.getProductPrice. Но во втором методе, названном так же, как и первый, я добавил параметр «@ModelAttribute (« продукт ») Product product», но почему? Если я буду удалять эту аннотацию, моя программа работает так же, как и раньше, пожалуйста, объясните мне) Большое спасибо, извините за мой английский, я из Украины)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

Непонятно, что вы просите. В первом случае вы создаете «Продукт» внутри контроллера и помещаете его в модель. Во втором случае вы получаете информацию о продукте из содержимого запроса. (И, ради бога, не делайте жестких манипуляций с файлами так, как это! Если у вас есть *, чтобы иметь что-то подобное, используйте свойство с '@ Value', чтобы указать его.) – chrylis

+0

Хотя он МОЖЕТ, похоже, работает то же самое в реальной жизни это не так. Особенно, когда вы начинаете использовать проверку или комбинируете с '@ SessionAttributes', вы увидите странное поведение. –

ответ

2

Цель @ModelAttribute является связать параметр/свойства из запроса объекта модели говорят, что в вашем методе @ModelAttribute("person") Person person он свяжет свойства объекта с таким именем, от возраста до человека и построит объект из него. Это не передает ничего для вашего взгляда, эта работа заканчивается после подачи запроса. Не доведено до взгляда на это действие.

Наоборот, если у вас есть Model model, вы явно создаете объект с свойством, добавленным к его атрибуту. Он будет перенесен на ваш взгляд, в отличие от того, что @ModelAttribute делает выше

Смежные вопросы