【发布时间】:2011-09-20 02:21:30
【问题描述】:
我在实现两个 SelectOneMenu 控件时遇到问题,其中第二个控件中的数据取决于第一个控件中的选择。 primeFaces 展示中的这个示例与我要实现的几乎相同:http://www.primefaces.org/showcase-labs/ui/pprSelect.jsf
除了我必须从数据库中获取数据。
上面的例子在同一个项目中工作正常。我正在使用带有 GlassFish 3.1 和 PrimeFaces 3.0.M2 的 NetBeans 7.0,这是最新的下降(2011 年 6 月 20 日)。
附上JSF页面和托管bean的源码。
<?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);
}
}
}
在调试时,我可以看到 updateCityMap 方法被调用,但 SelectedStateArray 变量为空。即使强制更改绑定 CityMap 变量的值也不会更新 selectCity 下拉菜单。
正如您所猜到的,我是 JSF 的新手,但由于我使用的是仍在开发中的标记库版本,问题变得更加复杂......
【问题讨论】:
-
这可能只是您的问题的一部分,但您的更新属性通过 id
update="selectCity"直接引用您的城市下拉组件。这样做的问题是,在 JSF 中<h:form>默认情况下会将其 id 添加到子元素中。尝试为您的<h:form>指定以下属性,看看是否能解决您的问题,prependId="false" -
@maple_shaft:这是我见过的所有示例中使用 update 属性的方式...我尝试禁用 prependId 但它似乎无法解决问题。
-
所以,我向 p:ajax 添加了一个 event="valueChange" 属性,现在出现错误:j_idt8:selectState: Validation Error: Value is not valid 在查找验证错误时,似乎网络充满了这个问题。使用 JSF 以及特别使用 PrimeFaces:primefaces.prime.com.tr/forum/viewtopic.php?f=3&t=6947 java.net/blogs/lamine_ba coderanch.com/t/501774/JSF/java/… 我尝试将范围更改为 viewscoped,但是,这对我来说也不起作用......
-
哇,这是一个奇怪的问题!我在其中一个线程中看到它尝试覆盖 equals 和 hashCode。你试过这个吗?对于某些人来说,这似乎解决了这个问题。如果这对您不起作用,我愿意就这个问题发布悬赏。
-
感谢枫!我现在完全迷失了......不明白这段代码(primefaces.org/showcase-labs/ui/pprSelect.jsf)如何在同一个项目中正常工作
标签: ajax jsf-2 facelets primefaces