0

私は3つのコンボボックスを持っています。最初のものには値が入力されます。そこから値を選択すると、2番目の値を更新する必要があります。その後、2番目のコンボから値を選択すると、3番目のコンボが入力されます。私はこれがすでに伝達されていることを知っていますが、2つのコンボがあります。2つ以上では機能しません。私がきちんとやらなかったことを教えてください。

ビューは次のとおりです。

<h:form>
    <h:panelGrid columns="2">        
        <h:outputText value="Choose the produce type:"/>

        <h:selectOneMenu id="firstList"
                            value="#{userBean.firstItem}"                
                            valueChangeListener="#{userBean.valueChanged}">
            <f:selectItems value="#{userBean.firstList}"
                           var="element"
                           itemLabel="#{element.label}"
                           itemValue="#{element.value}" />
                <a4j:support reRender="outputPanel"
                             event="onchange"                                                                  
                             ajaxSingle="true"
                             bypassUpdates="false" />                
        </h:selectOneMenu>

        <a4j:outputPanel id="outputPanel">
            <h:selectOneMenu value="#{userBean.secondItem}"                
                             valueChangeListener="#{userBean.valueChanged}">
            <f:selectItems value="#{userBean.secondList}"
                           var="element"
                           itemLabel="#{element.label}"
                           itemValue="#{element.value}" />                    
                    <a4j:support reRender="outputPanel"
                             event="onchange"                                                                  
                             ajaxSingle="true"
                             bypassUpdates="false" />                                                 
            </h:selectOneMenu>

            <h:selectOneMenu value="#{userBean.thirdItem}"                
                             valueChangeListener="#{userBean.valueChanged}">
            <f:selectItems value="#{userBean.thirdList}"
                           var="element"
                           itemLabel="#{element.label}"
                           itemValue="#{element.value}" />                                                 
            </h:selectOneMenu>                
        </a4j:outputPanel>

    </h:panelGrid>
</h:form>

これはBeanです(これは意味のある意味のないサンプルコードです):

@Name("userBean")
public class UserBean
{
@Logger private Log log;

@In StatusMessages statusMessages;

private String firstItem="";
private String secondItem="";
private String thirdItem="";
public List<SelectItem> firstList = new ArrayList<SelectItem>(); 
public List<SelectItem> secondList = new ArrayList<SelectItem>();
public List<SelectItem> thirdList = new ArrayList<SelectItem>();
private static final String [] FRUITS = {"Banana", "Cranberry", "Blueberry", "Orange"};
private static final String [] VEGETABLES = {"Potatoes", "Broccoli", "Garlic", "Carrot"};
private static final String [] GIRLS = {"Victoria", "Nana", "Etc.."};

public UserBean() {
    SelectItem item = new SelectItem("fruits", "Fruits");
    firstList.add(item);
    item = new SelectItem("vegetables", "Vegetables");
    firstList.add(item);
    item = new SelectItem("girls", "Girls");
    firstList.add(item);
    for (int i = 0; i < FRUITS.length; i++) {
        item = new SelectItem(FRUITS[i]);
    }
}

public List<SelectItem> getFirstList() {
    return firstList;
}

public List<SelectItem> getSecondList() {
    return secondList;
}

public List<SelectItem> getThirdList() {
    return thirdList;
}

public static String[] getFRUITS() {
    return FRUITS;
}

public static String[] getVEGETABLES() {
    return VEGETABLES;
}

public static String[] getGIRLS() {
    return GIRLS;
}

public void valueChanged(ValueChangeEvent event){
    String[] currentItems;
    String id = ((HtmlSelectOneMenu)event.getSource()).getId();
    if (id.equals("firstList")) {            
        currentItems = FRUITS;

        for (int i = 0; i < currentItems.length; i++) {
            SelectItem item = new SelectItem(currentItems[i]);
            secondList.add(item);
        }

        thirdList.clear();
    } else {
        currentItems = GIRLS;

        for (int i = 0; i < currentItems.length; i++) {
            SelectItem item = new SelectItem(currentItems[i]);
            thirdList.add(item);
        }
    }  
}

public String getFirstItem() {
    return firstItem;
}


public void setFirstItem(String firstItemArg) {
    firstItem = firstItemArg;
}


public String getSecondItem() {
    return secondItem;
}


public void setSecondItem(String secondItemArg) {
    secondItem = secondItemArg;
}

public String getThirdItem() {
    return thirdItem;
}


public void setThirdItem(String thirdItemArg) {
    thirdItem = thirdItemArg;
} 

問題は、2番目のコンボボックス(値が動的にロードされた)から値を選択すると、ページが再ロードされ(ajaxリクエストが実行される代わりに)、例外が発生することです。

要求処理中の例外:メッセージ「java.util.NoSuchElementException」を伴うjavax.servlet.ServletExceptionが原因です

2番目のリストは最初のリストから正常に更新されていますが、その後に問題が発生しています。

前もって感謝します!乾杯!

4

1 に答える 1

1

会話スコープのように、Beanのスコープがリクエストよりも広いことを確認してください。JSF 1.2を使用しているようです。この場合、RichFacesには<a4j:keepAlive>、管理対象BeanのスコープをRequestからViewに上げるためのタグコンポーネントがあります(バックグラウンドでセッション変数を使用)。このオプションはあなたが必要とするものかもしれません。それを実装する2つの方法があります

  1. タグコンポーネントを使用します。これにより、Beanはこのページに対してのみ「ビュースコープ」を持つようになります。

    <a4j:keepAlive bean="userBean" />
    <h:form>
        <h:panelGrid columns="2">
        <!-- the rest of your code... -->
    
  2. タグ注釈を使用します。これにより、使用されるすべてのページでBeanに「ビュースコープ」が設定されます。

    @Name("userBean")
    @KeepAlive
    public class UserBean {
        //your managed bean code...
    }
    

注:このタグを(コンポーネントまたはアノテーションとして)使用するには、BeanにRequestスコープが必要です。

于 2012-08-21T14:25:21.797 に答える