You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:24:26