1. Общ преглед
В тази статия ще обсъдим пролетни форми и обвързване на данни с контролер. Също така ще разгледаме една от основните анотации в Spring MVC, т.е. @ModelAttribute .
Разбира се, Spring MVC е сложна тема с много неща, които трябва да разберете, за да го използвате с пълния си потенциал, така че определено се задълбочете в рамката тук.
2. Моделът
Първо - нека дефинираме прост обект , който ще покажем и обвържем с формата:
public class Employee { private String name; private long id; private String contactNumber; // standard getters and setters }
Това ще бъде нашият обект, подкрепящ формата.
3. Изгледът
След това - нека дефинираме действителната форма и, разбира се, HTML файла, който я съдържа. Ще използваме страница, където се създава / регистрира нов служител:
Welcome, Enter The Employee Details
Name
Id
Contact Number
Първо - забележете, че включваме библиотека от маркери в нашата JSP страница - формуляра taglib - за да помогнем при дефинирането на нашата форма.
След това - таг играе важна роля тук; много прилича на обикновения HTLMтаг, но атрибутът modelAttribute е ключът, който указва име на обекта на модела, който поддържа тази форма:
Това ще съответства на @ModelAttribute по-късно в контролера.
Следваща - всеки полетата за въвеждане се с помощта на още един полезен таг от taglib Пролет форма - форма: префикс . Всяко от тези полета указва атрибут на път - това трябва да съответства на гетер / сетер на атрибута на модела (в този случай класът Служител). Когато страницата се зареди, полетата за въвеждане се попълват от Spring, който извиква getter на всяко поле, обвързано с поле за въвеждане. Когато формулярът е изпратен, задателите се извикват, за да запазят стойностите на формуляра в обекта.
И накрая - когато формулярът е изпратен , се извиква манипулаторът на POST в контролера и формулярът автоматично се обвързва с аргумента на служителя , който сме предали.
4. Контролерът
Сега, нека разгледаме контролера, който ще обработва задния край:
@Controller public class EmployeeController { @RequestMapping(value = "/employee", method = RequestMethod.GET) public ModelAndView showForm() { return new ModelAndView("employeeHome", "employee", new Employee()); } @RequestMapping(value = "/addEmployee", method = RequestMethod.POST) public String submit(@Valid @ModelAttribute("employee")Employee employee, BindingResult result, ModelMap model) { if (result.hasErrors()) { return "error"; } model.addAttribute("name", employee.getName()); model.addAttribute("contactNumber", employee.getContactNumber()); model.addAttribute("id", employee.getId()); return "employeeView"; } }
Контролерът дефинира две прости операции - GET за показване на данни във формуляра и POST за операцията за създаване чрез подаване на формуляра.
Също така имайте предвид, че ако обектът, наречен „служител“ не бъде добавен към модела, Spring ще се оплаче, когато се опитаме да осъществим достъп до JSP, защото JSP ще бъде настроен да обвързва формуляра с атрибута на модел „служител“:
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'employee' available as request attribute at o.s.w.s.s.BindStatus.(BindStatus.java:141)
За да осъществим достъп до нашия обект за обезпечаване на формуляр, трябва да го инжектираме чрез анотацията @ModelAttribute
Един @ModelAttribute
от аргументите метод показва аргумента, ще бъдат изтеглени от модела. Ако не присъства в модела, аргументът първо ще бъде инстанциран и след това добавен към модела.
5. Обработка на грешки при обвързване
По подразбиране Spring MVC извежда изключение, когато възникнат грешки по време на обвързването на заявката. Това обикновено не е това, което искаме, вместо това трябва да представяме тези грешки на потребителя. Ще използваме BindingResult, като добавим такъв като аргумент към нашия метод на контролер:
public String submit( @Valid @ModelAttribute("employee") Employee employee, BindingResult result, ModelMap model)
Аргументът BindingResult трябва да бъде позициониран веднага след обекта ни за обезпечаване на формуляра - това е един от редките случаи, когато редът на аргументите на метода има значение. В противен случай ще срещнем следното изключение:
java.lang.IllegalStateException: Errors/BindingResult argument declared without preceding model attribute. Check your handler method signature!
Сега - вече не се прави изключение; вместо това грешките ще бъдат регистрирани в BindingResult, който се предава на метода за изпращане . На този етап можем да се справим с тези грешки по различни начини - например операцията може да бъде отменена:
@RequestMapping(value = "/addEmployee", method = RequestMethod.POST) public String submit(@Valid @ModelAttribute("employee")Employee employee, BindingResult result, ModelMap model) { if (result.hasErrors()) { return "error"; } //Do Something return "employeeView"; }
Забележете как, в случай че резултатът съдържа грешки, връщаме друг изглед на потребителя, за да покажем правилно тези грешки. Нека да разгледаме този изглед - error.jsp :
Please enter the correct details
Retry
6. Показване на служител
И накрая, освен да създадем нов служител, можем и просто да покажем такъв - ето кода за бърз преглед за това:
Submitted Employee Information
Name :
${name}
ID :
${id}
Contact Number :
${contactNumber}
Страницата JSP просто използва изрази EL за показване на стойности на свойствата на обекта Employee в модела.
7. Тестване на приложението
Простото приложение може да бъде внедрено - например в сървър на Tomcat - и достъпно локално:
// localhost: 8080 / spring-mvc-xml / служител
Това е изгледът, съдържащ основния формуляр - преди операцията за изпращане:

Пример за пролетен MVC формуляр - Изпратете
След подаването се показват данните:

Пример за пролетен MVC формуляр - Изглед
И това е - работещ пример за проста форма с Spring MVC, с валидиране .
Реализацията на този пролетен урок за MVC може да бъде намерена в проекта GitHub - това е проект, базиран на Maven, така че трябва да е лесно да се импортира и да се изпълнява както е.
И накрая, както казах в началото на статията, определено трябва да се задълбочите в Spring MVC.