@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";
}
НТН
Так что если '@ ModelAttribute' передать объект для просмотра, как я могу прочитать этот объект, этот метод в представлении? –
Все идет в Модели с именем. С '@ModelAttribute (" before ") Перед' именем 'before' (в нижнем регистре). В вашем JSP-доступе это с помощью EL '$ {before}' и его реквизитов с '$ {before.beforeString}' – sbk