Entdecken Sie die Form Tag Library von SpringMVC
1. Überblick
Infirst article dieser Reihe haben wir die Verwendung der Formular-Tag-Bibliothek und das Binden von Daten an einen Controller eingeführt.
In diesem Artikel werden die verschiedenen Tags behandelt, die Spring MVC bereitstellt, um unscreate and validate forms zu helfen.
2. Dasinput-Tag
Wir beginnen mit deminput-Tag. Dieses Tag rendert ein HTML-Taginputtandardmäßig mit dem gebundenen Wert undtype='text':
Ab Spring 3.1 können Sie andere HTML5-spezifische Typen wie E-Mail, Datum und andere verwenden. [.hps]#For example,if we wanted tocreate an emailfield,we can verwenden type='email': #
[.hps]#Similarly,to createa date field, [#result_box]#we can use type='date', which will render a date picker in many browsers compatible with HTML5: ##
3. Daspassword-Tag
Dieses Tag rendert ein HTMLinput-Tag mittype='password' unter Verwendung des gebundenen Werts. Diese HTML-Eingabe maskiert den in das Feld eingegebenen Wert:
4. Dastextarea-Tag
Dieses Tag rendert ein HTMLtextarea:
Wir können die Anzahl vonrows undcolumns genauso angeben wie HTMLtextarea.
5. Das Tagcheckbox undcheckboxes
Dascheckbox-Tag rendert ein HTMLinput-Tag mittype='checkbox'. Die Formular-Tag-Bibliothek von Spring MVC bietet verschiedene Ansätze für dascheckbox-Tag, die alle Anforderungen voncheckboxerfüllen sollten:
Das obige Beispiel generiert ein klassisches einzelnescheckbox mit einemboolean-Wert. Wenn wir den gebundenen Wert auftrue setzen, ist dieses Kontrollkästchen standardmäßig aktiviert.
Das folgende Beispiel generiert mehrere Kontrollkästchen. In diesem Fall sind diecheckbox-Werte auf der JSP-Seite fest codiert:
Bird watching:
Astronomy:
Snowboarding:
Hier ist der gebundene Wert vom Typarray oderjava.util.Collection:
String[] hobbies;
Der Zweck descheckboxes-Tags wird zum Rendern mehrerer Kontrollkästchen verwendet, wobei die Kontrollkästchenwerte zur Laufzeit generiert werden:
Um die Werte zu generieren, übergeben wir einArray, einList oder einMap, die die verfügbaren Optionen in der Eigenschaftitems enthalten. Wir können unsere Werte im Controller initialisieren:
List favouriteLanguageItem = new ArrayList();
favouriteLanguageItem.add("Java");
favouriteLanguageItem.add("C++");
favouriteLanguageItem.add("Perl");
In der Regel handelt es sich bei der gebundenen Eigenschaft um eine Auflistung, die mehrere vom Benutzer ausgewählte Werte enthalten kann:
List favouriteLanguage;
6. Das Tagradiobutton undradiobuttons
Dieses Tag rendert ein HTMLinput-Tag mittype='radio':
Male:
Female:
Ein typisches Verwendungsmuster umfasst mehrere Tag-Instanzen mit unterschiedlichen Werten, die an dieselbe Eigenschaft gebunden sind:
private String sex;
Genau wie dascheckboxes-Tag rendert dasradiobuttons-Tag mehrere HTMLinput-Tags mittype='radio':
In diesem Fall möchten wir die verfügbaren Optionen möglicherweise alsArray,List oderMap übergeben, die die verfügbaren Optionen in der Eigenschaftitems enthalten:
List jobItem = new ArrayList();
jobItem.add("Full time");
jobItem.add("Part time");
7. Dasselect-Tag
Dieses Tag rendert das Element eines HTMLselect:
Um die Werte zu generieren, übergeben wir einArray, einList oder einMap, die die verfügbaren Optionen in der Eigenschaftitems enthalten. [.hps]#Once again # können wir unsere Werte innerhalb des Controllers initialisieren:
Map countryItems = new LinkedHashMap();
countryItems.put("US", "United States");
countryItems.put("IT", "Italy");
countryItems.put("UK", "United Kingdom");
countryItems.put("FR", "France");
Das Select-Tag unterstützt auch die Verwendung von verschachteltenoption- undoptions-Tags.
Während dasoption-Tag ein einzelnes HTMLoption rendert, rendert dasoptions-Tag eine Liste der HTMLoption-Tags.
Dasoptions-Tag benötigt einArray, einList oder einMap, die die verfügbaren Optionen in deritems-Eigenschaft enthalten, genau wie dasselect-Tag ::
[.hps]#Whenwe have theneedto selectseveral items at once, wir könnencreate amultiple Listebox. # Um diesen Typ von zu rendern Liste, fügen Sie einfach das Attributmultiple=”true” in das Tagselect ein.
Hier ist die gebundene Eigenschaft einarray oder einjava.util.Collection:
List fruit;
8. Dashidden-Tag
Dieses Tag rendert ein HTMLinput-Tag mittype='hidden' unter Verwendung des gebundenen Werts:
9. DasErrors-Tag
Feldfehlermeldungen werden von Prüfern generiert, die dem Controller zugeordnet sind. Wir können das Errors-Tag verwenden, um diese Feldfehlermeldungen zu rendern:
Dadurch werden Fehler für das in der Eigenschaftpathangegebene Feld angezeigt. Die Fehlermeldungen werden standardmäßig innerhalb einesspan-Tags gerendert, wobei.errors an denpath-Wert alsid angehängt wird und optional eine CSS-Klasse auscssClass. s Eigenschaft, mit der die Ausgabe formatiert werden kann:
Name is required!
Um die Fehlermeldungen mit einem anderen Element anstelle des Standard-Tagsspaneinzuschließen, können Sie das bevorzugte Element im Attributelementangeben:
Dies rendert die Fehlermeldungen innerhalb einesdiv-Elements:
Name is required!
Wennn addition to having [.hps][.hps] Fehler für a specific input element anzeigen, können wir die gesamte Fehlerliste (unabhängig vom Feld) für eine bestimmte Seite anzeigen. Dies wird durch die Verwendung des Platzhalters* erreicht:
9.1. Der Validator
Um Fehler für ein bestimmtes Feld anzuzeigen, müssen wir einen Validator definieren:
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");
}
}
In diesem Fall gibt der Validator die durchrequired.name identifizierte Fehlermeldung aus dem Ressourcenpaket zurück, wenn das Feldname leer ist.
Das Ressourcenpaket wird in der Konfigurationsdatei von SpringXMLwie folgt definiert:
Oder in einem reinen Java-Konfigurationsstil:
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("messages");
return messageSource;
}
Die Fehlermeldung ist in der Dateimessages.propertiesdefiniert:
required.name = Name is required!
Um diese Validierung anzuwenden, müssen wir einen Verweis auf den Validator in unseren Controller aufnehmen und die Methodevalidate in der Controller-Methode aufrufen, die aufgerufen wird, wenn der Benutzer das Formular sendet:
@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-Validierung
Ab Frühjahr 3 können wirJSR 303 (über die Annotation@Valid) für die Bean-Validierung verwenden. Dazu benötigen wir einJSR303 validator framework im Klassenpfad. Wir werdenHibernate Validator (die Referenzimplementierung) verwenden. Das Folgende ist die Abhängigkeit, die wir in den POM aufnehmen müssen:
org.hibernate
hibernate-validator
5.1.1.Final
Damit Spring MVC die JSR 303-Validierung über die Annotation@Validunterstützt, müssen Sie in unserer Spring-Konfigurationsdatei Folgendes aktivieren:
Oder verwenden Sie die entsprechende Anmerkung@EnableWebMvc in einer Java-Konfiguration:
@EnableWebMvc
@Configuration
public class ClientWebConfigJava implements WebMvcConfigurer {
// All web configuration will go here
}
Als nächstes müssen wir die Controller-Methode[.hps]#thatwe want tovalidate # mit der Annotation@Valid versehen:
@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";
}
Jetzt können wir die Eigenschaft der Entität mit Anmerkungen versehen, um sie mit der Annotation "Hibernate Validator" zu validieren:
@NotEmpty
private String password;
Standardmäßig wird in dieser Anmerkung“may not be empty” angezeigt, wenn das Kennworteingabefeld leer bleibt.
Wir können die Standardfehlermeldung überschreiben, indem wir eine Eigenschaft in dem im Validator-Beispiel definierten Ressourcenpaket erstellen. Der Schlüssel der Nachricht folgt der RegelAnnotationName.entity.fieldname:
NotEmpty.person.password = Password is required!
10. Fazit
In diesem Tutorial haben wir die verschiedenen Tags untersucht, die Spring für die Arbeit mit Formularen bereitstellt.
Wir haben uns auch das Tag für die Anzeige von Überprüfungsfehlern und die Konfiguration angesehen, die zum Anzeigen benutzerdefinierter Fehlermeldungen erforderlich ist.
Alle obigen Beispiele sind inGitHub project angegeben. Dies ist ein Eclipse-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein.
Wenn das Projekt lokal ausgeführt wird, können Sie auf das Formularbeispiel zugreifen unter: