我正在尝试遍历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.list
是List<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;
}
}
答案 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>
组件大致相同。