Яка мета та використання @ModelAttribute
весняного MVC?
Яка мета та використання @ModelAttribute
весняного MVC?
Відповіді:
@ModelAttribute
посилається на властивість об'єкта Model (M у MVC;), скажімо, у нас є форма з об'єктом резервної форми, який називається "Person". Тоді ви можете мати Spring MVC подавати цей об'єкт методу Controller за допомогою @ModelAttribute
анотації :
public String processForm(@ModelAttribute("person") Person person){
person.getStuff();
}
З іншого боку, анотація використовується для визначення об'єктів, які мають бути частиною Моделі. Таким чином, якщо ви хочете, щоб на об'єкт Person посилався в моделі, ви можете використовувати наступний метод:
@ModelAttribute("person")
public Person getPerson(){
return new Person();
}
Цей анотований метод дозволить отримати доступ до об'єкта Person у вашому перегляді, оскільки він автоматично додається до моделей до Spring.
@ModelAttribute
першому випадку ви насправді не потребуєте .
@ModelAttribute
в атрибутах методу?
Я знаю, що це стара нитка, але я подумав, що я кидаю капелюшок на кільце і дивлюсь, чи зможу я замутити воду ще трохи :)
Я знайшов свою початкову боротьбу, щоб зрозуміти @ModelAttribute
була результатом рішення Весни поєднати кілька анотацій в одну. Це стало зрозумілішим, коли я розділив його на кілька менших приміток:
Для анотацій параметрів подумайте @ModelAttribute
як еквівалент, @Autowired + @Qualifier
тобто він намагається отримати боб із заданою назвою з моделі, керованої Spring. Якщо названий боб не знайдений, замість того, щоб видаляти помилку чи повертати null
, він неявно бере на себе роль@Bean
тобто створити новий екземпляр за допомогою конструктора за замовчуванням та додати bean до моделі.
Для анотацій методів вважайте @ModelAttribute
їх еквівалентом @Bean + @Before
, тобто він ставить боб, побудований за кодом користувача, в модель, і він завжди викликається перед методом обробки запиту.
Образно кажучи, я бачу @ModelAttribute
таке (будь ласка, не сприймайте це буквально !!):
@Bean("person")
@Before
public Person createPerson(){
return new Person();
}
@RequestMapping(...)
public xxx handlePersonRequest( (@Autowired @Qualifier("person") | @Bean("person")) Person person, xxx){
...
}
Як бачите, Весна прийняла правильне рішення зробити @ModelAttribute
всеохоплюючу анотацію; ніхто не хоче бачити анотацію smorgasbord.
@Scope("request")
then :)
Для мого стилю я завжди використовую @ModelAttribute для вилучення об'єкта з весняної форми jsp. Наприклад, я створюю форму на сторінці jsp, яка існує з commandName
<form:form commandName="Book" action="" methon="post">
<form:input type="text" path="title"></form:input>
</form:form>
і я ловлю об'єкт на контролері з наступним кодом
public String controllerPost(@ModelAttribute("Book") Book book)
і кожне ім'я поля книги має відповідати шляху в піделементі форми
catch
Дієслово точно описує роботу, @ModelAttribute
виконану. Приємно.
Тому я спробую пояснити це більш простим способом. Давайте:
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
}
Як описано у весняній документації MVC - анотація @ModelAttribute може використовуватися на методах або на аргументах методів . І звичайно, ми можемо одночасно використовувати обидва в одному контролері.
1.Метод анотації
@ModelAttribute(“cities”)
public List<String> checkOptions(){
return new Arrays.asList(new[]{“Sofia”,”Pleven","Ruse”});//and so on
}
Мета такого методу - додати атрибут у модель. Тож у нашому випадку ключ міст матиме список new Arras.asList(new[]{“Sofia”,”Pleven","Ruse”})
як значення в Моделі (ви можете подумати про модель як карту (ключ: значення)). Методи @ModelAttribute в контролері викликаються перед методами @RequestMapping в межах одного контролера.
Тут ми хочемо додати до моделі загальну інформацію, яка буде використовуватися у формі для відображення користувачеві. Наприклад, його можна використовувати для заповнення вибору HTML:
2.Метод аргумент
public String findPerson(@ModelAttriute(value="person") Person person) {
//..Some logic with person
return "person.jsp";
}
Аргумент @ModelAttribute на методі вказує, що аргумент слід отримати з моделі. Тож у цьому випадку ми очікуємо, що у нас є об'єкт Model person як ключовий, і ми хочемо отримати його значення та поставити його до аргументу методу Person person . Якщо такого не існує або (іноді ви неправильно пишете (value = "persson")), тоді Spring не знайде його в Моделі та створить порожній Person об'єкт, використовуючи його за замовчуванням. Потім візьме параметри запиту і спробує зв'язати дані в об'єкт Person, використовуючи їх імена.
name="Dmitrij"&countries=Lesoto&sponsor.organization="SilkRoad"&authorizedFunds=&authorizedHours=&
Таким чином, у нас є ім'я, і воно буде прив’язане до Person.name за допомогою setName (String name). Так в
//..Some logic with person
ми маємо доступ до цього заповненого імені зі значенням "Димитрій".
Звичайно, Весна може зв’язати більш складні об'єкти, такі як Списки, Карти, Список наборів карт тощо, але поза сценою це робить прив'язку даних магією.
Ми можемо одночасно моделювати анотований метод і запитувати обробник методу запиту з @ModelAttribute в аргументах. Тоді ми маємо об'єднати правила.
Звичайно, у нас є безліч різних ситуацій - методи @ModelAttribute можна також визначити в @ControllerAdvice і так далі ...
Я знаю, що я спізнююсь на вечірку, але я цитую, як кажуть, "краще спізнитися, ніж ніколи". Тож давайте ми почнемо: у кожного є свої способи пояснення речей, дозвольте спробувати підсумувати їх та спростити для вас за кілька кроків на прикладі; Припустимо, у вас проста форма, form.jsp
<form:form action="processForm" modelAttribute="student">
First Name : <form:input path="firstName" />
<br><br>
Last Name : <form:input path="lastName" />
<br><br>
<input type="submit" value="submit"/>
</form:form>
path = "firstName" path = "lastName" Це поля / властивості у StudentClass, коли форма називається, їх виклики отримують, але як тільки вони подаються, їх виклики задаються, і їх значення встановлюються в квасолі, яка вказана в modelAttribute = "студент" у тезі форми.
У нас є StudentController, який включає такі методи;
@RequestMapping("/showForm")
public String showForm(Model theModel){ //Model is used to pass data between
//controllers and views
theModel.addAttribute("student", new Student()); //attribute name, value
return "form";
}
@RequestMapping("/processForm")
public String processForm(@ModelAttribute("student") Student theStudent){
System.out.println("theStudent :"+ theStudent.getLastName());
return "form-details";
}
//@ModelAttribute("student") Student theStudent
//Spring automatically populates the object data with form data all behind the
//scenes
тепер нарешті ми маємо форму-details.jsp
<b>Student Information</b>
${student.firstName}
${student.lastName}
Повернемось до питання Що таке @ModelAttribute у MVC весни? Визначення вибірки з джерела для вас, http://www.baeldung.com/spring-mvc-and-the-modelattribute-annotation @ModelAttribute є анотацією , яка пов'язує параметр методу або метод повертає значення до імені атрибута моделі а потім виставляє його на веб-перегляд.
Що насправді відбувається, це отримує всі значення вашої форми, які були подані нею, а потім тримає їх, щоб ви прив’язали або призначили їх об’єкту. Він працює так само, як @RequestParameter, де ми отримуємо лише параметр і присвоюємо значення деякому полі. Різниця лише в тому, що @ModelAttribute містить всі форми форми, а не один параметр. Він створює для вас боб, який зберігає надані форми форми для подальшого використання розробником.
Щоб резюмувати всю справу. Крок 1: Надсилається запит і запускається наш метод showForm, і модель, встановлюється тимчасова квасоля з іменем студент, що передається у форму. theModel.addAttribute ("студент", новий Student ());
Крок 2: modelAttribute = "студент" у формі подання форми змінює студента і тепер він містить усі параметри форми
Крок 3: @ModelAttribute ("студент") Студент Студент. Ми отримуємо значення, які зберігаються у @ModelAttribute, і присвоюємо студенту весь боб / об'єкт.
Крок 4: А потім ми використовуємо його під час подання заявок, як і показувати його на сторінці тощо, як я
Сподіваюся, це допоможе вам зрозуміти концепцію. Дякую
Візьміть будь-яку веб-програму, будь то Gmail або Facebook, Instagram або будь-який інший веб-додаток, все полягає в обміні даними або інформацією між кінцевим користувачем і програмою або інтерфейсом користувача та додатком із зворотним кінцем. Навіть у весняному світі MVC існує два способи обміну даними:
Ми тут зацікавлені в тому, як дані передаються з інтерфейсу користувача до контролера. Це також можна зробити двома способами:
Використання форми HTML: Розгляньте нижченаведений сценарій,
Коли ми надсилаємо дані форми з веб-браузера, ми можемо отримати доступ до цих даних у нашому класі контролера як об’єкт. Коли ми надсилаємо HTML-форму, Spring Container виконує чотири речі. Це буде,
Щоб змусити цю роботу працювати, нам доведеться дотримуватися певних кроків.
Спершу нам потрібно визначити клас моделі, як-от User, у якому кількість полів повинна точно відповідати кількості полів у формі HTML. Також імена, які ми використовуємо у формі HTML, повинні відповідати іменам, які ми маємо в класі Java. Ці два дуже важливі. Імена повинні відповідати, кількість полів у формі повинна відповідати кількості полів у класі, який ми створюємо. Як тільки ми це зробимо, Контейнер автоматично зчитує дані, що надходять, створює об'єкт цієї моделі, встановлює значення і передає їх Контролеру. Щоб прочитати ці значення всередині контролера, ми використовуємо @ModelAttributeпримітку про параметри методу. Коли ми створюємо методи в Контролері, ми будемо використовувати @ModelAttribute і додамо до нього параметр, який автоматично матиме цей об'єкт, наданий Контейнером.
Ось приклад коду для реєстрації користувача:
@RequestMapping(value = "registerUser", method = RequestMethod.POST)
public String registerUser(@ModelAttribute("user") User user, ModelMap model) {
model.addAttribute("user", user);
return "regResult";
}
Сподіваюсь, це діаграмне пояснення допомогло!
Це використовується для прив'язки даних навесні MVC
. Нехай у вас є jsp, який має в ньому елемент форми, наприклад
на
JSP
<form:form action="test-example" method="POST" commandName="testModelAttribute"> </form:form>
(Метод Spring Form, також може бути використаний простий елемент форми)
На стороні контролера
@RequestMapping(value = "/test-example", method = RequestMethod.POST)
public ModelAndView testExample(@ModelAttribute("testModelAttribute") TestModel testModel, Map<String, Object> map,...) {
}
Тепер, коли ви подасте форму, значення полів форми будуть вам доступні.
@ModelAttribute може використовуватися як аргумент / параметр методу або перед оголошенням методу. Основна мета цієї примітки - прив’язати параметри запиту або поля форми до об'єкта моделі
@ModelAttribute
створить атрибут з іменем, вказаним вами (@ModelAttribute("Testing") Test test) as Testing
в наведеному прикладі. Тест - тест bean, який посилається на квасоля, і Тестування буде доступно в моделі, щоб ви могли надалі використовувати його на jsp-сторінках для пошуку значень, які ви зберегли в тобі ModelAttribute
.
@ModelAttribute просто прив'язує значення з поля jsp до кальсо Pojo для виконання нашої логіки в класі контролера. Якщо ви знайомі з підказками, то це як заповнення об'єкта formbean після подання.
Анотація ModelAttribute використовується як частина веб-програми Spring MVC і може використовуватися в двох сценаріях.
Перш за все, це може бути використане для введення даних у модель навантаження перед JSP. Це особливо корисно для забезпечення того, що потрібен JSP для відображення всіх даних. Ін’єкцію отримують шляхом підключення одного методу до моделі.
По-друге, з його допомогою можна прочитати дані з існуючої моделі та призначити їх параметрам методу тренера.
refrence https://dzone.com/articles/using-spring-mvc%E2%80%99s
На рівні методу
1. Коли анотація використовується на рівні методу, вона вказує, що мета цього методу - додати один або кілька атрибутів моделі
@ModelAttribute
public void addAttributes(Model model) {
model.addAttribute("india", "india");
}
В аргументі методу 1. Якщо він використовується як аргумент методу, він вказує, що аргумент слід отримати з моделі. Якщо немає, і його слід спочатку інстанціювати, а потім додавати до моделі та одного разу присутній у моделі, поля аргументів повинні бути заповнені з усіх параметрів запиту, які мають відповідні імена. Отже, він пов'язує дані форми з бобом.
@RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
public String submit(@ModelAttribute("employee") Employee employee) {
return "employeeView";
}