我已获得以下代码:
<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.昨天我将我的Mojarra从2.1.x(不记得哪个)升级到最新版本(2.1.11)并停止工作(在更新之前工作得很好) )。我将错误缩小到select标签中的render属性(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>
这完美无缺!我仍然不知道错误本身是什么。
答案 0 :(得分: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>
是错误还是功能?我应该报告吗?但无论哪种方式,找到它都非常棘手。