当尝试使用自定义JSP标记库时,我在JSP中定义了一个变量,我想在传递给标记库之前对其进行评估。但是,我似乎无法让它发挥作用。这是我的JSP的简化版本:
<% int index = 8; %>
<foo:myTag myAttribute="something_<%= index %>"/>
我doStartTag()
的{{1}}方法使用pageContext的输出流根据输入的属性进行写入:
TagHandler
但是,我在最终标记中看到的输出是:
public int doStartTag() {
...
out.println("Foo: " + this.myAttribute);
}
而不是我想要的:
Foo: something_<%= index %>
我对该属性的标记库定义是:
Foo: something_8
我尝试使用<attribute>
<name>myAttribute</name>
<required>true</required>
</attribute>
rtexprvalue
和true
来配置属性,但都没有效果。有没有办法可以配置属性,以便在发送给Handler之前对其进行评估?或者我是否完全错了?
我对JSP标签比较新,所以我愿意接受解决这个问题的替代方案。另外,我意识到在JSP中使用scriptlet是不受欢迎的,但是我在这里使用了一些遗留代码,所以我现在有点困惑。
修改
我也尝试过:
false
也不起作用 - 只输出<foo:myTag myAttribute="something_${index}"/>
。
答案 0 :(得分:6)
我不相信您可以在自定义标记中的属性中使用<%= ... %>
,除非您的<%= ... %>
是属性值的全部内容。以下是否适用于您?
<% int index = 8; %>
<% String attribValue = "something_" + index; %>
<foo:myTag myAttribute="<%= attribValue %>"/>
编辑:我相信自定义标记属性中的<% ... %>
只能包含变量名称。不是任何Java表达式。
答案 1 :(得分:2)
为了使您的JSP代码保持干净整洁,请尽可能避免编写脚本。我认为这是首选方式:
<foo:myTag >
<jsp:attribute name="myAttribute">
something_${index}
</jsp:attribute>
</foo:myTag >
如果您的代码还包含正文,则必须从
进行更改<foo:myTag myAttribute="<%= attribValue %>">
body
</foo:myTag >
到
<foo:myTag >
<jsp:attribute name="myAttribute">
something_${index}
</jsp:attribute>
<jsp:body>
body
</jsp:body>
</foo:myTag >
答案 2 :(得分:0)
<foo:myTag myAttribute="something_${index}"/>