2012-10-02 100 views
7

一個地圖使用JSF 1.2JSP ....JSF 1.2 - 遍歷包含集合

是否可以遍歷一個Map,它的值包含集合?

我有一個地圖,看起來像這樣:

Map<String, List<Foo>> myMap;

我想遍歷MYMAP並繪製一個單獨的表中的每個關鍵。

每個表將包含多行。

每一行代表映射到當前鍵的ArrayList中的Foo對象。

很遺憾,我們正在使用JSF 1.2和JSP。

我希望我可以使用一個嵌套的<h:dataTable>標籤,但我沒有任何成功。


編輯

這裏是諮詢BalusC的回答後,我當前的JSP代碼:

    <c:forEach items="#{someModule$someBean.prefMap}" var="mapEntry"> 
         <br/><br/><p>Key: <h:outputText value="#{mapEntry.key}"/></p> 
         <h:dataTable value="#{mapEntry.value}" var="pref"> 
          <h:column><h:outputText value="#{pref.defaultFieldLabel}"/></h:column> 
          <h:column><h:outputText value="#{pref.fieldLabel}"/></h:column> 
         </h:dataTable> 
        </c:forEach> 

它會導致以下異常:

javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in <forEach>


這裏是我的Managed Bean的一些代碼。

請注意,我使用的HashMap和ArrayList,而不是地圖和列表

(我讀的地方你不能使用接口,這也不起作用)之前

private HashMap<String, ArrayList<Foo>> prefMap; 

public HashMap<String, ArrayList<Foo>> getPrefMap() 
{ 
    if (prefMap == null) 
    { 
    buildPrefMap(); 
    } 
    return prefMap; 
} 

private void buildPrefMap() 
{ 
    prefMap = new HashMap<String, ArrayList<Foo>>(); 
    for (Foo mdp : getFooArray()) 
    { 
    String cat = mdp.getField().getCategory(); 
    if (! prefMap.containsKey(cat)) 
    { 
     ArrayList<Foo> mpl = new ArrayList<Foo>(); 
     mpl.add(mdp); 
     prefMap.put(cat, mpl); 
    } 
    else 
    { 
     prefMap.get(cat).add(mdp); 
    } 
    } 
} 

private void dumpMapInfo() 
{ 
    StringBuilder sb = new StringBuilder(); 
    Map<String, ArrayList<Foo>> theMap = getPrefMap(); 
    for (String key : theMap.keySet()) 
    { 
    sb.append(key + ": " + theMap.get(key).size()); 
    } 
    System.out.println("\n\n" + sb.toString()); 
} 

調用dumpMapInfo渲染頁面確認Map不爲空並按預期填充。

+0

對不起,錯過了JSF 1.2的一部分。這可能會有所幫助:http://stackoverflow.com/a/8552872/880619 –

+0

不幸的是,我們使用的是JSP(而不是Facelets)。 – jahroy

回答

11

JSF沒有任何可以遍歷Map的組件。只有JSTL<c:forEach>可以迭代Map。每次迭代都會爲您提供Map.Entry返回,後者又有getKey()getValue()方法。您可以使用<h:dataTable>來迭代地圖值。

<c:forEach items="#{bean.map}" var="entry"> 
    <p>Key: <h:outputText value="#{entry.key}" /></p> 
    <h:dataTable value="#{entry.value}" var="foo"> 
     <h:column><h:outputText value="#{foo.prop1}" /></h:column> 
     <h:column><h:outputText value="#{foo.prop2}" /></h:column> 
     <h:column><h:outputText value="#{foo.prop3}" /></h:column> 
    </h:dataTable> 
</c:forEach> 

更新這個當你使用JSTL 1.2才起作用。這在JSTL 1.1中失敗了,因爲在JSTL 1.1標記中無法識別#{},因此您不得不使用${},但是這在嵌套的JSF組件中又失敗了,因爲它們只接受#{}。你基本上需要在整段代碼中回到「普通」JSP/HTML,或者更好的辦法是抓住Tomahawk的<t:dataList>

+0

我收到以下異常:'javax.servlet.jsp.JspTagException:不知道如何遍歷提供的「items」< for each >'請注意,我們正在使用JSF 1.2並且正在使用Sun Application Server 9.0_1 – jahroy

+0

Works對於[JSTL 1.2](http://stackoverflow.com/tags/jstl/info)和[Tomcat 6.0.35](http://tomcat.apache.org/download-60.cgi)(用' web.xml'設置爲Servlet 2.5)。你使用的是什麼JSTL和容器版本? – BalusC

+0

SJAS 9.0使用JSTL 1.1,但它應該可以很好地工作。你確定EL語法是正確的嗎?例如,您可能會遇到此錯誤''沒有'#{}'或'$ {}''。 – BalusC