Java Server Faces O Reilly Cap 7

Chapter 7. Validating Input

- Ci sono due tipi di validazione dell'input da considerare in ogni applicazione, sintattica e semantica. Un form che rappresenta la data deve essere scritto in un certo formato sintatticamente corretto, può inoltre seguire altre regole per essere accettato (semanticamente corretto).
- Un componente esegue una validazione sintatti durante la conversione da stringa nel parametro della richiesta a tipo di dato della proprietà. Per la validazione sementica si può attaccare validatori al componente. JSF ha dei validatori standard per molte alternative.

7.1 Dealing with Syntax Errors in User Input

- Analizziamo cosa avviene al momento della validazione
- per prima cosa JSF fa la conversione dal formato scelto (noi avevamo usato .faces) al .jsp trovando le informazioni adatte
- se è stata passata prima una risposta al client ripristina lo stato si usa restoreState() in modo da riformare il component tree
- per ogni componente viene chiesto il suo valore nella request, per far questo viene chiamato il metodo decode() di ogni componente
- per componenti html il valore viene rimandato come String con il nome corrispondente al valore del componente ids. Il metodo decode() salva il valore di questo parametro grezzo come è stato mandato dal componente.
- quando tutti i componenti hanno avuto una chance di leggere i loro valori dalla request , JSF chiede di validare il nuovo valore chiamando il metodo validate(). I convertitori standard di JSF sono tutti sottoclassi di javax.faces.convert.Converter e devono implemntare due metodi astratti getAsObject(..) e getAsString(..)
- nella pagina ci sono le spiegazioni dei convertitori più usati, difficilmente c'è la necessità di doversene creare uno, per fer questo in ogni caso c'è l'appendice E
- nell'esempio 7.1 c'è come creare e configurare un convertitore. Tutto è collegabile con la classe
- Paragrafo non capito: Pretty much everything in JSF is pluggable, with the concrete classes to use being declared in the faces-config.xml file (default classes are used if no replacements are defined). An abstract class named javax.faces.application.Application defines methods for getting hold of registered converters, among other things. The getApplication() method on FacesContext provides access to an instance of a concrete Application subclass. With access to the Application, the code in Example 7-1 asks it to create an instance of the converter class registered under the symbolic name javax.faces.DateTime, and then sets the converter's dateStyle property and tells the component to use the converter.
- Quando un componente è equipaggiato con un convertitore il metodo validate() chiama getAsObjetct() per convertire la string nella request, se il componente non ha un convertitore il metodo usa il data type della proprietà, usando un validatore standard.
- approfondire dopo: [1] The validate() method actually delegates the conversion to the renderer, if any, which in turn calls the converter. This allows a fancy renderer that represents a single value as more than one user interface element (e.g., a date represented by three select lists for year, month, and day) to be in control of converting the submitted value (or values, in this example).
- se le cose vanno male viene aggiunto un errore alla lista mantenuta da FacesContext questo viene visualizzato sulla pagina da <h:messages>

7.2 Using the Standard Validators

Vediamo l'esempio 7.2
- primo tag
Title:
<h:inputText id="title" size="30" required="true"
value="#{reportHandler.currentReport.title}" />
<h:message for="title" />
Il solo controllo è che il valore deve essere immesso quindi required=true, questo causa l'azione dell'handler che chiama la setRequired(true) del componente corrispondente UIComponent quando la vista viene creata.
- quando viene mandato il form viene eseguita la validate() che converte il valore al tipo di dato nativo, se la proprietà required è a true il metodo verifica che ci sia un valore . Se non c'è il metodo marca il componente come invalido e aggiunge un errore al FacesContex message list.
- h:message ha l'id quindi visualizza l'errore di quel solo messaggio è un h:message singolo, possono esserci h:message multipli.
Date:
<h:inputText id="date" size="8" required="true" value="#{entryHandler.currentEntry.date}">
<f:convertDateTime dateStyle="short" />
</h:inputText>
<h:message for="date" />
- si può configurare un componente con più di un validatore, vengono chiamati nell'ordine in cui sono aggiunti al componente

7.2.1 Value Bindings for the Report Entry Fields

- si può usare per popolare un campo di scelta multiplia un tag che si riferisce a una lista

… continuare dal li

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License