Il processo di validazione delle form utente che mette a disposizione JSF 2.0 consente di creare e registrare validatori custom specifici per le esigenze di progetto. Per farlo sono necessarie le seguenti attività:
- generazione della classe di validazione che dovrà implementare l’interfaccia
javax.faces.validator.Validator
la quale prevede un solo metodovalidate()
; - registrazione della classe come validatore JSF attraverso la decorazione della stessa con l’annotazione
@FacesValidator
mer mezzo della quale gli si assegna un id univoco; - associazione del validatore al campo specifico della form attraverso il tag
<f:validator>
.
Interfaccia
Iniziamo innanzitutto definendo l’interfaccia che utilizzeremo nel nostro esempio. Si tratta di una semplicissima form di registrazione che prevede esclusivamente i campi Nome
ed Email
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <h:head> <title>JSF 2.0 Validator</title> </h:head> <h:body bgcolor="white"> <h2>Registration Form</h2> <h:form> <h:panelGrid columns="3"> <h:outputLabel value="Name"/> <h:inputText id="nameid" value="#{userController.name}" required="true"/> <h:message for="nameid" style="color:red"/> <h:outputLabel value="Email"/> <h:inputText id="emailid" value="#{userController.email}" required="true"> <f:validator for="emailid" validatorId="it.javaboss.emailValidator"/> </h:inputText> <h:message for="emailid" style="color:red"/> <h:commandButton action="#{userController.register}" value="Register" /> </h:panelGrid> </h:form> </h:body> </html> |
Si noti che la form prevede tre colonne, la terza delle quali è destinata a contenere gli eventuali messaggi di errore destinati al componente di input. Questo lavoro è svolto dal tag <h:message>
al quale è stato dato una colorazione rossa per evidenziare il messaggio.
Come detto nell’introduzione è stato inoltre inserito un custom validator per il campo email con id it.javaboss.emailValidator
.
Validatore
Come anticipato il validatore è una classe java che implementa il metodo validate()
dell’interfaccia javax.faces.validator.Validator
. Nell’esempio mostrato è utilizzata una regular expression per la validazione dell’email.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
@FacesValidator("it.javaboss.emailValidator") public class EmailValidator implements Validator { private static final String EMAIL_PATTERN = "^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,4})$"; private static Pattern pattern; static { pattern = Pattern.compile(EMAIL_PATTERN); } private ResourceBundle bundle; public ResourceBundle getBundle() { if (bundle == null) { FacesContext context = FacesContext.getCurrentInstance(); bundle = context.getApplication().getResourceBundle(context, "msg"); } return bundle; } public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { String emails = value.toString().trim(); if ( emails != null && !emails.isEmpty() ) { for ( String email : emails.split( ";" ) ) { Matcher matcher = pattern.matcher(email.trim()); if( !matcher.matches() ) { FacesMessage msg = new FacesMessage( getBundle().getString( "validator.email.error" ) .replace("{0}", email.trim() ) ); msg.setSeverity( FacesMessage.SEVERITY_ERROR ); throw new ValidatorException( msg ); } } } } } |
Sorvoliamo la descrizione della regular expression che trovate su internet, si noti che è stato utilizzato un blocco di codice statico per la sua compilazione. Questo perché l’oggetto è creato nuovo ad ogni richiesta di validazione. Inoltre il validatore prevede la possibilità di inserire nel campo una lista di email separate da punto e virgola. Il messaggio di errore è recuperato dal resource bundle con chiave validator.email.error
e prevede un parametro, indicato con {0}, che identifica lo specifico indirizzo email che non ha passato il processo di validazione:
1 |
validator.email.error=Formato email {0} errato |
Codice Sorgente
Il codice sorgente completo è scaricabile qui jsf-validator.