2011-01-26 15 views
7

HI,Valuechangelistener dubbio nella JSF

prega di consultare il seguente codice:

   <h:selectOneMenu id="countries" value="#{countryBean.selectedCountry}" onchange="submit() 
            valueChangeListener="#{countryBean.changeCountry}"> 
        <f:selectItems value="#{countryBean.countries }" /> 
       </h:selectOneMenu> 

Backup Bean

public void changeCountry(ValueChangeEvent event){  
    String newValue = (String)event.getNewValue(); 
    String oldValue = (String)event.getOldValue(); 

    System.out.println("New Value : " + newValue); 
    System.out.println("Old Value : " + oldValue); 

    if ("1".equals(newValue)){ 
     this.countries = new ArrayList<SelectItem>(); 
     this.cities.add(new SelectItem("1","Delhi")); 
     this.cities.add(new SelectItem("2","Mumbai")); 
    } 
    if ("2".equals(newValue)){ 
     this.cities = new ArrayList<SelectItem>(); 
     this.cities.add(new SelectItem("1","Mossco")); 
    }  
} 

Per favore fatemi sapere se l'implementazione è corretta. Funziona bene. Le mie domande sono:

  • Qual è il vantaggio di aggiungere il f: valueChangeListener tag all'interno del h: selectOneMenu tag. Ho usato il valore dell'attributo normaleChangeListener = "# {countryBean.changeCountry}".
  • E 'necessario utilizzare onchange = "submit() questo codice per modificare i valori.
  • Qual è la differenza tra la scrittura dei listener personalizzati implementando l'interfaccia ActionListener e usando solo l'attributo nei tag UIComponent (azione = "methodName"). prega di spiegare a me.
+0

La mia opinione è che l'implementazione listener separata è utile quando stiamo inviando il modulo, ci sono più valori di componenti che sarebbero cambiati. Possiamo farlo nel metodo processValueChange. Se stiamo allegando l'attributo, ciò sarà utile per il singolo componente. Per favore aiutami se sbaglio. – Krishna

risposta

20

saranno chiamati solo il ValueChangeListener quando il modulo viene inviato, non quando il valore dell'ingresso è cambiata. Così, se si desidera eseguire questo listener quando il il valore è modificato, hai due soluzioni:

  1. Invia il modulo quando viene attivato l'evento onchange (questo è ciò che hai fatto nel tuo codice);
  2. Utilizzare invece una chiamata Ajax, utilizzando alcuni componenti dedicati (già integrati in JSF2, con <f:ajax> o librerie di terze parti come Richfaces, Primefaces ...).

Ecco un esempio con RichFaces:

<h:selectOneMenu id="countries" value="#{countryBean.selectedCountry}" valueChangeListener="#{countryBean.changeCountry}"> 
    <a4j:support event="onchange" .../> 
    <f:selectItems value="#{countryBean.countries }" /> 
</h:selectOneMenu> 

Per quanto riguarda il codice del vostro ascoltatore, sembra corretto, ma perché la domanda è perché avete bisogno di un ValueChangeListener qui? In effetti, questo listener è utile quando si desidera tracciare una modifica di un valore. Ecco perché lo ValueChangeEvent fornisce entrambi i metodi getOldValue() e getNewValue().

Nel codice, non si preoccupano il vecchio valore, in modo sostanzialmente, si potrebbe "semplicemente" fare un'azione invece di un valueChangeListener (es con RichFaces.):

<h:selectOneMenu id="countries" value="#{countryBean.selectedCountry}"> 
    <a4j:support event="onchange" actionListener="#{countryBean.changeCountry}"/> 
    <f:selectItems value="#{countryBean.countries }" /> 
</h:selectOneMenu> 

Infine, per quanto riguarda la la differenza tra l'attributo valueChangeListener e <f:valueChangeListener> è che il primo associa un metodo Java (#{myBean.myMethod}), mentre il secondo associa una classe Java (type="com.foo.MyListenerClass") che implementa l'interfaccia ValueChangeListener. Quindi il secondo potrebbe essere più generico del primo ...

+0

Ottima risposta, grazie. –

6

Romaintaz già sottolineato più, volevo solo arrivare direttamente sulle vostre domande concrete:

Qual è il vantaggio di aggiungere la f: tag valueChangeListener all'interno h: tag selectOneMenu. Ho usato il valore dell'attributo normaleChangeListener = "# {countryBean.changeCountry}".

Come detto Romaintaz, i punti attributo un metodo ed i punti f: tag di una classe. Un altro vantaggio è che è possibile avere più di essi, ogni volta che è necessario.

E 'necessario utilizzare onchange = "submit() questo codice per modificare i valori.

Ciò Javascript non cambia i valori. Questo Javascript sottopone l'intera forma, senza la necessità a premere il pulsante di invio da soli, ogni volta che il valore è stato modificato dall'utente finale. No, non è necessario.Puoi anche solo rimuoverlo e aspettarti che l'utente preme lui stesso il pulsante di invio. Once again, che JavaScript non fa parte di JSF

Qual è la differenza tra la scrittura dei listener personalizzati implementando l'interfaccia ActionListener e l'utilizzo dell'attributo nei tag UIComponent (action = "methodName").

Questa domanda è già stata posta prima: difference between action and actionlistener.

0

La soluzione da romaintaz di chiamare un'azione invece di valueChangeListener è ottima anche perché nel caso dell'evento "change" l'azione viene chiamata dopo che il modello è stato aggiornato (consentendo per esempio un aggiornamento del DB) mentre il valore valueChangeListener è chiamato prima ....