如何在自定义标签中访问<c:forEach>的var变量并赋值给属性?
解决<c:forEach>变量传递给自定义标签属性的问题
咱们一步一步来拆解这个问题,你其实已经找对方向了,只是几个细节没处理到位:
首先,先纠正你代码里的一个基础语法问题:JSTL的循环标签是大小写敏感的,<c:foreach>要写成<c:forEach>,不然容器识别不了这个标签。
正确的变量传递方式:用EL表达式直接赋值
你不需要手动调用pageContext.getAttribute(),在JSP标签的属性里直接用EL表达式就能拿到<c:forEach>的var变量,写法很简单:
<!-- 建议把var改成"item",避免和集合名混淆,命名更清晰 --> <c:forEach items="${collection}" var="item"> <custom:tag name="${item}" /> </c:forEach>
这里的${item}会直接取到循环中当前的元素,赋值给自定义标签的name属性。
为什么你的pageContext.getAttribute()没生效?
大概率是这两个原因:
- 变量名写错了:你代码里
var="items",但却用pageContext.getAttribute("item")(少了个s),变量名必须完全匹配才行。 - 自定义标签不支持EL表达式赋值:如果你的自定义标签在TLD(标签库描述符)文件里,
name属性的rtexprvalue没设为true,那EL表达式不会被解析,会直接当成字符串处理。
确保自定义标签支持EL的配置
打开你的标签库TLD文件,找到对应自定义标签的配置,把name属性的rtexprvalue设为true:
<tag> <name>tag</name> <tag-class>com.yourpackage.YourCustomTagClass</tag-class> <body-content>empty</body-content> <attribute> <name>name</name> <required>true</required> <!-- 这个必须设为true,才能让属性接收EL表达式的值 --> <rtexprvalue>true</rtexprvalue> </attribute> </tag>
额外提示:标签类里获取属性值的正确方式
如果要在自定义标签的Java类里使用name属性的值,直接通过生成的getter方法获取就行,不用手动去pageContext里拿——容器会自动把EL解析后的值注入到属性中,比如:
public class YourCustomTagClass extends TagSupport { private String name; // 容器会自动调用setter注入值 public void setName(String name) { this.name = name; } @Override public int doStartTag() throws JspException { // 直接用this.name就能拿到传递过来的forEach变量值 System.out.println("Received name: " + name); return SKIP_BODY; } }
总结一下关键步骤:
- 修正
<c:forEach>的标签名大小写 - 用EL表达式
${varName}直接给自定义标签属性赋值 - 确保自定义标签的TLD配置中,目标属性的
rtexprvalue为true - 变量名要完全匹配,避免命名混淆
内容的提问来源于stack exchange,提问作者satvik ganamaneni
相关产品推荐
相关产品推荐

