CERCA SITEMAP FEED RSS 1280
Ultimo aggiornamento: 30 Agosto 2009

Validatori in JavaServer Faces

Uno dei compiti principali della validazione è quello di proteggere il modello dati assicurando che questo venga aggiornato con valori consistenti.
La validazione avviene nella fase di Validation Process che precede la fase di Update Model Values nella quale gli oggetti lato server vengono aggiornati con i valori dei componenti (dopo che questi sono stati convertiti e validati).

Validatori standard

L’utilizzo dei validatori in JavaServer Faces è del tutto analogo all’utilizzo dei convertitori.
I validatori standard ad esempio possono essere collegati ai componenti di una pagina innestando l’apposito tag all’interno del tag componente:
<h:inputText  value="#{miobean.valore}">
  <f:validateLength minimum="10"/>
</h:inputText>
In questo caso ad esempio si collega al componente un validatore che impone un vincolo di lunghezza sul valore dello stesso (il valore deve avere un numero di caratteri superiore a 10).
Per conoscere quali validatori standard e attributi sono disponibili in una data implementazione di JavaServer Faces è oppurtuno fare riferimento all’appropriato Tag Library Descriptor.
Così come avviene per i convertitori, anche il fallimento di un’operazione di validazione comporta la creazione di un messaggio di errore che viene accodato all’istanza FacesContext e che può essere successivamente visualizzato sulla pagina mediante i tag h:message e h:messages.

Controllo di valori richiesti

Per controllare se il valore di un campo obbligatorio è stato inserito, è possibile utilizzare l’attributo required evitando l’utilizzo di un validatore.
<h:inputText  value="#{miobean.valore}" required="true" />
Se l’utente non compila il campo di un componente che ha attributo requie posto a true, in fase di validazione viene generato un errore.

Implementare validatori personalizzati

L’implementazione di validatori personalizzati avviene in due fasi:
  • Si definisce una classe che implementa l’interfaccia javax.faces.validator.Validator
  • Si registra il validatore nel file di configurazione dell’applicazione
L’interfaccia Validator presenta un solo metodo:
void validate(FacesContext context, UIComponent component)
Analogamente a quanto avviene nel caso dei convertitori, se la validazione fallisce tale metodo deve produrre una ValidatorException a partire da un messaggio di errore rappresentato dalla classe FacesMessage e contenete un sommario e un dettaglio.
if (errore) 
{
  FacesMessage message = new FacesMessage("Errore di validazione", "Dettaglio dell'errore");
  message.setSeverity(FacesMessage.SEVERITY_ERROR);
  throw new ValidatorException(message);
}
La registrazione del validatore nel file di configurazione dell’applicazione avviene mediante l’elemento validator, indicando l’id del validatore (validator-id) e la corrispondente classe che implementa l’interfaccia Validator (validator-class).
<validator>
  <validator-id>id_validatore</validator-id>
  <validator-class>miopackage.MioValidator</validator-class>
</validator>
E’ possibile quindi utilizzare il validatore personalizzato attraverso l’elemento f:validator utilizzando l’attributo validatorID per fare riferimento all’id del validatore (definito nel file di configurazione)
<h:inputText value="#{miobean.valore}" required="true">
   <f:validator validatorID="id_validatore"/>
</h:inputText>
oppure utilizzando l’attributo binding per specificare l’attributo di un backing bean dello stesso tipo del validatore:
<h:inputText value="#{miobean.valore}" required="true">
   <f:validator binding="#{miobean.miovalidatore}"/>
</h:inputText>
In alternativa è possibile fare riferimento, attraverso l’attributo validator del tag componente, al metodo di un backing bean che ha la stessa firma del metodo validate dell’interfaccia Validator:
<h:inputText  value="#{miobean.valore}" required="true" validator="#{miobean.valida}"/>
public class MioBean 
{
  ...


  public void valida(FacesContext context, UIComponent component, Object value) 
  {
    ...
  }

}
In quest’ultimo caso, il metodo di validazione può accedere ai dati privati del bean.

Creazione di tag personalizzati

La creazione di tag personalizzati avviene nel seguente modo:
  • si definisce un file TLD (Tag Library Descriptor) contenente la descrizione del tag e lo si referenzia all’interno della pagina mediante la direttiva taglib
  • si implementa un tag handler che estende la classe ValidatorTag e che recupera gli attributi passandoli alla classe validatore
  • si implementa la classe validatore che estende l’interfaccia Validator e che produce una ValidatorException in caso di errore.
Il processo per il resto è del tutto analogo a quello per la creazione di tag converter personalizzati.