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

Gestione degli errori in Struts

Il Framework di Struts offre due classi principali per la gestione degli errori. Una è utile per l'incapsulamento di un singolo messaggio di errore, l'altra funziona come contenitore per più errori
Il Framework di Struts offre due classi principali per la gestione degli errori. Una è utile per l'incapsulamento di un singolo messaggio di errore, l'altra funziona come contenitore per più errori
Link copiato negli appunti

Il Framework di Struts viene fornito con due classi principali che nascono per la gestione degli errori. La prima di queste classi è la ActionError, che rappresenta un incapsulamento di un singolo messsaggio di errore, la seconda è ActionErrors, che funziona da contenitore per una collezione di istanze ActionError.

ActionError

La prima delle nostre classi di gestione degli errori, la classe org.apache.struts.action.ActionError, estende la classe org.apache.struts.action.ActionMessage e rappresenta un singolo messaggio di errore. Questo messaggio, creato in una Action o in una ActionForm, è composto di un message key, che viene usato per cercare una risorsa in un'application resource boundle.

La classe ActionError può essere istanziata utilizzando uno dei 6 differenti costruttori seguenti:

  • public ActionError(java.lang.String key)
  • public ActionError(java.lang.String key,java.lang.Object.value0)
  • public ActionError(java.lang.String key,java.lang.Object.value0,java.lang.Object.value1)
  • public ActionError(java.lang.String key,java.lang.Object.value0,java.lang.Object.value1,java.lang.Object.value2)
  • public ActionError(java.lang.String key,java.lang.Object.value0,java.lang.Object.value1,java.lang.Object.value2,java.lang.Object.value3)
  • public ActionError(java.lang.String key,java.lang.Object[] values)

Un esempio che costruisce un ActionError

ActionError error = new ActionError("errors.lookup.unknown", symbol);

L'istanza di ActionError effettua una ricerca nel resource boundle con la chiave errors.lookup.unknown e assegna al segnaposto il valore symbol del primo parametro.

Un esempio di resource boundle contenente la seguente entry

errors.lookup.unknown=Unknown Symbol : {0}

ActionErrors

La seconda delle nostre classi di gestione degli errori è la classe org.apache.struts.ActionErrors, che deriva da org.apache.struts.action.ActionMessages e rappresenta una collezione di classi ActionError.

La classe ActionErrors è composta da 2 costruttori e da un singolo metodo che permette di aggiungere un oggetto ActionError alla collezione corrente di ActionErrors.

In aggiunta al metodo add(), la classe ActionErrors eredita 8 metodi utili che sono utilizzati per interrogare e manipolare le istanze contenute da ActionErrors:

  • ActionErrors.add(): aggiunge un istanza ActionError
  • ActionMessages.clear(): rimuove tutte le istanze di ActionError memorizzate
  • ActionMessages.isEmpty(): restituisce true se la collezione è vuota
  • ActionMessages.get(): restituisce un Iterator referenziando tutti gli oggetti ActionError

Un tipico esempio di codice

ActionErrors errors = new ActionErrors(); errors.add("propertyname", new ActionError("key"));

Il metodo ActionForm.validate()

La prima area d'interesse per l'error-management è l'oggetto ActionForm. Il metodo ActionForm.validate() viene chiamato dall'ActionServlet e rappresenta un'opportunità di test dei valori che arrivano dal form chiamante prima dell'esecuzione del metodo Action.execute().

Se il metodo validate() non trova errori nei dati submitted, allora ritorna un ActionErrors vuoto o null e il processing continua normalmente, se invece incontra un errore, aggiunge un'istanza di ActionError descrivente ciascun errore incontrato alla collezione ActionErrors e la restituisce al chiamante. Quando l'ActionServlet riceve l'ActionErrors restituito, invia la collezione alla pagina JSP che é referenziata dall'attributo di input.

Listato 1. Esempio di validate

public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
    ActionErrors errors = new ActionErrors();
    if ((symbol==null) || (symbol.length() == 0)){
        errors.add("symbol", new ActionError("errors.lookup.symbol.required"));
    }
    return errors;
}

Vediamo i valori passati al metodo errors.add(): il primo parametro, symbol, lega l'errore alla proprietà di input symbol submitted dal form HTML. Questo dice al Framework Struts che il valore di input referenziato dalla proprietà symbol ha fallito la validazione. Il secondo parametro, errors.lookup.symbol.required, è la chiave al resource boundle di questa applicazione. Per rendere valida questa chiave è necessario aggiungerla al file di risorsa ApplicationResources.properties.

errors.lookup.symbol.required=<li>A Symbol is Required</li>
errors.lookup.symbol.required=<li>Un simbolo richiesto</li>

<html:errors />

Questo tag viene utilizzato per mostrare gli oggetti ActionError memorizzati nella collezione ActionErrors.

È estremamente semplice da utilizzare e bisogna solo definire header e footer. Header e footer sono testo HTML che viene messo prima e dopo la lista di ActionErrors. Per utilizzare i valori header e footer aggiungere il seguente snippet di codice al file di risorsa:

errors.header=<h3><font color="red">Elenco degli errori</font></h3><ul>
errors.footer=</ul><hr>

Ora che abbiamo aggiunto header e footer dei nostri messaggi di errore, dobbiamo semplicemente mettere il tag <html:errors /> nella pagina JSP.

Gestione degli errori nel metodo Action.execute()

Quando si desidera effettuare un reporting di un errore nel metodo Action.execute(), vengono utilizzate ancora le classi ActionError e ActionErrors. L'unica variante è come la collezione di errori viene inviata al client. Ecco un piccolo esempio:

ActionErrors errors = new ActionErrors();
errors.add("symbol", new ActionError("errors.lookup.unknown", symbol));
//controllo se è vuoto o meno
if (!errors.isEmpty())
    saveErrors(request, errors);

Il metodo saveErrors() salva la collezione ActionErrors nell'oggetto HttpServletRequest object. Il risultato di questa azione è l'invio a index.jsp che è il target failure che mostrerà l'errore con il tag <html:errors />

Ti consigliamo anche