17

f:selectItems を使用して Map 内の項目を表示すると、Map 項目の値を表示できず、キーのみが表示されます。f:selectItems は itemLabel をまったく使用しません。代わりにリストを使用すると、うまくいきます。

次の例では、itemLabel を使用して、リスト内のアイテムの「説明」を表示します。

<h:selectOneMenu>
  <f:selectItems value="#{testBB.testList}" var="s"
    itemLabel="TEST #{s.description}" itemValue="#{TEST s.name}" />
</h:
selectOneMenu>

Map 内のアイテムの値を表示しようとする次の試みは機能しません。アイテムのキーを表示しますが、「TEST」テキストの出力がないことからわかるように、itemLabel 属性を使用しません。

<rich:select>
  <f:selectItems value="#{testBB.testMap}" var="s"
    itemLabel="TEST #{s.value}" itemValue="TEST #{s.key}" />
</rich:select>

使用される単純なバッキング Bean は次のとおりです。

public class TestBB {
  private Map<String, String> testMap;
  private List<TestItem> testList;

  public TestBB() {
    testMap = new HashMap<String, String>();
    testMap.put("1_key", "Item One");
    testMap.put("2_key", "Item Two");
    testMap.put("3_key", "Item Three");

    testList = new ArrayList<TestItem>();
    testList.add( new TestItem("name_1", "description_1") );
    testList.add( new TestItem("name_2", "description_2") );
    testList.add( new TestItem("name_3", "description_3") );
  }

  public Map<String, String> getTestMap() {
    return testMap;
  }

  public List<TestItem> getTestList() {
    return testList;
  }

}

では、これを機能させる方法、つまり selectItems でマップを効果的に使用する方法についてのアイデアはありますか?

4

1 に答える 1

46

あなたの質問は正しいですが、コードが混乱を招き、あいまいになっています。この回答では、あなたのコードを無視します。

での使用方法」Map<f:selectItems>という具体的な質問については、マップ キーがデフォルトでアイテム ラベルとして使用され、マップ値がデフォルトでアイテム値として使用されていることを認識する必要があります。あなたはそれが逆であることを期待しているようです(正直なところ、私も直感的にそれを期待していましたが、それは単なる設計上の決定でした-マップキーは一意性を強制し、オプションラベルはUIの観点から間違いなく一意である必要がありますが、オプション値必ずしも一意である必要はありません)。

LinkedHashMapしたがって、これでうまくいくはずです(挿入順序を維持するため、ここで使用していることに注意してください):

map = new LinkedHashMap<String, String>();
map.put("Label 1", "value1");
map.put("Label 2", "value2");
map.put("Label 3", "value3");

<f:selectItems value="#{bean.map}" />

キーと値を交換したい場合は、 を反復する必要がありますMap#entrySet()。これは、環境が EL 2.2 をサポートしている場合にのみ機能します。そのためのゲッターがないため、直接メソッド呼び出しによって呼び出す必要があるためです。

例えば

map = new LinkedHashMap<String, String>();
map.put("value1", "Label 1");
map.put("value2", "Label 2");
map.put("value3", "Label 3");

<f:selectItems value="#{bean.map.entrySet()}" var="entry" 
    itemValue="#{entry.key}" itemLabel="#{entry.value}" />

以下も参照してください。

于 2012-05-18T17:09:30.347 に答える