使用JSTL <c:forEach>生成动态HTML表格时单元格不显示问题求助
问题修复与排查指南
现存代码的核心故障点
- 语法拼写导致解析中断:
<c:forEach>标签中varStatus="i"与后续begin="0"属性之间缺失空格,被JSP引擎判定为非法标签属性,直接跳过整个循环块的渲染。 - 变量名作用域冲突:外层循环将
items="${fields}"的遍历变量也命名为fields,与数据源属性名完全重名,运行时会出现属性递归覆盖,无法正常读取后端传递的集合数据。 - 循环结构与目标结构错位:原逻辑每轮循环生成「1个仅含1个th的独立tr、1个独立数据tr」,和目标要求的「1行5个列头、多行动态数据行」的表格结构完全不匹配,就算循环正常执行也无法生成预期布局。
- 空测试条件触发异常:
<c:when test="">的空EL表达式会触发解析报错,直接中断当前循环块的渲染流程。
修正后的可运行实现
完全匹配目标静态表格的结构规范,保留原代码中的自定义样式、动态class与id生成逻辑:
<tbody class="highlight"> <!-- 固定表头行,匹配5个列的结构要求 --> <tr class="row"> <th class="head" style="border: 1px solid rgba(0,0,0,0.15); background: #fff !important; max-width: 30px;"></th> <th class="head" style="border: 1px solid rgba(0,0,0,0.15); background: #fff !important; max-width: 30px;"></th> <th class="head" style="border: 1px solid rgba(0,0,0,0.15); background: #fff !important; max-width: 30px;"></th> <th class="head" style="border: 1px solid rgba(0,0,0,0.15); background: #fff !important; max-width: 30px;"></th> <th class="head" style="border: 1px solid rgba(0,0,0,0.15); background: #fff !important; max-width: 30px;"></th> </tr> <!-- 动态渲染数据行 --> <c:forEach items="${fields}" var="field" varStatus="i"> <tr class="row tr_${i.index}_am disp-none ${i.index}am ${i.index}-time common-td" style="border: 1px dotted rgba(0, 0, 0, 0.15);"> <!-- 行序号单元格 --> <td class="cell" style="width: 35px; background: #fff !important; vertical-align: center;">${i.index}</td> <!-- 遍历生成剩余4个单元格,凑满5列匹配表头宽度 --> <c:forEach begin="0" end="3" varStatus="cell"> <td class="cell rowspaneven" id="${i.index}Slot_${cell.index}"></td> </c:forEach> </tr> </c:forEach> </tbody>
二次排查方向
如果修正代码后仍存在渲染异常,可按以下顺序排查:
- 检查页面头部是否正确引入JSTL核心标签库:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>,未引入的情况下所有<c:*>标签会被当作未知元素跳过渲染。 - 确认后端传递的
fields属性是否存在:通过request.setAttribute、Model.addAttribute等方式传递的集合,需保证属性名与EL表达式中的${fields}大小写完全一致,且值不为null,空集合会直接跳过循环渲染。 - 检查web.xml的版本配置:低版本Servlet环境下如果未正确开启EL表达式解析,所有
${}表达式会被当纯文本输出,无法触发动态逻辑。
内容的提问来源于stack exchange,提问作者Uttam Konduru
相关产品推荐
相关产品推荐

