2013-03-05 3 views
0

Привет я задавался вопросом, что цель использования @ModelAttribute зачем использоватьКакова цель использования @ModelAttribute

@RequestMapping(value="") 
public String index(@ModelAttribute("before") Before b) { 
    System.out.println(b.getBeforeString()); 
    return "home/index"; 
} 

@ModelAttribute("before") 
public Before before() { 
    return new Before(); 
} 

, когда я могу использовать

@RequestMapping(value="") 
public String index() { 
    Before b = new Before(); 
    System.out.println(b.getBeforeString()); 
    return "home/index"; 
} 

ответ

3

@ModelAttribute используется для заполнения вещи в модель MVC для последующего использования в представлении. Это не единственный способ поместить вещи в модель (это может быть сделано непосредственно с помощью кода), но это удобный способ добавить, помимо прочего, метод args метода @RequestMapping или возвращаемое значение.

Методы, аннотированные с помощью @ModelAttribute, вызывают ПРИОР до каждого метода @RequestMapping, который вызывается в том же классе контроллера. Обычно это используется для всплывающих компонентов только для чтения для формы - например, значений для списка выбора. (http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-ann-modelattrib-methods) - или для подготовки компонентов до привязки значений входящих запросов (например, загрузка из хранилища данных).

Так, в первом примере ...

@ModelAttribute("before") 
public Before before() { 
    return new Before(); 
} 
@RequestMapping(value="") 
public String index(@ModelAttribute("before") Before b) { 
    System.out.println(b.getBeforeString()); 
    return "home/index"; 
} 

... метод before() будет вызван первым и поставить Before экземпляр в модели с именем «до». Затем будет вызываться метод index(...) и получить тот же самый экземпляр Before (поскольку он также использует имя атрибута модели «до»), но теперь он будет заполнен значениями из запроса, где имена параметров запроса сопоставляются с именами свойств «До» , (Кроме того: это, возможно, не то, что вы намереваетесь. Если это действительно то, что вы хотите, вы должны рассмотреть вопрос о добавлении BindingResult в качестве второго аргумента в метод индекса, чтобы поймать любые ошибки привязки (http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-ann-arguments bullet point 17)).

После этого @ModelAttribute anntotation в index(...) будет также причиной того, что Before экземпляр должен присутствовать модель с именем «перед» для использования в следующей точки зрения: «/ главная/индекс».

(Стоит отметить:. Если вы не имеете метода before() вообще, ваш метод index() будет Получать экземпляр Before, созданный с его конструктором без аргументов, а затем popuplated с поступающими значениями запроса было бы еще впоследствии поставил это в модели с именем «до» для использования следующего вида.)

Вашей второго фрагмента коды ...

@RequestMapping(value="") 
public String index() { 
    Before b = new Before(); 
    System.out.println(b.getBeforeString()); 
    return "home/index"; 
} 

... на самом деле не добавляя Before к модели на все , поэтому он не будет доступен в представлении. Если вы хотите, прежде чем в модели здесь использовать:

@RequestMapping(value="") 
public String index(Model uiModel) { 
    Before b = new Before(); 
    System.out.println(b.getBeforeString()); 
    uiModel.addAttribute("beforeName", b); // will add to model with name "beforeName" 
    uiModel.addAttribute(b) // will add to model with a default name (lower-cased simple type name by convention), ie: "before" 
    return "home/index"; 
} 

НТН

+0

Так что если '@ ModelAttribute' передать объект для просмотра, как я могу прочитать этот объект, этот метод в представлении? –

+1

Все идет в Модели с именем. С '@ModelAttribute (" before ") Перед' именем 'before' (в нижнем регистре). В вашем JSP-доступе это с помощью EL '$ {before}' и его реквизитов с '$ {before.beforeString}' – sbk

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