web-dev-qa-db-ja.com

JSF-2 f:selectItems withMapはitemLabelを表示しません

F:selectItemsを使用してマップ内のアイテムを表示すると、マップアイテムの値を表示できず、キーのみを表示できます。 f:selectItemsはitemLabelをまったく使用しません。代わりにリストを使用すると、動作します。

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

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

マップ内のアイテムの値を表示する次の試みは機能しません。 「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でマップを効果的に使用する方法についてのアイデアはありますか?

16
Alex Ormond

あなたの質問は正しいですが、コードはそれを混乱させ、曖昧にします。この回答では、コードを無視します。

具体的な質問「_<f:selectItems>_でMapを使用する方法」については、マップキーがデフォルトではアイテムラベルとして使用され、そのマップ値はデフォルトでアイテム値として使用されます。あなたはそれが逆であることを期待しているようです(正直なところ、私は直感的にもそれを期待していますが、それは単なる設計上の目的でした-マップキーは一意性を強制し、オプションラベルは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}" />
_

参照:

42
BalusC