迭代List <map <string,string =“”>&gt;在primefaces datatable?</map <string,>

时间:2013-05-22 09:45:25

标签: jsf loops map primefaces datatable

我正在尝试遍历Map of Map项目,即HashMaps的ArrayList或类似的东西,我正在尝试在primefaces数据表中执行此操作。这基本上就是我要做的事情:

<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>中的条目数量创建动态数量的列,同时使用映射条目的键作为标题名称,并将值作为输出。当我使用硬编码c:forEach时,Map<String, String>似乎工作得很好,但显然它无法遍历p:dataTable的变量。我假设该程序采取预防措施,以避免必须循环不同大小的地图。那么我怎么能做这项工作呢?如何根据Map中的条目数创建任意数量的列?请注意,我100%确定Map<String, String>

每个List<Map<String, String>>的大小相同

编辑:

这是我的bean来源。代码工作正常,一切,问题只是循环不愿意通过我的地图:

@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;
    } 
}

1 个答案:

答案 0 :(得分:5)

此问题与此上下文中的Map用法无关。问题是,当您正在渲染视图时,您尝试获取#{map}变量,但是您依赖于它的值正在构建视图的时刻。后者是在早期生命周期阶段上执行的,因此当您需要时它基本上不可用。

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

另一件值得注意的事情是绑定到<c:forEach>标签属性的支持bean,例如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>组件大致相同。