【问题标题】:h:selectOneMenu is not getting populated on f:ajax in jsfh:selectOneMenu 未在 jsf 中的 f:ajax 上填充
【发布时间】:2012-06-15 13:42:35
【问题描述】:

当其他一些下拉列表更改其值时,我正在尝试填充下拉列表。即流行的例子:国家和城市。我为此尝试了 f:ajax。好吧,ajax 调用正在发生,但城市下拉菜单没有被填充。

我的托管 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" />

托管豆

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;
}

 }

【问题讨论】:

    标签: ajax jsf selectonemenu


    【解决方案1】:

    您每次都在 getter 方法中重新创建城市列表。你不应该那样做。 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 方法调用上重新创建列表效率很低。

    另见:

    【讨论】:

    • 谢谢。是的,我以非常错误的方式进行了初始化。我看到了你所有的答案 BalusC 并且想知道你是如何获得这么多知识的(几乎所有的 java 技术!!!)!!!!!! ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    相关资源
    最近更新 更多