如何使用scriptlet /表达式访问c:forEach中的迭代变量?

时间:2013-10-22 21:21:34

标签: java-ee foreach jstl java-ee-6

var 是一个静态属性,用于公开当前元素(正文的本地元素)

如何通过scriptlet / expression访问var属性?

初始化代码

<% 
Employee e = new Employee();
e.setName("name");
e.setEmail("abc@gmail.com");
java.util.List<Employee> empList = new java.util.ArrayList();
empList.add(e);
request.setAttribute("empList", empList); %>

forEach code 1 deferredExpression错误

<c:forEach var="emp" items="${employees}">
  <c:out value="${emp.name}"/><br><%=emp.getName()%> 
</c:forEach>

NOR

forEach code 2 deferredExpression错误

<c:forEach var="emp" items="${empList}" varStatus="status">
  Emp email: <%= ((Employee)(pageContext.findAttribute("emp"))).getName() %>
</c:forEach>

3 个答案:

答案 0 :(得分:5)

由于我有不同版本的JSTL库,每次更改时都有java.lang.NoSuchFieldError:deferredExpression,现在我只留下一个jstl-1.2.jar more info about JSTL

JSTL文档文档清楚地说明了“当前迭代项目的导出范围变量的名称。此范围变量具有嵌套可见性。”嵌套意味着从开始标记到结束标记。

EL代码

<c:forEach begin="0" end="5" var="countvar">
Iteration number ${ countvar + 24 }
</c:forEach>

替代JSP脚本

<c:forEach begin="0" end="5" var="countvar">
Iteration number
<%= ((Integer) (pageContext.findAttribute("cv")).intValue()+24 %>
</c:forEach>

另一个c:forEach示例,带有集合

<% 
 Employee e = new Employee();
 e.setName("name");
 e.setEmail("abc@gmail.com");
 java.util.List<Employee> empList = new java.util.ArrayList();
 empList.add(e);
 request.setAttribute("empList", empList); 
%>

<c:forEach var="emp" items="${empList}" varStatus="status">
  Emp email: <%= ((Employee)(pageContext.findAttribute("emp"))).getName() %>
</c:forEach>

答案 1 :(得分:3)

我使用以下一般代码:

<c:forEach items="<%= itemList %>" var="item">
    <%
        ItemClass item = (ItemClass)pageContext.getAttribute("item");
    %>
    <p>Value with scriptlet: <%= item.getValue() %></p>
    <p>Value with EL ${item.value}</p>
</c:forEach>

你的EL案例:

<c:forEach var="emp" items="<%= empList %>" varStatus="status">
  ${emp.name} email: ${emp.email}
</c:forEach>

您使用scriptlet的情况:

<c:forEach var="emp" items="<%= empList %>" varStatus="status">
  <%
      Employee employee = (Employee)pageContext.getAttribute("emp");
  %>
  <%= employee.getName() %> email: <%= employee.getEmail() %>
</c:forEach>

答案 2 :(得分:-1)

<c:forEach var="emp" items="${empList}" varStatus="status">
  <c:out value="Emp email: ${emp.email}"/>
</c:forEach>