2

PrimefacesのSelectManyチェックボックスを使用していて、Beanに値を格納する際に問題が発生しています。

SelectManyCheckボックスの配列が必要です。これがこれまでのxhtmlです。

<c:set var="obj" value="#{userBean.userSettingsMap}"> </c:set>
<c:forEach items="#{obj}" var="entry">
  <h:outputText value="#{entry.key} " /><!--Correctly prints the key -->
  <p:selectManyCheckbox value="#{entry.value}"><!-- `entry.value` SHOULD correspond to inner lists --->
    <!-- I want values of these check boxes to be updated in my ManagedBean's property -->
    <f:selectItem itemLabel="Option 1" itemValue="Option 1" />
    <f:selectItem itemLabel="Option 2" itemValue="Option 2" />
    <f:selectItem itemLabel="Option 3" itemValue="Option 3" />
</p:selectManyCheckbox>
</c:forEach>   

[多数選択の配列]チェックボックスがページに表示されます。しかし、ページを送信しても、サブリストは更新されません。むしろ、ManagedBeanのオブジェクトが更新されていません。

したがって、送信すると、ダイアログに空白のリストが表示されます。

{キー1=[]、キー2 = []}

私のManagedBeanには、

  private Map<String,List<String>> userSettingsMap; 

サブリストが <p:selectManyCheckbox>ビューのそれぞれに対応する場所

[送信]ボタンは例と同じです。

  <p:commandButton value="Submit" update="display" oncomplete="dlg.show()" />
    <p:dialog header="Selected Values" modal="true" showEffect="fade" hideEffect="fade" widgetVar="dlg">

      <p:outputPanel id="display">
          <p:dataList value="#{userService.userMaintainceMap}" var="option">
              #{option}
          </p:dataList>             
      </p:outputPanel>
4

1 に答える 1

3

JSTL の を使用して Map を反復処理します。つまり、すべてのエントリは、おそらく MappedValueExpression.Entryc:forEach実装である内部反復子型になります。ここにメソッドがありますが、JavaBeans の規則に従っていないため、EL はそれを見つけられません。Map.EntrysetValue

その結果、読み取り専用のプロパティ#{entry.value}見なされ、そこに値を保存できなくなります。例外が発生することを期待していますが、おそらくどこかに飲み込まれています。通常のフォームと通常のコマンド ボタンは、ここで間違いなく例外をトリガーします。<p:selectManyCheckbox>

2 番目の問題は、選択のターゲットとしてジェネリックを含む Map があることですが、EL はそれらのジェネリックを見ることができず (Java に具体化されたジェネリックがないことで有名です)、値がリスト。次にString[]、マップにインスタンスを配置します。

キーでインデックス付けされた Map 式を選択のターゲットとして使用し、Map を に型指定することを宣言するとString[]、コードが機能するはずです。

例えば

innercheckbox.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:p="http://primefaces.org/ui">

    <h:body>

        <h:form>
            <c:forEach items="#{innerCheckboxBacking.userSettingsMap}" var="entry">
                <h:outputText value="#{entry.key}" />
                <p:selectManyCheckbox value="#{innerCheckboxBacking.userSettingsMap[entry.key]}">
                    <f:selectItem itemLabel="Option 1" itemValue="Option 1" />
                    <f:selectItem itemLabel="Option 2" itemValue="Option 2" />
                    <f:selectItem itemLabel="Option 3" itemValue="Option 3" />
                </p:selectManyCheckbox>
            </c:forEach>

            <h:commandButton value="Submit" action="#{innerCheckboxBacking.action}" />

        </h:form>

    </h:body>
</html>

InnerCheckboxBacking.java:

@ManagedBean
@ViewScoped
public class InnerCheckboxBacking {

    private Map<String, String[]> userSettingsMap = new LinkedHashMap<>();

    @PostConstruct
    public void init() {
        userSettingsMap.put("key1", null);
        userSettingsMap.put("key2", null);
    }

    public void action() {
        String[] result = userSettingsMap.get("key1");
        for (String string : result) {
            System.out.println(string);
        }
    }

    public Map<String, String[]> getUserSettingsMap() {
        return userSettingsMap;
    }

}
于 2012-09-29T11:23:45.823 に答える