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>
Se vuoi aggiornamenti su Development inserisci la tua email nel box qui sotto: