2011-01-26 24 views
7

HI,Valuechangelistener duda en JSF

Por favor ver el siguiente código:

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

Copia de frijol

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")); 
    }  
} 

Por favor, hágamelo saber si la implementación es correcta. Está funcionando bien. Mis preguntas son:

  • ¿Cuál es la ventaja de la adición de la f: valueChangeListener etiqueta dentro de la h: selectOneMenu etiqueta. He usado el atributo normal valueChangeListener = "# {countryBean.changeCountry}".
  • ¿Es necesario utilizar onchange = "submit() este código para cambiar los valores.
  • ¿Cuál es la diferencia entre escribir los oyentes personalizados mediante la implementación de la interfaz ActionListener y sólo usar el atributo en las etiquetas UIComponent (acción = "methodName"). Por favor explique mí.
+0

Mi opinión es que la implementación del oyente por separado es útil cuando enviamos el formulario, existen múltiples componentes que los valores habrían cambiado. Podemos hacer eso en el método processValueChange. Si estamos adjuntando con el atributo, eso será útil para el componente individual. Por favor, ayúdame si estoy equivocado. – Krishna

Respuesta

20

el ValueChangeListener solamente se llamará cuando se envía el formulario, no cuando se cambia el valor de la entrada. Por lo tanto, si desea ejecutar este oyente cuando el el valor se modifica, tiene dos soluciones:

  1. Envíe su formulario cuando se active el evento onchange (esto es lo que hizo en su código);
  2. Utilice una llamada Ajax en su lugar, utilizando algunos componentes dedicados (ya integrados en JSF2, con <f:ajax>, o bibliotecas de terceros como Richfaces, Primefaces ...).

Aquí se muestra un ejemplo con RichFaces:

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

En cuanto al código de su oyente, parece correcta, pero ¿por qué pregunta es ¿por qué necesita un ValueChangeListener aquí? De hecho, este oyente es útil cuando desea rastrear una modificación de un valor. Es por eso que ValueChangeEvent proporciona los métodos getOldValue() y getNewValue().

En su código, que no se preocupan por el valor antiguo, así que básicamente, se puede "simplemente" hacer una acción en lugar de un valueChangeListener (ex con RichFaces.):

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

Por último, con respecto a la La diferencia entre el atributo valueChangeListener y <f:valueChangeListener> es que el primero vincula un método Java (#{myBean.myMethod}), mientras que el segundo vincula una clase Java (type="com.foo.MyListenerClass") que implementa la interfaz ValueChangeListener. Entonces, el segundo podría ser más genérico que el primero ...

+0

Excelente respuesta, gracias. –

6

Romaintaz ya se ha señalado más, sólo quería llegar directamente en sus preguntas concretas:

¿Cuál es la ventaja de añadir el f: Etiqueta valueChangeListener dentro de la h: Etiqueta selectOneMenu. He usado el atributo normal valueChangeListener = "# {countryBean.changeCountry}".

Como dijo Romaintaz, los puntos de atributo a un método y los f: puntos de la etiqueta a una clase. Otra ventaja es que puedes tener varios de ellos, siempre que sea necesario.

¿Es necesario utilizar onchange = "submit() el código para cambiar los valores.

de que JavaScript no cambia los valores. Eso Javascript envía el formulario completo sin la necesidad presionar el botón Enviar usted mismo, siempre que el valor haya sido cambiado por el usuario final. No, eso no es necesario. También puede simplemente eliminarlo y esperar que el usuario final presione el botón Enviar él mismo. Once again, que JavaScript no es parte de JSF

Cuál es la diferencia entre escribir los oyentes personalizados mediante la implementación de la interfaz ActionListener y simplemente usar el atributo en las etiquetas UIComponent (action = "methodName").

Esta pregunta ya se hizo antes: difference between action and actionlistener.

0

La solución de romaintaz de invocar una acción en lugar de valueChangeListener también es excelente porque en el caso de un evento de "cambio" se llama a la acción después de actualizar el modelo (permitiendo una actualización de DB por ejemplo) mientras se llama el valueChangeListener antes ....