JSP中如何通过EL表达式获取程序动态构造id的元素
问题核心原因
EL表达式语法不支持嵌套${}结构,因此${table_${num}}属于非法写法,无法被容器正常解析。
你尝试的${parent_element.children().get(0)}写法失效,是因为低于3.0版本的EL不支持直接调用对象的普通方法,仅支持访问符合JavaBean规范的get/set属性,兼容性较差。
可用解决方案
方案1:使用<c:set>预拼接变量名(兼容性最好)
先通过JSTL的<c:set>标签拼接出完整的属性key,再通过EL的[]操作符从对应域中读取属性:
<!-- 首先导入JSTL核心标签库,放在JSP顶部 --> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!-- 拼接属性key --> <c:set var="tableAttrKey" value="table_${num}" /> <!-- 从对应域中读取属性,默认按page>request>session>application顺序查找 --> ${pageContext.findAttribute(tableAttrKey)}
如果你明确知道属性存放在哪个域,可以直接指定域对象提升性能:
- 存放在page域:
${pageScope[tableAttrKey]} - 存放在request域:
${requestScope[tableAttrKey]} - 存放在session域:
${sessionScope[tableAttrKey]} - 存放在application域:
${applicationScope[tableAttrKey]}
方案2:EL3.0+ 直接使用concat函数拼接
如果你的项目使用EL3.0及以上版本,可以省略<c:set>步骤,直接拼接key读取:
${pageScope[concat('table_', num)]}
注意事项
- 需确保变量
num已经在对应的作用域中存在,且值为合法的数字/字符串类型 - 若项目未引入JSTL,也可以通过少量脚本代码实现拼接,但不推荐在JSP中嵌入脚本:
<% int num = (int) request.getAttribute("num"); pageContext.setAttribute("tableAttrKey", "table_" + num); %> ${tableAttrKey}
内容的提问来源于stack exchange,提问作者Brian Zhu
相关产品推荐
相关产品推荐

