Tengo problemas para implementar dos controles SelectOneMenu, donde los datos en el segundo dependen de la selección realizada en el primero. Este ejemplo en el escaparate de PrimeFaces es casi lo mismo que lo que deseo implementar: http://www.primefaces.org/showcase-labs/ui/pprSelect.jsfProblema con Primefaces 3.0.M2 SelectOneMenu Comportamiento Ajax
excepto que tengo que obtener los datos de una base de datos.
El ejemplo anterior funciona correctamente en el mismo proyecto. Estoy usando NetBeans 7.0 con GlassFish 3.1 y PrimeFaces 3.0.M2, la última versión (20 de junio de 2011).
Se adjunta el código fuente de la página JSF y el bean administrado.
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.prime.com.tr/ui"
xmlns:f="http://java.sun.com/jsf/core">
<h:head><title>Facelet Title</title></h:head>
<h:body>
<p:log />
<center>
<h:form>
<h:outputText value="State: "/>
<p:selectOneMenu id="selectState" value="#{stateCityBean.selectedStateArray}">
<f:selectItem itemLabel="Select Any" itemValue="Empty String"/>
<p:ajax update="selectCity" listener="#{stateCityBean.updateCityMap}"/>
<f:selectItems value="#{stateCityBean.stateMap}" />
</p:selectOneMenu>
<p></p>
<h:outputText value="City: "/>
<p:selectOneMenu id="selectCity" value="#{stateCityBean.selectedCityArray}">
<f:selectItem itemLabel="Select Any" itemValue="Empty String"/>
<f:selectItems value="#{stateCityBean.cityMap}"/>
</p:selectOneMenu>
</h:form>
</center>
</h:body>
StateCityBean.java
package com.xyz.mbeans;
import com.iwizability.priceinfo.dao.*;
import com.iwizability.priceinfo.pojo.*;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.context.Flash;
import javax.faces.event.ValueChangeEvent;
@ManagedBean
@SessionScoped
public class StateCityBean {
private String selectedStateArray;
private Map<String, State> StateMap;
private Map<String, City> CityMap;
private String selectedCityArray;
public StateCityBean() {
System.out.println("Inside.............. ");
StateMap = new LinkedHashMap<String, State>();
CityMap = new LinkedHashMap<String, City>();
}
public String getSelectedStateArray() {return selectedStateArray;}
public void setSelectedStateArray(String selectedStateArray) {this.selectedStateArray = selectedStateArray;}
public Map<String, State> getStateMap() {
StateDaoImpl stateObj = new StateDaoImpl();
StateMap = stateObj.getState();
return StateMap;
}
public void setStateMap(Map<String, State> stateArray) {this.StateMap = stateArray;}
public String getSelectedCityArray() {return selectedCityArray;}
public void setSelectedCityArray(String selectedCityArray) {this.selectedCityArray = selectedCityArray;}
public Map<String, City> getCityMap() {
CityDaoImpl cityObj = new CityDaoImpl();
int stateId = 0;
if (selectedStateArray != null && !selectedStateArray.equals("")) {
stateId = StateMap.get(selectedStateArray).getId();
}
CityMap = cityObj.getCity(stateId);
return CityMap;
}
public void setCityMap(Map<String, City> CityArray) {
this.CityMap = CityArray;
}
public void updateCityMap() {
CityDaoImpl cityObj = new CityDaoImpl();
int stateId = 0;
if (selectedStateArray != null && !selectedStateArray.equals("")) {
stateId = StateMap.get(selectedStateArray).getId();
this.CityMap = cityObj.getCity(stateId);
}
}
}
En la depuración, puedo ver que se invoca el método updateCityMap pero la variable SelectedStateArray es nulo. Incluso forzar el cambio del valor de la variable CityMap encuadernada no actualiza el menú desplegable selectCity.
Como es de suponer, Soy nuevo en JSF, pero el problema se ve agravado por el hecho de que estoy usando una versión todavía en desarrollo de la biblioteca de etiquetas ...
Esto sólo puede ser parte de su problema, pero su atributo de actualización se refería directamente a su ciudad desplegable componente por id 'update =" selectCity "'. El problema con esto es que en JSF el '' antepondrá su id a los elementos secundarios de forma predeterminada. Intente especificar el siguiente atributo en su '' y vea si eso soluciona su problema, 'prependId =" false "' –
@maple_shaft: Esta es la forma en que se usa el atributo de actualización en todos los ejemplos que he visto ... Probé deshabilitar prependId pero no parece resolver el problema. – agileai
Entonces, agregué un atributo event = "valueChange" a p: ajax y ahora recibo un error: j_idt8: selectState: Validation Error: El valor no es válido Al buscar el error de validación, parece que la web está llena de esto problema. Con JSF en general y también con PrimeFaces específicamente: http://primefaces.prime.com.tr/forum/viewtopic.php?f=3&t=6947 http://www.java.net/blogs/lamine_ba http : //www.coderanch.com/t/501774/JSF/java/JSF-PrimeFace-Validation-Error-Value Traté de cambiar el alcance a viewscoped, sin embargo, eso tampoco me está haciendo bien ... – agileai