Una delle funzionalità più importanti dell'ActionForm di Struts è la validazione dei dati. Struts mette a disposizione due modi di validazione:
- utilizzare il framework Validator
- implementare il metodo validate()
La prima soluzione è la più accreditata perché permette di spostare tutta la logica di validazione completamente al di fuori dell'ActionForm
e di configurarla in maniera dichiarativa per l'intera applicazione attraverso l'uso di file XML.
Il framework Validator
Come abbiamo detto, grazie a Validator possiamo impostare tutte le regole di validazione utilizzando due file di configurazione: validation-rules.xml
e validation.xml
.
Il validation-rules.xml è un file di Struts che contiene un insieme di regole di validazione pronte all'uso. Possiamo utilizzare le regole già pronte oppure crearne di nuove, modificarle o estenderle. Possiamo poi portare questo file in tutte le nostre applicazioni e riutilizzare le regole che abbiamo customizzato.
Le regole sono rappresentate grazie ai tag <validator>
, ognuno dei quali descrive un'unica regola di validazione.
Analizziamo ad esempio la definizione dell regola di validazione required
(che obbliga a compilare il campo del nostro form). Vediamo il codice e alcuni dei attributi:
<validator name="required"
classname="org.apache.struts.util.StrutValidator"
method="ValidateRequired"
methodParams="java.lang.Objet,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionErrors,
javax.servlet.http.HttpServletRequest"
msg="errors.required">
</validator>
Attributo | Descrizione |
---|---|
name | nome logico alla regola di validazione |
classname method methodParams |
Questi tre attributi definiscono classe e metodi che contengono la logica per le regole di validazione |
msg | È una chiave del resource bundle dove è possibile configurare il messaggio di errore nel caso non si verifichi la condizione richiesta |
Un altro attributo che è possibile trovare è depends che viene usato per specificare altre regole di validazione che dovrebbero essere chiamate prima della regola che lo specifica.
I metodi definiti nel valdation-rules.xml sono i seguenti:
Metodo | Descrizione |
---|---|
required | verifica che il campo non sia vuoto |
validwhen | il campo è valido quando la condizione specificata si verifica |
minlength e maxlength | verifica il numero dei caratteri sia superiore ad un minimo o inferiori al massimo indicato |
verifica che il campo sia un indirizzo email | |
url | il campo deve rappresentare un URL |
mask | il campo deve contenere certi tipi di caratteri |
Possiamo anche verificare che il campo sia traducibile in un certo tipo di dato:
Metodi per la verifica dei tipi di dato | |
---|---|
byte | short |
integer | long |
float | double |
date |
Applicare le regole di validazione
Il secondo file di configurazione richiesto da Validator è validation.xml. Questo file è quello grazie al quale applichiamo le regole definite nel validator-rules. Qui infatti possiamo indicare quali ActionForm e quali proprietà vogliamo verificare, all'interno della nostra applicazione.
Ecco un esempio di file validation.xml
:
<form-validation>
<formset>
<form name="esempioForm">
<field property="nome" depends="minlength">
<arg key="nomeForm.nome" />
<var>
<var-name>minlength</var-name>
<var-value>5</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
analizziamone i passaggi più significativi:
Markup | Descrizione |
---|---|
<form name="nomeForm"> |
indichiamo il nome del form |
<field property="nome" depends="minlength"> |
indichiamo il nome della proprietà del form che vogliamo validare. Con l'attributo depends definiamo il metodo per la nostra validazione |
<arg key="nomeForm.nome" /> |
questo attributo ci permette di configurare un messaggio di errore (nel resource bundle) nel caso in cui l'input del form non superi le condizioni di validazione.
Nota: I tag |
<var-name>minlength</var-name> |
Con l'attributo var imposostiamo i valori delle variabili per la validazione. In questo caso dichiariamo che la lunghezza minima deve essere di cinque caratteri |
Configurare il plugin Validator
Per usare il plugin Validator è necessario dichiararlo nello struts-config. Se abbiamo utilizziamo il template (blank) messo a disposizione nel framework, troviamo il plugin già definito:
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/org/apache/struts/validator/validator-rules.xml,
/WEB-INF/validation.xml" />
</plug-in>
Possiamo utilizzare questa definizione se non intediamo inserire nuove regole. Se invece vogliamo utilizzare un nostro file modifichiamo il markup in questo modo:
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,
/WEB-INF/validation.xml" />
</plug-in>
In entrambi i casi la dichiarazione serve ad indicare i file XML da utilizzare.
ValidatorForm e DynaValidationForm
Arrivati a questo punto dobbiamo indicare al nostro form che dovrà gestire anche la validazione, per questo ci sono diversi metodi:
- Implementare il metodo ActionForm.validate, il ché risulta abbastanza inutile se utilizziamo il Validator, come mostreremo nella prossima lezione;
- Utilizzare la classe ValidatorForm, che automatizza l'implementazione di validate e ci permette utilizzare una sintassi praticamente identica alla dichiarazione di un ActionForm, come mostrato in questo articolo;
- Utilizzare un oggetto DynaValidatorForm, che possiamo utilizzare senza dover scrivere altre classi, alla stregua di un
DynaActionForm
.
In questa lezione utilizziamo l'ultimo metodo, applicando un paio di semplici sostituzioni al codice visto in precedenza. Iniziamo modificando la definizione del form-bean:
<form-bean name="esempioForm"
type="org.apache.struts.validator.DynaValidatorForm" >
<form-property name="nome" type="java.lang.String"/>
</form-bean>
Abbiamo semplicemente sostituito il tipo di oggetto (cambia naturalmente anche l'ultima parte del namespace, da action
a validator
).
Non ci resta che modificare anche la nostra Action (EsempioAction
), in cui iseriamo DynaValidatorForm
al posto del DynaActionForm
:
...
//import org.apache.struts.action.DynaActionForm;
import org.apache.struts.validator.DynaValidatorForm;
...
public class EsempioAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
String output = null;
// controlliamo che il form non sia vuoto
if (form != null) {
// effetuiamo il cast da DynaValidatorForm
DynaValidatorForm actionForm = (DynaValidatorForm) form;
output = actionForm.get("nome").toString();
}
// giriamo risultato nella prossima request
request.setAttribute("NOME", output);
return (mapping.findForward("risultato"));
}
Per finire, inseriamo il nostro messaggio di errore nella View, sfruttando il tag <bean:message>
, che pescherà il messaggio direttamente nel reference bundle:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<html:html>
<head><title>Inserisci il nome</title><html:base/></head>
<body>
Ciao, inserisci il tuo nome.<br/><br/>
<html:form action="/esempio">
Nome: <html:text property="nome" />
<html:submit title="Invia" />
<span style="color:#f00;">
<bean:message key="errors.required" arg0="nome" />
</span>
</html:form>
</body>
</html:html>