2013-05-22 95 views
2

我试图迭代映射项列表,即HashMap的ArrayList或类似的东西,我试图在primefaces数据表中做到这一点。这基本上就是我想要做的事:在primefaces数据表中遍历List <Map <String,String >>?

<body> 
    <h:form> 
     <p:dataTable value="#{customerBean.list}" var="map"> 
      <c:forEach items="#{map}" var="entry"> 
       <p:column headerText="#{entry.key}"> 
        #{entry.value} 
       </p:column> 
      </c:forEach> 
     </p:dataTable> 
    </h:form> 
</body> 

在这种情况下,customerBean.listList<Map<String, String>>和条目是Map<String, String>

我想要做的是根据Map<String, String>中的条目数量创建动态数量的列,同时使用映射条目的键作为标题名称,并将该值作为输出。当我使用硬编码的Map<String, String>时,c:forEach的东西似乎工作正常,但显然它无法循环访问p:dataTable的变量。我假定该程序采取了预防措施,以避免必须循环访问不同大小的地图。那么我怎么能做这个工作呢?如何根据Map中的条目数量创建任意数量的列?请注意,我是100%肯定,每一个Map<String, String>是大小相等的在我List<Map<String, String>>

编辑:

这里是我的豆源。代码工作很好,一切,问题是刚刚与循环不愿意去,通过我的地图:

@ManagedBean 
@SessionScoped 
public class CustomerBean { 

    private List<Map<String, String>> list = new ArrayList<Map<String, String>>(); 
    private Mapper mapper = new Mapper(); 

    public CustomerBean() { 
     list = mapper.all(); //gets data from database 
    } 

    public List<Map<String, String>> getList() { 
     return list; 
    } 

    public void setList(List<Map<String, String>> list) { 
     this.list = list; 
    } 
} 
+0

请张贴您的backbean代码。 – Makky

+0

相关:http://stackoverflow.com/questions/3342984/jstl-in-jsf2-facelets-makes-sense和http://stackoverflow.com/questions/13176842/dynamically-generate-hcolumn-based-on-list -of-hashmaps/ – BalusC

回答

5

的问题是无关的在这方面Map使用。问题是,你正在试图获得一个#{map}变量是只有时可用观点被渲染,但你现在都在依靠其价值时观点正在修建。后者在早期生命周期阶段上执行,因此当您需要时基本上不可用。

仍然,标记处理程序或视图构建标记(如<c:forEach>)是填充可变列数的唯一方法,因为在构建组件树时评估<p:column>

另一件事值得一提的是,支持bean势必<c:forEach>标签的财产,如items,必须是什么,但鉴于范围的,如请求范围,否则会在每次它会带来意想不到的/不想要的结果的请求被重新创建,因为当你尝试访问它的属性时,所需的bean不在那里。还有一些其他的设置星座解决了这个问题,但他们不是这里讨论的主题。

<p:dataTable value="#{customerBean.list}" var="map"> 
    <c:forEach items="#{forEachBean.columnsMap}" var="entry"> 
     <p:column headerText="#{entry.key}"> 
      #{map[entry.key]} 
     </p:column> 
    </c:forEach> 
</p:dataTable> 

另外值得注意的是,有一个助手<p:columns>组件大致相同。

+0

我只是将一个包含列的变量放在customerBean本身中。它像一个魅力。我不知道地图的价值可以像你一样进行访问(#{map [entry.key]},但显然它的效果很好,非常感谢! – ZimZim

+0

不客气! – skuntsel

相关问题