Проучване на библиотеката с маркери за формуляри на SpringMVC

1. Общ преглед

В първата статия от тази поредица въведохме използването на библиотеката с маркери на формуляри и как да свързваме данни с контролер.

В тази статия ще разгледаме различните маркери, които Spring MVC предоставя, за да ни помогне да създаваме и проверяваме формуляри .

2. Входният маркер

Ще започнем с входния маркер. Този маркер изобразява HTML входен маркер, като използва обвързаната стойност и type = 'text' по подразбиране:

Започвайки с Spring 3.1, можете да използвате други специфични за HTML5 типове, като имейл, дата и други. Например, ако искахме да създадем имейл поле, можем да използваме type = 'email':

По същия начин, за да създадем поле за дата, можем да използваме type = 'date' , което ще направи избор на дата в много браузъри, съвместими с HTML5:

3. Таг за парола

Този маркер изобразява HTML входен маркер с type = 'password', използвайки свързаната стойност. Този HTML вход маскира стойността, въведена в полето:

4. Етикетът за текстово поле

Този маркер изобразява HTML текстово поле :

Можем да посочим броя на редовете и колоните по същия начин, по който бихме направили HTML текстова област .

5. отметка и отметки Tag

В квадратчето маркер прави един HTML вход етикет с тип = "отметка" . Библиотеката с маркери на Spring MVC предоставя различни подходи към маркера на квадратчето , който трябва да отговаря на всички наши нужди в квадратчето :

Горният пример генерира класическа единична отметка с булева стойност. Ако зададем за вярна стойност true , това квадратче ще бъде отметнато по подразбиране.

Следващият пример генерира множество отметки . В този случай стойностите на квадратчетата са кодирани твърдо в JSP страницата:

Bird watching:  Astronomy:  Snowboarding: 

Тук свързаната стойност е от тип array или java.util.Collection :

String[] hobbies;

Целта на маркера за отметки се използва за изобразяване на множество отметки, където стойностите на квадратчетата се генерират по време на изпълнение:

За да генерираме стойностите, които предаваме в масив , списък или карта, съдържащи наличните опции в свойството items . Можем да инициализираме нашите стойности вътре в контролера:

List favouriteLanguageItem = new ArrayList(); favouriteLanguageItem.add("Java"); favouriteLanguageItem.add("C++"); favouriteLanguageItem.add("Perl");

Обикновено обвързаното свойство е колекция, така че може да съдържа множество стойности, избрани от потребителя:

List favouriteLanguage;

6. Радиобутон и радиобутони Етикет

Този маркер изобразява HTML входен маркер с type = 'radio':

Male:  Female: 

Типичният модел на използване ще включва множество екземпляри на маркери с различни стойности, свързани към едно и също свойство:

private String sex;

Точно като отметките в квадратчетата, тагът за радиобутони изобразява множество HTML входни маркери с type = 'radio' :

В този случай може да поискаме да предадем наличните опции като масив , списък или карта, съдържащи наличните опции в свойството items :

List jobItem = new ArrayList(); jobItem.add("Full time"); jobItem.add("Part time");

7. изберете маркера

Този маркер показва HTML елемент за избор :

За да генерираме стойностите, които предаваме в масив , списък или карта, съдържащи наличните опции в свойството items . За пореден път можем да инициализираме нашите стойности вътре в контролера:

Map countryItems = new LinkedHashMap(); countryItems.put("US", "United States"); countryItems.put("IT", "Italy"); countryItems.put("UK", "United Kingdom"); countryItems.put("FR", "France");

Маркерът за избор също поддържа използването на вложени опции и етикети с опции .

Докато опция маркер прави единична HTML вариант , на опции маркер прави списък с HTML вариант тагове.

Най опции маркер отнема Array , а Списък или карта , съдържаща наличните опции в позиции собственост, точно както изберете маркер:

Когато имаме нужда да изберем няколко елемента наведнъж, можем да създадем множество списъчни полета. За да изобразите този тип списък, просто добавете атрибута multiple = "true" в избрания маркер.

Тук обвързаното свойство е масив или java.util.Collection :

List fruit;

8. Скритият маркер

Този маркер визуализира HTML входен маркер с type = 'hidden', като използва обвързаната стойност:

9. Етикет за грешки

Съобщенията за грешки в полето се генерират от валидатори, свързани с контролера. Можем да използваме маркера за грешки, за да изобразим тези съобщения за грешка в полето:

Това ще покаже грешки за полето, посочено в свойството на пътя . Съобщенията за грешки се визуализират в рамките на тагове за обхват по подразбиране, като .errors се добавят към стойността на пътя като id и по желание CSS клас от свойството cssClass , който може да се използва за стилизиране на изхода:

Name is required!

За да заградим съобщенията за грешка с различен елемент вместо маркера за обхват по подразбиране , можем да посочим предпочитания елемент вътре в атрибута на елемента :

Това показва съобщенията за грешка в div елемент:

 Name is required! 

В допълнение към възможността да показваме грешки за конкретен входен елемент, можем да покажем целия списък с грешки (независимо от полето) за дадена страница. Това се постига чрез използването на заместващ знак * :

9.1. Валидаторът

За да покажем грешки за дадено поле, трябва да дефинираме валидатор:

public class PersonValidator implements Validator { @Override public boolean supports(Class clazz) { return Person.class.isAssignableFrom(clazz); } @Override public void validate(Object obj, Errors errors) { ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "required.name"); } }

В този случай, ако името на полето е празно, валидаторът връща съобщението за грешка, идентифицирано от required.name от пакета с ресурси.

Пакетът ресурси е дефиниран в конфигурационния файл Spring XML , както следва:

Или в чист Java конфигурационен стил:

@Bean public MessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasenames("messages"); return messageSource; }

Съобщението за грешка е дефинирано във файла messages.properties :

required.name = Name is required!

To apply this validation, we need to include a reference to the validator in our controller and call the method validate in the controller method which is called when user submits the form:

@RequestMapping(value = "/addPerson", method = RequestMethod.POST) public String submit( @ModelAttribute("person") Person person, BindingResult result, ModelMap modelMap) { validator.validate(person, result); if (result.hasErrors()) { return "personForm"; } modelMap.addAttribute("person", person); return "personView"; }

9.2. JSR 303 Bean Validation

Starting from Spring 3, we can use JSR 303 (via the @Valid annotation) for bean validation. To do this we need a JSR303 validator framework on the classpath. We will use the Hibernate Validator (the reference implementation). Following is the dependency that we need to include in the POM:

 org.hibernate hibernate-validator 5.1.1.Final 

To make Spring MVC support JSR 303 validation via the @Valid annotation, we need to enable the following in our Spring configuration file:

Or use the corresponding annotation @EnableWebMvc in a Java configuration:

@EnableWebMvc @Configuration public class ClientWebConfigJava implements WebMvcConfigurer { // All web configuration will go here }

Next, we need to annotate the controller method that we want to validate with the @Valid annotation:

@RequestMapping(value = "/addPerson", method = RequestMethod.POST) public String submit( @Valid @ModelAttribute("person") Person person, BindingResult result, ModelMap modelMap) { if(result.hasErrors()) { return "personForm"; } modelMap.addAttribute("person", person); return "personView"; }

Now we can annotate the entity's property to validate it with Hibernate validator annotation:

@NotEmpty private String password;

By default, this annotation will display “may not be empty” if we leave the password input field empty.

We can override the default error message by creating a property in the resource bundle defined in the validator example. The key of the message follows the rule AnnotationName.entity.fieldname:

NotEmpty.person.password = Password is required!

10. Conclusion

In this tutorial we explored the various tags that Spring provides for working with forms.

Също така разгледахме маркера за показване на грешка при проверка и конфигурацията, необходима за показване на съобщения за персонализирани грешки.

Всички примери по-горе могат да бъдат намерени в проект на GitHub. Това е проект, базиран на Eclipse, така че трябва да е лесно да се импортира и да се изпълнява както е.

Когато проектът се изпълнява локално, примерният формуляр може да бъде достъпен на:

// localhost: 8080 / spring-mvc-xml / човек