当其他一些下拉列表更改其值时,我正在尝试填充下拉列表。即流行的例子:国家和城市。我为此尝试了f:ajax。好吧,ajax电话正在发生,但城市下降的人数并未减少。
我的Managed Bean代码本身存在一些问题,但我找不到它。有人可以看看吗?
register.xhtml
<h:selectOneMenu id="state" value="#{registerBean.state}" required="true">
<f:selectItems value="#{registerBean.stateList}"/>
<f:ajax render="outputDrop city" listener="#{registerBean.cityListener}"/>
</h:selectOneMenu>
<h:message for="state" />
<h:outputText id="outputDrop" value="#{registerBean.state}" />
<h:outputText value="#{msgbundle.reg_city}" />
<h:selectOneMenu id="city" value="#{registerBean.city}" required="true">
<f:selectItems value="#{registerBean.cityList}" />
</h:selectOneMenu>
<h:message for="city" />
ManagedBean
package org.droidaceapps.contractortimeflow;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.model.SelectItem;
public class RegUserInfoBean {
private String userName;
private String city;
private String state;
private String phone;
private String sex;
private ArrayList<SelectItem> stateList;
private ArrayList<SelectItem> cityList;
private enum stateKeys {AP,TN,MH};
public ArrayList<SelectItem> getStateList(){
stateList = new ArrayList<SelectItem>();
stateList.add(new SelectItem(null,"Select state"));
stateList.add(new SelectItem("AP","Andhra Pradesh"));
stateList.add(new SelectItem("TN","Tamilnadu"));
stateList.add(new SelectItem("MH","Maharastra"));
return stateList;
}
public ArrayList<SelectItem> getCityList(){
cityList = new ArrayList<SelectItem>();
cityList.add(new SelectItem(null,"Select"));
return cityList;
}
public void cityListener(AjaxBehaviorEvent event){
switch(stateKeys.valueOf(state)){
case AP:
cityList.add(new SelectItem("VIJ","Vijayawada"));
cityList.add(new SelectItem("GUN","Guntur"));
break;
case MH:
cityList.add(new SelectItem("MUM","Mumbai"));
cityList.add(new SelectItem("PUN","Pune"));
break;
case TN:
cityList.add(new SelectItem("CHE","Chennai"));
cityList.add(new SelectItem("MAD","Madurai"));
break;
default:
cityList.add(new SelectItem("NA","No value"));
}
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
答案 0 :(得分:0)
您每次都会在getter方法中重新创建citylist。你不应该这样做。 getter方法应该不包含任何业务代码。他们应该只归还财产。您应该在辅助bean的构造函数或@PostConstruct
方法中进行初始化。
所以,替换
public ArrayList<SelectItem> getCityList(){
cityList = new ArrayList<SelectItem>();
cityList.add(new SelectItem(null,"Select"));
return cityList;
}
通过
@PostConstruct
public void init() {
cityList = new ArrayList<SelectItem>();
cityList.add(new SelectItem(null,"Select"));
}
public ArrayList<SelectItem> getCityList(){
return cityList;
}
我还会相应地更改getStateList()
方法。在每个getter方法调用上重新创建列表是非常低效的。