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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:25:23