【问题标题】:What is the most effective way of printing Arraylist of string array in Jsp?在Jsp中打印字符串数组的Arraylist最有效的方法是什么?
【发布时间】:2016-06-26 16:03:36
【问题描述】:

有一个 ArrayList 包含字符串数组。每个字符串数组包含每一行的值。我想用 JSP 打印这个。我尝试直接从 servlet 打印它,它可以工作,但是由于数据很多,所以速度很慢。如何在 JSP EL 中执行此操作?

public void printTableData(List<String[]> dataTable, PrintWriter out) {
        System.out.println(dataTable);
        out.println("<table border='1'>");
        out.println("<tr>");
        for (int j = 0; j < dataTable.get(0).length; j++) {
            out.println("<th>" + dataTable.get(0)[j] + "</th>");
        }
        out.println("</tr>");
        if (dataTable.size() > 1)
            for (int i = 1; i < dataTable.size(); i++) {
                out.println("<tr>");
                for (int j = 1; j < dataTable.get(i).length; j++) {
                    out.println("<td>" + dataTable.get(i)[j] + "</td>");

                }
                out.println("</tr>");
            }
        out.println("</table>");
    }

}

【问题讨论】:

  • dataTable.forEach(System.out::println);我在这里使用了 lambdas..或使用迭代器。
  • “大量数据”是什么意思?数千行?如果是这样,那么这是你的问题,你应该“分页”结果。无论如何,一个好的 java profiler 将极大地帮助您找到时间丢失的地方
  • 看看谷歌是怎么做到的。它被称为“过滤”和“分页”。他们不会在一个页面中一次显示所有这些海量的互联网结果。网络浏览器根本不会咀嚼它。

标签: java arrays jsp servlets arraylist


【解决方案1】:

首先将数据传递给您的请求。 之后创建表头:

<table class="your_class">
    <thead>
        <tr>
            <th>Title</th>
            <th>More</th>
            <th>Other</th>
        </tr>
    </thead>

然后用&lt;for:each&gt;遍历元素:

    <tbody>
        <c:forEach items="${list}" var="data">
            <tr class="your_class">
                <td>${data.attribute1}</td>
                <td>${data.attribute2}</td>
                <td>${data.attribute3}</td>
            </tr>
        </c:forEach>
    </tbody>
</table>

【讨论】:

  • 列数不固定。它每次都在变化。
  • 和?使用 c:if 并嵌套 for:each 以达到与 java 相同的结果,我们会给你工具,但不会让你工作
  • 您忘记剥离不相关的 ng 相关类,并在未经测试的方法中提及潜在的 XSS 攻击漏洞。
  • @Jordi 我没有要求这项工作。只是想提一下你误解了这个问题。无论如何,谢谢。
  • @LakshminathanLaky 不,你误解了解决方案,如果你可以在java中实现它,你可以在html中实现......
【解决方案2】:

如果您使用StringBuilder 连接字符串,可能会提高您的性能。

public void printTableData(List<String[]> dataTable, PrintWriter out) {
    System.out.println(dataTable);
    StringBuilder sb = new StringBuilder();
    sb.append("<table border='1'>\n");
    sb.append("<tr>\n");
    for (int j = 0; j < dataTable.get(0).length; j++) {
        sb.append("<th>");
        sb.append(dataTable.get(0)[j]);
        sb.append("</th>\n");
    }
    sb.append("</tr>\n");
    if (dataTable.size() > 1)
        for (int i = 1; i < dataTable.size(); i++) {
            sb.append("<tr>\n");
            for (int j = 1; j < dataTable.get(i).length; j++) {
                sb.append("<td>");
                sb.append(dataTable.get(i)[j]);
                sb.append("</td>\n");

            }
            sb.append("</tr>\n");
        }
    sb.append("</table>\n");
    out.println(sb.toString());
    }

}

【讨论】:

    【解决方案3】:

    我选择 Bazz 的答案。下面的代码应该可以正常工作。您需要在请求属性中添加 listName 模型。

    <c:forEach var="listVar" items="${listName}">
    <option value ="10"><c:out value="${listVar.attribute}"/></option>
    

    【讨论】:

      【解决方案4】:

      问题是如何在 JSP 中迭代...所以...

      • 首先你需要将列表添加到请求属性中:

        request.setAttribute("list", dataTable)
        
      • 然后可以在jsp中使用c:forEach标签进行迭代

        <c:forEach items="${list}" var="entry">
            <!-- iterate here using ${entry} -->
        </c:forEach>
        

      如果您使用 JSP 2.0,您也可以使用 varStatus="loop"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-14
        • 1970-01-01
        • 1970-01-01
        • 2016-07-28
        • 2019-10-05
        • 2015-07-14
        相关资源
        最近更新 更多