MySQL查询返回的ArrayList无法在JSP表格中显示的求助
排查JSP中
<c:out>输出为空的问题 1. 核对实体类属性与EL表达式的名称匹配
确保items中的对象属性名和<c:out>里使用的名称完全一致且大小写正确。比如实体类定义private String userName;,EL表达式必须写${item.userName},不能写成username或UserName——EL对大小写严格敏感。
2. 验证实体类getter方法的正确性
EL表达式依赖JavaBean规范的getter方法取值:
- 访问
userName必须对应public String getUserName()方法,方法名需遵循“属性首字母大写+前缀get(布尔类型用is)”的规则。 - 若getter方法缺失或命名错误,EL将无法获取属性值。
3. 直接输出对象验证数据存在性
在<c:forEach>中先打印整个对象,确认数据是否真的被加载:
<c:forEach var="item" items="${queryResult}"> <tr> <td>${item}</td> <!-- 查看对象toString()的输出内容 --> </tr> </c:forEach>
如果输出类似User{id=1, userName='test'},说明对象有数据,问题出在属性访问;如果输出com.example.User@xxxxxx,仅代表未重写toString(),不影响EL取值,继续排查其他项。
4. 确认当前JSP未禁用EL表达式
检查页面顶部的page指令,确保没有isELIgnored="true"配置,正常默认值为isELIgnored="false",无需额外声明。
5. 用原生Java代码替代EL验证取值逻辑
在<c:forEach>中嵌入脚本片段直接调用getter方法,判断是否是EL的问题:
<c:forEach var="item" items="${queryResult}"> <tr> <td><%= ((com.example.User)pageContext.getAttribute("item")).getUserName() %></td> </tr> </c:forEach>
如果这段代码能输出值,说明EL的属性访问存在问题;如果同样为空,需回到查询方法确认实体类属性是否被正确赋值。
6. 回溯查询方法的数据填充逻辑
即使查询方法运行正常,也要确认:
- ORM框架(如MyBatis)的结果映射是否正确关联数据库字段与实体类属性;
- JDBC代码中是否将ResultSet的字段值正确赋值给实体类;
- 可在查询方法中打印实体类的属性值,确认数据是否真的被填充到对象中。
内容的提问来源于stack exchange,提问作者Cezar Apulchro
相关产品推荐
相关产品推荐

