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

JSP嵌套EL表达式调用方法报错及页面空白问题求助

JSP中<c:forEach>嵌套调用方法时EL表达式解析失败的解决方法

在JSP页面使用<c:forEach>遍历列表并调用对象方法时,遇到EL表达式解析错误,抛出jakarta.el.ELException;尝试用双引号替代单引号、去掉$符号后页面空白无报错,最终通过<c:set>标签正确编写EL表达式解决问题。


错误原因分析

初始代码中错误地将<c:out>标签的字符串形式作为参数传入getElement方法,导致EL表达式语法混乱,解析器无法正确识别表达式结构,从而抛出解析失败异常。例如错误写法:

<c:out value="${CIRCOSCRIZIONE.getElement( '&lt;c:out value='${circoscrizione}'/&gt;', '&lt;c:out value='${loop.index}'/&gt;')}"/>

这种混合了标签字符串和EL变量的嵌套写法完全不符合EL语法规范,解析器无法处理该结构。


解决方法

使用<c:set>标签预先计算方法调用的结果,再在页面中输出该结果,避免EL表达式的嵌套混乱。正确写法如下:

<c:forEach items="${parlamentare.getPk().getCircoscrizione()}" var="CIRCOSCRIZIONE2" varStatus="myIndex">
    <c:set var="circoscrizione" value="${CIRCOSCRIZIONE2.getElement(CIRCOSCRIZIONE2, myIndex.index)}"/>
    <td><c:out value="${circoscrizione}"/><br></td>
</c:forEach>

通过<c:set>将getElement方法的调用结果存入变量circoscrizione,再用<c:out>输出,确保EL解析器能正确处理方法调用逻辑。


原始相关代码

初始错误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>
<script src="<c:url value="/resources/js/jquery-1.11.1.min.js" />"></script>
<script src="<c:url value="/resources/js/bootstrap.min.js" />"></script>
</head>
<body>    

<h2>Lista dei parlamentari:</h2>
<form method="POST" action="lista_parlamentari.jsp">
<c:forEach items="${parlamentari}" var="parlamentare">
<table>
<tr>
<td>Nome:</td>
<td><c:out value="${parlamentare.getPk().getNome()}"/></td> <!-- se non funziona 
prova con getPk().getNome() -->
</tr>
<tr>
<td>Partito:</td>
<td><c:out value="${parlamentare.getPk().getPartito()}"/></td> 
</tr>
<tr>
<td>Circoscrizione:</td>



   <c:forEach items="${parlamentare.getPk().getCircoscrizione()}" 
var="CIRCOSCRIZIONE" varStatus="myIndex"> 

<td><c:out value="${CIRCOSCRIZIONE.getElement( '&lt;c:out value='${circoscrizione}'/&gt;', 
'&lt;c:out value='${loop.index}'/&gt;')}"/><br></td> 
       </c:forEach>
  </tr>
   <tr>   
  <td>Data di nascita:</td>
  <td><c:out value="${parlamentare.getData_nascita()}"/><br></td>
 </tr>
 <tr>
    <td>Luogo:</td>
  <td><c:out value="${parlamentare.getLuogo()}"/><br></td>
  </tr>
  <tr>
    <td>Titolo di studi:</td>
  <td><c:out value="${parlamentare.getTitolo_studi()}"/><br></td>
  </tr>
  <tr>
  <td>Mandati:</td>
  <c:forEach items="${parlamentare.getMandati()}" var="mandato" varStatus="myIndex">
      <table>
       <tr>
      <td>Mandato:</td> 
      <td><c:out value="${mandato.getElement('&lt;c:out value='${mandato}'/&gt;','&lt;c:out 
 value='${myIndex.index}'/&gt;')}" /> </td>
      </tr>
      </table>
      </c:forEach>
</tr>

<tr>
    <td>Commissioni:</td>
     <c:forEach items="${parlamentare.getCommissioni()}" var="commissione" 
varStatus="myIndex">
      <table>
       <tr>
      <td>Commissione:</td> 
      <td><c:out value="${commissione.getElement('&lt;c:out 
value='${commissione}'/&gt;','&lt;c:out value='${myIndex.index}'/&gt;')}"/></td>
      </tr>
      </table>
      </c:forEach>
  </tr>
 
  </table>
  </c:forEach>

    </form>
    
</body>
</html>

栈追踪信息

SEVERE: Servlet.service() for servlet [jsp] in context with path [/Parlamento] 
threw exception [/lista_parlamentari.jsp (line: [38], column: [4]) 
[${CIRCOSCRIZIONE.getElement( '&lt;c:out value='${circoscrizione}'/&gt;', '&lt;c:out 
value='${loop.index}'/&gt;')}] contains invalid expression(s): 
[jakarta.el.ELException: Failed to parse the expression 
[${CIRCOSCRIZIONE.getElement( '&lt;c:out value='${circoscrizione}'/&gt;', '&lt;c:out 
value='${loop.index}'/&gt;')}]]] with root cause
org.apache.jasper.JasperException: /lista_parlamentari.jsp (line: [38], column: 
[4]) [${CIRCOSCRIZIONE.getElement( '&lt;c:out value='${circoscrizione}'/&gt;', '&lt;c:out 
value='${loop.index}'/&gt;')}] contains invalid expression(s): 
[jakarta.el.ELException: Failed to parse the expression 
[${CIRCOSCRIZIONE.getElement( '&lt;c:out value='${circoscrizione}'/&gt;', '&lt;c:out 
value='${loop.index}'/&gt;')}]]

Java后端代码

public ModelAndView doPost()//(Parlamentare parlamentare) 
 {  
    ModelAndView mv= new ModelAndView();

    List<Parlamentare> parlamentari =parlamRepo.findAll();
    mv.addObject("parlamentari",parlamentari);
    mv.setViewName("lista_parlamentari.jsp");
    return mv;
 }

内容的提问来源于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 05:20:24