JSF mette a disposizione molti validatori di default. Nell'esempio vedremo come creare un validatore personalizzato per poter validare i dati.
Per tale scopo occorre definire un "Validatore", una semplice classe java che implementa la classe javax.faces.validator.Validator. L'unico metodo da implementare è il metodo validate
, nel quale occorre inserire la logica di controllo.
public void validate(FacesContext context, UIComponent component, Object nome) throws ValidatorException
Per semplicità, ipotizziamo che il nostro form contenga un solo campo di testo. Il compito del nostro codice è quello di verificare che l'utente abbia inserito un numero inferiore a 10.
Il validatore deve essere dichiarato all'interno del file faces-config.xml.
<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
<managed-bean>
<managed-bean-name>htmlBean</managed-bean-name>
<managed-bean-class>
it.html.jsf.bean.HtmlBean
</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/index.jsp</from-view-id>
<navigation-case>
<from-outcome>risultato</from-outcome>
<to-view-id>/risultato.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<validator>
<validator-id>htmlValidator</validator-id>
<validator-class>
it.html.jsf.validator.HtmlValidator
</validator-class>
</validator>
</faces-config>
Il validator-id è il nome con il quale richiameremo il validatore all'interno della JSP.
Il nostro validatore, corrispondente alla classe it.html.jsf.validator.HtmlValidator, sarà la seguente:
public class HtmlValidator implements Validator{
public void validate(FacesContext context, UIComponent component, Object numero) throws ValidatorException {
Integer n = null;
//verifico se è un numero
try {
n = Integer.parseInt((String)numero);
} catch (NumberFormatException e) {
FacesMessage message = new FacesMessage();
message.setSummary("Devi inserire un numero");
throw new ValidatorException(message);
}
//se è un numero verifico che sia superiore a 10
if (n >= 10)
{
FacesMessage message = new FacesMessage();
message.setSummary("Il numero deve essere minore di 10");
throw new ValidatorException(message);
}
}
}
Per generare un errore, affinché questo possa essere visualizzato successivamente nella pagina JSP, occorre ottenere un'istanza di FacesMessage, richiamare il suo metodo setSummary
, passando come parametro il messaggio di errore, e infine sollevare un'eccezione ValidatorException
. Il framework provvederà automaticamente a reindirizzare l'utente verso la JSP contenente il form di inserimento.
La JSP contenente la maschera di inserimento sarà la seguente:
<f:view>
<h:form>
Inserisci un numero:
<h:inputText id="numero" value="#{htmlBean.numero}" required="true">
<f:validator validatorId="htmlValidator" />
</h:inputText>
<h:commandButton value="Controlla" action="risultato" />
<br />
<h:message for="numero" />
</h:form>
</f:view>
All'interno del campo di testo, occorre richiamare il validator mediante il suo id. L'attributo required del tag inputText
, indica che quel campo deve essere settato.
Mediante il tag message, invece, stampiamo gli eventuali messaggi di errore riscontrati.