Il plugin, messo a disposizione da Struts, ci consente di validare (o meno) dei campi presenti in un form; per esempio il campo "numero telefonico".
Anzichè scrivere la validazione, del seguente campo, nelle classi Action, creiamo un meccanismo di validazione generale per il nostro campo "numero telefonico".
Un primo esempio con Validator
Iniziamo subito con un piccolo esempio per capire al meglio la gestione della validazione. Creiamo un semplice form, con un campo editabile (una textArea), dove l'utente digiterà il proprio nome, che dovrebbe essere lungo minimo 5 caratteri.
Andiamo a costruirci la nostra classe ActionForm:
import org.apache.struts.action.*;
/* Acquisisce le variabili del form */
public class NomeForm extends ActionForm {
public String nome; // i relativi metodi get e set della property nome
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
Creiamo dunque la action corrispondente:
import org.apache.struts.action.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class NomeAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
NomeForm nomeForm = (NomeForm) form;
// stampa per un controllo il contenuto
// della property "nome" (il valore inserito dall'utente)
System.out.println(NomeForm.getNome());
return mapping.findForward("success");
}
}
Creaimo la nostra pagina JSP (la view 'success'):
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<html>
<body>
<html:errors />
<html:form action="inputSubmit">
<bean:message key="nomeForm.nome" />
<html:text property="nome" /><br/>
<html:submit value="ok" />
</html:form>
</body>
</html>
Ora aggiungiamo la dichiarazione del bean al file struts-config.xml
<form-bean type="fulvios.InputForm" name="inputForm" />
Per finire definiamo l'action mapping nel file struts-config.xml
<action path="/inputSubmit" type="fulvios.InputAction"
name="inputForm" scope="request"
validate="true" input="/input.jsp">
<forward name="success" path="/success.jsp" />
</action>
Utilizzo di due regole per lo stesso campo
è possibile effettuare due validazioni distinte sullo stesso campo. Per esempio, se vogliamo che il campo nome
abbia minimo 5 caratteri e massimo 10. Ecco di seguito il seguente codice da scrivere nel file validation.xml
:
<!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN" "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
<form-validation>
<formset>
<form name="nomeForm">
<field property="nome" depends="minlength,maxlength">
<!-- definisco una sequenza di validazioni.
la prima sarà lalunghezza minima e se ha buon esito
effettuo la lunghezza massima -->
<arg0 key="nomeForm.nome" />
<arg1 key="${var:minlength}" name="minlength" resource="false" />
<arg1 key="${var:maxlength}" name="maxlength" resource="false" />
<var>
<var-name>minlength</var-name>
<var-value>5</var-value>
<!-- imposto il numero di caratteri che minimo deve avere -->
</var>
<var>
<var-name>maxlength</var-name>
<var-value>10</var-value>
<!-- imposto il numero di caratteri che massimo deve avere -->
</var>
</field>
</form>
</formset>
</form-validation>
Impostazione del messaggio di errore nel file di risorse:
#andiamo a specificare il messaggio relativo al maxlength errors.maxlength={0} non può essere più di {1} caratteri.
Una validazione particolare: la regola Mask
Supponiamo di volere che il nome inizi con una lettera e contenga solo lettere, numeri e underscore. Per effettuare tale codifica si utilizza il metodo Mask.
Ecco di seguito un esempio:
<!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN" "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
<form-validation>
<formset>
<form name="nomeForm">
<field property="nome" depends="mask">
<msg name="mask" key="nomeForm.nome.mask" />
<var>
<var-name>mask</var-name>
<!-- La sintassi è quella delle espressioni regolari -->
<var-value>^[a-zA-Z]{1}[a-zA-Z0-9_]*$</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
Conclusioni
In questo articolo abbiamo introdotto un potente strumento per la validazione dei campi che il FrameWork Struts mette a disposizione. Inoltre è possibile costruire delle validazioni personalizzate.
Come funziona il Framework Validator
Aggiungiamo il plugin Validator al file di configurazione di Struts (struts-config.xml), responsabile della lettura dei file di configurazione delle regole di validazione:
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,
/WEB-INF/validation.xml" />
</plug-in>
Copiamo i due file XML, validation-rules.xml
e validator.xml
, nella cartella WEB-INF
.
Il file validator.xml permette l'impostazione del mapping tra le property dell'ActionForm alle regole e qualunque messaggio di errore per le seguenti regole.
ValidatorForm
Inoltre è neccessario che la classe NomeForm
(il nostro form) estenda la org.apache.struts.validator.ValidatorForm
. La classe ValidatorForm effettua un override del metodo validate
dell'ActionForm e comunica con il Framework di validare o meno i campi di questo form.
import org.apache.struts.validator.ValidatorForm;
/* definizione del nostro ValidatorForm */
public class NomeForm extends ValidatorForm {
public String nome;
public String getNome() { return nome; }
public void setNome(String nome) { this.nome = nome; }
}
Ora impostiamo le nostre regole di validazione per il campo "nome" nel validation.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN" "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
<form-validation>
<formset>
<form name="nomeForm">
<!-- definiamo il nome del Form -->
<field property="nome" <!-- definiamo la property dove andare a effettuare la validazione --> depends="minlength">
<!-- dichiariamo il metodo per la nostra validazione -->
<arg0 key="nomeForm.nome" />
<!-- arg ci servirà per il messaggio di errore -->
<arg1 key="${var:minlength}" <!-- definiamo arg1 come minlenght --> name="minlength" resource="false" />
<var>
<var-name>minlength</var-name>
<!-- dichiariamo che la lunghezza minima deve essere di 5 caratteri -->
<var-value>5</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
Fatto questo andiamo nel file delle risorse (ApplicationResources.properties
) e impostiamo il relativo messaggio di errore:
#il seguente file gia contiene di default tutti i messaggi di errore relativi ai metodi di validazione
#che Struts mette a disposizione. errors.minlength={0} non può essere meno di {1} caratteri.
#{0} fa riferimento ad arg0 mentre {1} ad arg1
Nota: I tag arg0
, arg1
, sono deprecati e sono stati sostituiti, nelle edizioni più recenti di Struts 1.x, dal semplice tag <arg>
. Le posizioni sono indicate dall'attributo position (es. <arg0 />
diventa <arg position="0" />
Il metodo minlength
usato nel nel validation.xml è un metodo standard messo a disposizione dal plugin di validazione ed è definito nel file validator-rules.xml
.
Oltre a questo metodo il plugin definisce i seguenti metodi di validazione:
- required: controlla se il campo non è vuoto
- validwhen: il campo è valido quando la condizione specificata si verifica
- minlength: il campo deve avere minimo un certo numero di caratteri
- maxlength: il campo deve avere massimo un certo numero di caratteri
- mask: il campo deve contenere certi tipi di caratteri
- byte: vede se il valore del campo è un byte
- short: vede se il valore del campo è uno short
- integer: vede se il valore del campo è un intero
- long: vede se il valore del campo è un long
- float: vede se il valore del campo è un float
- double: vede se il valore del campo è un double
- date: vede se il valore del campo è una data
- email: vede se il campo è un indirizzo mail
- url: vede se il campo è un url