JSF中如何在DataTable中展示嵌套ArrayList数据
解决JSF DataTable展示URL和Title列表的问题
兄弟,你当前的写法有个核心问题:数据结构不对。你把两个完整的ArrayList<String>(urlx和titlex)直接塞进外层的newList里,这样newList的结构是[urlx列表, titlex列表],DataTable遍历的时候会把整个url列表、整个title列表分别当成一行数据,既没法对应到#{car.xxxx}的属性,也根本不是你想要的“每行一个URL+一个Title”的效果。
下面给你两种可行的解决方案,优先推荐第一种,更符合JavaEE的规范:
方案1:创建实体类封装URL和Title
这是最规范的做法,通过实体类把成对的URL和Title绑定成一个对象,让DataTable能直接遍历每个对象展示对应属性。
步骤1:创建实体类
先写一个简单的实体类,比如叫LinkItem,用来封装URL和Title:
public class LinkItem { private String url; private String title; // 构造方法 public LinkItem(String url, String title) { this.url = url; this.title = title; } // Getter和Setter方法(必须写,JSF依赖这些方法读取属性) public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }
步骤2:修改Bean中的数据结构和初始化逻辑
把原来的List<ArrayList<String>> newList改成List<LinkItem> newList,然后把urlx和titlex中的元素一一对应封装成LinkItem添加进去:
// 修改类型为List<LinkItem> private List<LinkItem> newList; private List<String> urlx; private List<String> titlex; // 初始化列表的方法(可以在Bean的@PostConstruct方法里调用,或者页面加载时触发) @PostConstruct public void initNewList() { newList = new ArrayList<>(); // 假设urlx和titlex的长度相同,循环遍历成对添加 for (int i = 0; i < urlx.size(); i++) { newList.add(new LinkItem(urlx.get(i), titlex.get(i))); } }
步骤3:修改XHTML的DataTable配置
现在DataTable的var会指向每个LinkItem对象,直接通过属性名调用即可:
<p:dataTable var="item" value="#{MyBean.newList}"> <p:column headerText="URL"> <h:outputText value="#{item.url}" /> </p:column> <p:column headerText="Title"> <h:outputText value="#{item.title}" /> </p:column> </p:dataTable>
方案2:用Map封装(无需实体类)
如果不想额外创建实体类,也可以用Map<String, String>来临时封装每对URL和Title,适合简单场景:
步骤1:修改Bean中的数据结构
private List<Map<String, String>> newList; private List<String> urlx; private List<String> titlex; @PostConstruct public void initNewList() { newList = new ArrayList<>(); for (int i = 0; i < urlx.size(); i++) { Map<String, String> itemMap = new HashMap<>(); itemMap.put("url", urlx.get(i)); itemMap.put("title", titlex.get(i)); newList.add(itemMap); } }
步骤2:XHTML配置和方案1一样
<p:dataTable var="item" value="#{MyBean.newList}"> <p:column headerText="URL"> <h:outputText value="#{item.url}" /> </p:column> <p:column headerText="Title"> <h:outputText value="#{item.title}" /> </p:column> </p:dataTable>
关键提醒
一定要确保urlx和titlex的长度一致,否则循环的时候会出现索引越界的问题哦!
内容的提问来源于stack exchange,提问作者KontrCode
相关产品推荐
相关产品推荐

