Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Validazione con il framework Validator

Convalidare i dati inseriti nei form, sfruttando gli automatismi di Struts
Convalidare i dati inseriti nei form, sfruttando gli automatismi di Struts
Link copiato negli appunti

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
email 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 arg0, arg1, sono deprecati e sono stati sostituiti, nelle edizioni più recenti di Struts, dal semplice tag <arg>. Le posizioni sono indicate dall'attributo position (es. <arg0 /> diventa <arg position="0" />

<var-name>minlength</var-name>
<var-value>5</var-value>
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>

Ti consigliamo anche