2010-03-19 22 views
14

Quando si affronta il problema della convalida di una proprietà in un'applicazione JSF2 ci sono due approcci principali.Convalida del bean Convalida VS JSF

Definire la convalida sul ManagedBean utilizzando un'annotazione

@ManagedBean 
public class MyBean { 
    @Size(max=8) 
    private String s; 

    // Getters setters and other stuff. 
} 

o dichiarandolo sulla pagina JSF:

<h:inputText value="#{myBean.s}"> 
    <f:validateLength maximum="8"/> 
</h:inputText> 

succede che non posso decidere per nessuno di loro. Il primo è bello perché rimuove un po 'di codice dalle pagine jsf (che è sempre buono dato che quelle pagine non sono amichevoli per definizione) ma rende più difficile vedere "a colpo d'occhio" cosa succede nella pagina quando si controlla il file jsf .

Quale pensi sia più chiaro? Più bello? Meglio?

risposta

17

Vorrei pompare per la convalida sul ManagedBean, questo rimuove la logica dal JSF il VIEW in vista del modello Controller. e dovrebbe mantenere la JSF debitamente responsabile della visualizzazione del Modello. Avere anche questo sul bean gestito assicura che, dove questo è stato aggiornato, venga applicata la convalida. Questo è più ASCIUTTO (non ripetersi).

+1

Sempre nella maggior parte dei casi è necessario ripetere in gui, per esempio limitare la lunghezza massima o le dimensioni o altri valori visivi agli stessi valori utilizzati per la convalida. – djmj

+0

@David Waters, sono entrambi la convalida del bean e la convalida di jsf avviene nello stesso ciclo di vita o in cicli di vita diversi, cioè la convalida di jsf avviene prima della convalida del bean? e la convalida di jsf avviene sul lato client? –

+0

@MahmoudSaleh - Ciao Mahmoud, Posso suggerire di porre la tua domanda come una domanda, non come un commento, otterrai una risposta molto migliore e risposte da una gamma molto più ampia di persone. –

3

Richfaces consente di utilizzarli insieme. Vedere <rich:graphValidator> (e beanValidator).

Queste etichette dicono: "applica la convalida JSF basata sulle regole javax.validation (o Hibernate validator)".

+0

sono la convalida del bean e la convalida di jsf si verifica nello stesso ciclo di vita o in cicli di vita diversi, cioè la convalida di jsf avviene prima della convalida del bean? e la convalida di jsf avviene sul lato client? –

4

C'è un altro vantaggio dell'approccio managedBean. Se le informazioni visualizzate dal JSF sono disponibili anche tramite un servizio Web (WS), il codice di convalida effettivo può essere scomposto in una classe di convalida e utilizzato sia per il JSF che per il WS garantendo che tutte le informazioni nel sistema siano valide.

0

Potrei preferire la convalida JSF perché, non sono in grado di fornire i messaggi di errore del pacchetto di risorse come parte delle convalide dei bean. Ad esempio non è possibile farlo

@NotNull(message = ResourceBundleHelper.getString("error_message")) 

Perché "le costanti di compilazione possono essere solo primitive e stringhe". Ci sono delle soluzioni per definire i messaggi costanti ma che sembreranno brutti.

1

@ user1730904, è possibile definire i messaggi in un file bundle di risorse come spiegato nel documento di specifiche di convalida del bean. I passaggi necessari sono semplici:

  1. creare un file denominato ValidationMessages_xx_XX.properties in qualche cartella percorso di classe (ad esempio src/main/resources/). Dove xx_XX è es_ES, en_US, ecc Se il tenore potrebbe essere: field.message=The number of digits must be less or equal than {max}.
  2. quindi utilizzare il valore all'interno dell'attributo di fagioli della nota: @Size(max = 20, message="{field.message}")
Problemi correlati