2011-08-28 7 views
2

의 항목 표시 JSF 콤보 상자에 Java 컬렉션의 미리 정의 된 데이터를 채울 수 없습니다.JSF 콤보 상자 : 콜렉션

백엔드, 모음에 대한 간단한 스텁 :

PriceRecord pr = new PriceRecord(); 
pr.setTypeCode(Arrays.asList(123L,456L)); 

이 작동하지 않는, 콤보 상자가 비어 :

<h:selectOneMenu value="#{price.typeCode}" var="code"> 
    <f:selectItem value="#{code}"/> 
</h:selectOneMenu> 

답변

0

JSF 2.0를 가정하면, 대신 <f:selectItems>을 시도합니다. official docs로부터 실시 예 : 위의 예에서

<h:selectOneListbox size="1" id="escape02" value="#{select05NoSelection.initialCollectionValues}"> 
    <f:selectItems value="#{select05NoSelection.hobbitList}" 
       var="n" 
       itemValue="#{n}" 
       itemLabel="#{n.bio}" 
       itemDescription="#{n.description}" 
       itemDisabled="#{n.disabled}" 
       itemLabelEscaped="true" 
       noSelectionValue="#{select05NoSelection.hobbitList[0]}"/> 
</h:selectOneListbox> 

라인의 특성 값 Collection<HobbitBean>-1 포인트. HobbitBean은 JavaBeans의 속성에 대한 명명 규칙을 준수하는 일반적인 Java 객체 (POJO) 일뿐입니다. 2 행의 value 속성은 List<HobbitBean>을 가리 킵니다. 다만 Collection, 배열 또는 javax.faces.model.DataModel을 가리킬 수도 있습니다. 3 번에서 9 번까지의 속성은 값이 POJO의 콜렉션이라는 사실을 이용합니다.

+0

은 1 호선과 2 호선 사이의 아주 명확한 차이가 아니다 : 업데이트 select05NoSelection.initialCollectionValues ​​및 select05NoSelection.hobbitList – sergionni

+0

의견의 차이가 무엇 – sergionni

+0

구성 요소의 "값"은 현재 선택된 개체이며, f : selectItems의 "값"은 목록에 표시되어야하는 값입니다. ''는' '를 포함하여 모든' '구성 요소에 대해 동일한 방식으로 사용됩니다. – meriton

3

정확한 질문은 무엇인지 모르겠지만 <h:selectOneMenu /> 구성 요소를 어떻게 사용할 수 있는지 간단한 예제를 제공 할 수 있습니다.

price.xhtml :

<h:selectOneMenu id="priceMenu" value="#{priceBean.selectedPrice}"> 
    <f:selectItems value="#{priceBean.prices}" /> 
</h:selectOneMenu> 

PriceBean.java 다음 SelectItem

.. 
private String selectedPrice; 
.. 
public String getSelectedPrice() { 
    return selectedPrice; 
} 

public void setSelectedPrice(String newPrice) { 
    selectedPrice = newPrice; 
} 
.. 
public List<SelectItem> getPrices() { 
    List<SelectItem> retVal = new ArrayList<SelectItem>(); 

    retVal.add(new SelectItem("2")); 
    retVal.add(new SelectItem("4")); 
    retVal.add(new SelectItem("6")); 

    return retVal; 
} 

추가 정보. 특수 객체를 직접 사용하려는 경우 (예 : Price이라는 객체) 변환기를 사용해야합니다. Here an example is shown.

7

주어진 코드는별로 의미가없는 것처럼 보입니다. 관용구 더 같이있다 :

여기
<h:selectOneMenu value="#{backingBean.typeCode}">    
    <f:selectItems value="#{backingBean.typeCodes}" var="typeCode" itemLabel="#{typeCode}" itemValue="#{typeCode}" /> 
</h:selectOneMenu> 

, #{backingBean.typeCode} 처음에 기본 선택 값을 나타내는 단일 값을 반환하는 속성입니다. 비어있는 경우 처음에는 값이 선택되지 않습니다. 사용자가 양식을 제출하면 사용자가 선택한 값을 받게됩니다. 귀하의 코드는 Long입니다.

#{backingBean.typeCodes}은 사용자가 선택할 수있는 모든 값의 모음을 반환하는 속성입니다. 귀하의 코드는 List<Long>입니다.

귀하의 값은 단순한 값이므로 여기에서 레이블과 값은 동일합니다. 예를 들어, 사용자라면 itemLabel에 #{user.name}, itemValue에 #{user.id}을 사용할 수 있습니다. itemValue로 렌더링되는 것은 무엇이든 selectOneMenu 구성 요소의 값 바인딩으로 푸시 된 것입니다.

다른 힌트 하나 : 일반적으로 SelectItem 유형을 사용하는 것을 피해야합니다. JSF 특정 유형 대신 간단한 도메인 오브젝트 및 그 콜렉션을 선호하십시오.

<h:selectOneMenu> 
    <c:forEach items="#{price.typeCode}" var="code"> 
     <f:selectItem itemValue="#{code}" itemLabel="#{code}"/> 
    </c:forEach> 
</h:selectOneMenu> 
0

그냥 당신이 항목을 반복 c:forEach를 사용할 수있는 작업 페이지를 만들려면 사실, 나는 콤보에 관심이 있지만 목록 상자에는 관심이 없다.