遍历 JSP 中的列表对象

Posted

技术标签:

【中文标题】遍历 JSP 中的列表对象【英文标题】:Iterating through a List Object in JSP 【发布时间】:2014-01-14 08:49:24 【问题描述】:

我正在做一个项目来尝试自学弹簧和支柱。我目前卡在 JSP 页面上。我有一个带有 getter/setter 变量 eid 和 ename 的 pojo 类,我在 sql 中也有一个具有相同值的表,其中包含六个填充的行。我正在通过 JdbcTemplate 访问我的数据库并将结果存储在一个列表,然后我将此列表传递到我的操作页面,在其中将其设置为request.setAttribute("empList",eList)。在我的 jsp 页面中,我调用了该属性,然后尝试使用 JSTL 对其进行迭代。 但是没有任何显示,我知道我的列表变量中有数据,因为我使用表达式标签 <%=eList%> 和对象显示如下:

[org.classes.database.Employee@d9b02, 
org.classes.database.Employee@13bce7e, 
org.classes.database.Employee@171cc79, 
org.classes.database.Employee@272a02, 
org.classes.database.Employee@137105d, 
org.classes.database.Employee@1359ad]

我想也许我在 jstl 上遗漏了一些东西,但我的 META-INF/lib 文件夹中有 jstl-1.2。我也尝试将它添加到配置路径文件中,但仍然没有。我也有正确的标签网址。 当我做一个简单的<c:out value="Hello"/>。你好打印出来。所以这让我相信我的jstl 工作正常,但是当我尝试使用jstl 遍历我的列表时,什么都没有出现。无论如何,这是我的 JSP 页面:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-   8859-1"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.List"%>
<!DOCTYPE html>
<% List eList = (List)session.getAttribute("empList");%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Employee Details</title>
</head>
<body>
<c:out value="Hello"></c:out>
<h3>Employee Details</h3>
<hr size="4" color="gray"/>
<table>
<%=eList%>
    <c:forEach items="$eList" var="employee">
        <tr>
            <td>Employee ID: <c:out value="$employee.eid"/></td>
            <td>Employee Pass: <c:out value="$employee.ename"/></td>  
        </tr>
    </c:forEach>
</table>
</body>
</html>

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

在自学 Spring 和 Struts 之前,您可能应该更深入地研究 Java 语言。像这样输出

org.classes.database.Employee@d9b02

Object#toString() 方法的结果,所有对象都继承自Object 类,Java 中所有类的超类。

List 子类通过遍历所有元素并在这些元素上调用 toString() 来实现这一点。但是,您似乎没有在 Employee 类中实现(覆盖)该方法。

你的 JSTL 在这里

<c:forEach items="$eList" var="employee">
    <tr>
        <td>Employee ID: <c:out value="$employee.eid"/></td>
        <td>Employee Pass: <c:out value="$employee.ename"/></td>  
    </tr>
</c:forEach>

除了您没有名为 eList 的页面、请求、会话或应用程序范围的属性之外,这很好。

你需要添加它

<% List eList = (List)session.getAttribute("empList");
   request.setAttribute("eList", eList);
%>

或者在forEach中使用属性empList

<c:forEach items="$empList" var="employee">
    <tr>
        <td>Employee ID: <c:out value="$employee.eid"/></td>
        <td>Employee Pass: <c:out value="$employee.ename"/></td>  
    </tr>
</c:forEach>

【讨论】:

【参考方案2】:
 <c:forEach items="$sessionScope.empL" var="emp">
            <tr>
                <td>Employee ID: <c:out value="$emp.eid"/></td>
                <td>Employee Pass: <c:out value="$emp.ename"/></td>  
            </tr>
        </c:forEach>

【讨论】:

【参考方案3】:

另一个只有脚本的示例,当迭代包含 Maps 的 ArrayList 时。

<%   
java.util.List<java.util.Map<String,String>> employees=(java.util.List<java.util.Map<String, String>>)request.getAttribute("employees");    

for (java.util.Map employee: employees) 
%>
<tr>
<td><input value="<%=employee.get("fullName") %>"/></td>    
</tr>
...
<%%>

【讨论】:

【参考方案4】:

把代码改成如下

<%! List eList = (ArrayList)session.getAttribute("empList");%>
....
<table>
    <%
    for(int i=0; i<eList.length;i++)%>
        <tr>
            <td><%= ((Employee)eList[i]).getEid() %></td>
            <td><%= ((Employee)eList[i]).getEname() %></td>  
        </tr>
      <%%>
</table>

【讨论】:

请不要建议将 scriptlet 作为 EL 和 jstl 的替代品。 @Alaa Abuzaghleh 了解为什么不使用 Scriptlets coderanch.com/how-to/java/WhyNotUseScriptlets【参考方案5】:

您可以直接在forEach标签中阅读empList。试试这个

 <table>
       <c:forEach items="$sessionScope.empList" var="employee">
            <tr>
                <td>Employee ID: <c:out value="$employee.eid"/></td>
                <td>Employee Pass: <c:out value="$employee.ename"/></td>  
            </tr>
        </c:forEach>
    </table>

【讨论】:

@jjcode 不客气。sessionScope 隐式对象提供了会话范围属性,因此无需使用脚本 let。阅读有关 EL 隐式对象的更多信息journaldev.com/2064/jsp-expression-language-el-example-tutorial

以上是关于遍历 JSP 中的列表对象的主要内容,如果未能解决你的问题,请参考以下文章

Javascript:如何遍历模型中的对象列表

jsp里面如何用forEach取一个数组里面的值,从而实现一个下拉列表

循环遍历 Django 模板中的对象列表

遍历对象映射:Freemarker 中的列表

如何遍历存储在数组列表中的对象[重复]

jsp页面中同时遍历多个list集合