2012-08-06 88 views
3

我有下面的代码失败:JSF A4J:AJAX和f:AJAX渲染时

<label for="aluRegs">Región de residencia</label> 
<rich:select id="aluRegs" defaultLabel="Seleccionar región" value="#{IngresoAlumno.lugarAlumno.regionElegida}" required="true"> 
    <f:selectItems value="#{IngresoAlumno.lugarAlumno.regiones.entrySet()}" var="region" itemValue="#{region.key}" itemLabel="#{region.value}" /> 
    <a4j:ajax event="change" render="aluProvs" listener="#{IngresoAlumno.lugarAlumno.updateProvincias()}" /> 
    <f:validateRequired /> 
    <rich:validator /> 
</rich:select> 
<rich:message for="aluRegs" ajaxRendered="true" /> 

<label for="aluProvs">Provincia de residencia</label> 
<rich:select id="aluProvs" defaultLabel="Seleccionar provincia" value="#{IngresoAlumno.lugarAlumno.provinciaElegida}" required="true"> 
    <f:selectItems value="#{IngresoAlumno.lugarAlumno.provincias.entrySet()}" var="prov" itemValue="#{prov.key}" itemLabel="#{prov.value}" /> 
    <a4j:ajax event="change" render="aluComs" listener="#{IngresoAlumno.lugarAlumno.updateComunas()}" /> 
    <f:validateRequired /> 
    <rich:validator /> 
</rich:select> 
<rich:message for="aluProvs" ajaxRendered="true" /> 

<label for="aluComs">Comuna de residencia</label> 
<rich:select id="aluComs" defaultLabel="Seleccionar comuna" value="#{IngresoAlumno.lugarAlumno.comunaElegida}" required="true"> 
<f:selectItems value="#{IngresoAlumno.lugarAlumno.comunas.entrySet()}" var="com" itemValue="#{com.key}" itemLabel="#{com.value}" /> 
    <f:validateRequired /> 
    <rich:validator /> 
</rich:select> 
<rich:message for="aluComs" ajaxRendered="true" /> 

而且下面的Java代码

@ManagedBean(name="IngresoAlumno") 
@ViewScoped 
public class IngresoAlumnoBean { 

    private Alumno al; 
    private StaticInfoBean lugarAlumno; 
//+constructor, getters and setters 

及以下等级:

public class StaticInfoBean { 

    private Map<String, Region> regiones; 
    private String regionElegida; 

    private Map<String, Provincia> provincias; 
    private String provinciaElegida; 

    private Map<String, Comuna> comunas; 
    private String comunaElegida; 

    private String err; //Being used for debugging 

    public StaticInfoBean() { 
     try 
     { 
      err = "INICIO"; 
      ArrayList<Region> regs; 
      regiones = new LinkedHashMap<String, Region>(); 
      provincias = new LinkedHashMap<String, Provincia>(); 
      comunas = new LinkedHashMap<String, Comuna>(); 
      RegionDAO regDao = new RegionDAO(); 
      regDao.prepareConnection(); 
      ProvinciaDAO provDao = new ProvinciaDAO(); 
      provDao.setCon(regDao.getCon()); 
      ComunaDAO comDao = new ComunaDAO(); 
      comDao.setCon(regDao.getCon()); 
      regs = regDao.listaRegiones(); 
      for(Region r : regs) 
      { 
       regDao.findProvincias(r); 
       for(Provincia p : r.getProvincias()) 
       { 
        provDao.findComunas(p); 
        for(Comuna c : p.getComunas()) 
        { 
         comDao.findColegios(c); 
        } 
       } 
       regiones.put(r.getReg_Cod(), r); 
      } 
      regDao.getCon().close(); 
      err="FINAL"; 
      System.out.println(err); 
     } 
     catch(SQLException e) 
     { 
      err = e.getSQLState()+" "+e.getMessage(); 
     } 
     catch(Exception e) 
     { 
      err = e.getMessage(); 
     } 
    } 
//+getters, setters 

public void updateProvincias(){ 
    provincias.clear(); 
    for(Provincia p : regiones.get(regionElegida).getProvincias()) 
    { 
     provincias.put(p.getProv_Cod(), p); 
    } 
    System.out.println(provincias.entrySet().toString()); 
} 

public void updateComunas(){ 
    if(provinciaElegida==null || provincias==null) 
     return; 
    comunas.clear(); 
    for(Comuna c : provincias.get(provinciaElegida).getComunas()) 
    { 
     comunas.put(c.getCom_Cod(), c); 
    } 
} 

我正在使用Richfaces 4.昨天我从2.1.x升级了我的Mojarra(不记得是哪个)到最新的(2.1.11),并停止工作(b之前更新它工作得很好)。我缩小了选择标记中的渲染属性的错误(System.out.println(provincias.entrySet().toString());显示正确的值,因此我可以安全地假定侦听器正在被调用),但我不知道我在这里做什么。事先谢谢你。

编辑:作为附加信息,第一个选择正确显示值。问题是,当a4j:ajax想要重新渲染第二个选择。另外,如果我使用f:ajax,我会得到相同的结果。 ajax监听器仍然可以工作,但选择菜单不再被渲染。

我也做了以下实验:

<?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:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:a4j="http://richfaces.org/a4j" 
    xmlns:rich="http://richfaces.org/rich" 
    xmlns:c="http://java.sun.com/jsp/jstl/core" 
    xmlns:rosc="http://richfaces.org/sandbox/colorpicker"> 
    <h:head> 
     <title>Facelet Title</title> 
    </h:head> 
    <h:body> 
     <h:form> 
      <rich:select value="#{IngresoAlumno.al.per_Nombre}"> 
       <f:selectItem itemValue="1" itemLabel="1" /> 
       <f:selectItem itemValue="2" itemLabel="2" /> 
       <a4j:ajax render="out" event="change" /> 
      </rich:select> 
     </h:form> 
     <h:outputText id="out" value="#{IngresoAlumno.al.per_Nombre}" /> 
    </h:body> 
</html> 

这工作完全!我仍然不知道错误本身是什么。

回答

2

我发现它,显然它是一个RichFaces错误。

这不起作用:

<rich:select id="aluProvs" defaultLabel="Seleccionar provincia" value="#{IngresoAlumno.lugarAlumno.provinciaElegida}" required="true"> 
    <f:selectItems value="#{IngresoAlumno.lugarAlumno.provincias.entrySet()}" var="prov" itemValue="#{prov.key}" itemLabel="#{prov.value}" /> 
    <a4j:ajax event="change" render="aluComs" listener="#{IngresoAlumno.lugarAlumno.updateComunas()}" /> 
    <f:validateRequired /> 
    <rich:validator /> 
</rich:select> 

这不起作用或者:

<rich:select id="aluProvs" defaultLabel="Seleccionar provincia" value="#{IngresoAlumno.lugarAlumno.provinciaElegida}" required="true"> 
    <f:selectItems value="#{IngresoAlumno.lugarAlumno.provincias.entrySet()}" var="prov" itemValue="#{prov.key}" itemLabel="#{prov.value}" /> 
    <a4j:ajax event="change" render="aluComs" listener="#{IngresoAlumno.lugarAlumno.updateComunas()}" /> 
    <rich:validator /> 
</rich:select> 

这工作:

<rich:select id="aluProvs" defaultLabel="Seleccionar provincia" value="#{IngresoAlumno.lugarAlumno.provinciaElegida}" required="true"> 
    <f:selectItems value="#{IngresoAlumno.lugarAlumno.provincias.entrySet()}" var="prov" itemValue="#{prov.key}" itemLabel="#{prov.value}" /> 
    <a4j:ajax event="change" render="aluComs" listener="#{IngresoAlumno.lugarAlumno.updateComunas()}" /> 
    <f:validateRequired /> 
</rich:select> 

这工作藏汉:

<rich:select id="aluProvs" defaultLabel="Seleccionar provincia" value="#{IngresoAlumno.lugarAlumno.provinciaElegida}" required="true"> 
    <f:selectItems value="#{IngresoAlumno.lugarAlumno.provincias.entrySet()}" var="prov" itemValue="#{prov.key}" itemLabel="#{prov.value}" /> 
    <a4j:ajax event="change" render="aluComs" listener="#{IngresoAlumno.lugarAlumno.updateComunas()}" /> 
</rich:select> 

它是一个错误还是一个特性?我应该报告吗?但无论哪种方式,找到它都非常棘手。