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( '<c:out value='${circoscrizione}'/>', '<c:out value='${loop.index}'/>')}"/>
这种混合了标签字符串和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( '<c:out value='${circoscrizione}'/>', '<c:out value='${loop.index}'/>')}"/><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('<c:out value='${mandato}'/>','<c:out value='${myIndex.index}'/>')}" /> </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('<c:out value='${commissione}'/>','<c:out value='${myIndex.index}'/>')}"/></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( '<c:out value='${circoscrizione}'/>', '<c:out value='${loop.index}'/>')}] contains invalid expression(s): [jakarta.el.ELException: Failed to parse the expression [${CIRCOSCRIZIONE.getElement( '<c:out value='${circoscrizione}'/>', '<c:out value='${loop.index}'/>')}]]] with root cause org.apache.jasper.JasperException: /lista_parlamentari.jsp (line: [38], column: [4]) [${CIRCOSCRIZIONE.getElement( '<c:out value='${circoscrizione}'/>', '<c:out value='${loop.index}'/>')}] contains invalid expression(s): [jakarta.el.ELException: Failed to parse the expression [${CIRCOSCRIZIONE.getElement( '<c:out value='${circoscrizione}'/>', '<c:out value='${loop.index}'/>')}]]
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
相关产品推荐
相关产品推荐

