JSP变量转Java问题:嵌套forEach失效与索引调用方法报错
问题描述
在JSP中使用嵌套<c:forEach>循环时出现异常,查阅资料得知需通过方法访问变量,但我的getElement方法需要传入索引i来读取数组元素。于是将<c:forEach>改为普通Java for循环,却发现EL表达式中的parlamentare.getPk().getCircoscrizione()无法在脚本中被识别,请问如何实现JSP变量到Java代码的转换?
相关代码片段
出错的for循环尝试
<% for(int i = 0; i < ${parlamentare.getPk().getCircoscrizione()}; i++) { %>
Parlamentare.java
public String getElement(String[] a, int n) { return a[n]; }
ListaParlamentari.java
public ModelAndView doPost() { ModelAndView mv = new ModelAndView(); List<Parlamentare> parlamentari = parlamRepo.findAll(); mv.addObject("parlamentari", parlamentari); mv.setViewName("lista_parlamentari.jsp"); return mv; }
lista_parlamentari.jsp(关键部分)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page import="com.giuggiola.entity.Parlamentare" %> <!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <title>Lista parlamentari</title> </head> <body> <h2>Lista dei parlamentari:</h2> <form method="POST" action="lista_parlamentari.jsp"> <c:forEach items="${parlamentari}" var="parlamentare"> <table> <!-- 其他字段省略 --> <tr> <td>Circoscrizione:</td> <!-- 尝试的普通for循环被注释 --> <!-- <% for(int i = 0; i < ${parlamentare.getPk().getCircoscrizione()}; i++) { %> --> <c:forEach items="${parlamentare.getPk().getCircoscrizione()}" var="CIRCOSCRIZIONE"> <td><c:out value="${CIRCOSCRIZIONE.getElement(CIRCOSCRIZIONE,i)}"/><br></td> </c:forEach> </tr> <!-- 其他字段省略 --> </table> </c:forEach> </form> </body> </html>
解决方案
1. 用JSTL <c:forEach>的varStatus获取索引(推荐)
不需要切换到普通Java for循环,JSTL的<c:forEach>支持通过varStatus属性获取当前循环的索引、计数等信息,完全满足你需要索引i的场景,同时避免混合脚本和EL的问题。
修改Circoscrizione部分的代码如下:
<tr> <td>Circoscrizione:</td> <c:forEach items="${parlamentare.getPk().getCircoscrizione()}" var="circoscrizione" varStatus="status"> <!-- 直接使用遍历到的数组元素 --> <td><c:out value="${circoscrizione}"/><br></td> <!-- 如果一定要调用getElement方法(其实没必要,直接用元素即可) --> <!-- <td><c:out value="${parlamentare.getElement(parlamentare.getPk().getCircoscrizione(), status.index)}"/><br></td> --> </c:forEach> </tr>
2. 若必须使用普通Java for循环
JSP脚本(<% %>)中的Java代码无法直接使用EL表达式(${}),需要先通过pageContext.getAttribute()将EL上下文的变量转换为Java对象,再进行操作:
<tr> <td>Circoscrizione:</td> <% // 从pageContext中获取当前的parlamentare对象 Parlamentare parl = (Parlamentare) pageContext.getAttribute("parlamentare"); String[] circoscrizioni = parl.getPk().getCircoscrizione(); for(int i = 0; i < circoscrizioni.length; i++) { %> <td><%= circoscrizioni[i] %><br></td> <!-- 或者调用getElement方法 --> <!-- <td><%= parl.getElement(circoscrizioni, i) %><br></td> --> <% } %> </tr>
3. 优化建议
- 尽量避免在JSP中编写Java脚本(
<% %>),优先使用JSTL标签和EL表达式,这是JSP的标准实践,代码更易维护。 - 你的
getElement方法其实可以简化,因为直接访问数组元素a[n]和调用该方法效果一致,没必要额外封装,除非有特殊逻辑。
内容的提问来源于stack exchange,提问作者utente1234567890
相关产品推荐
相关产品推荐

