在传递给JSP Tag Handler之前评估变量

时间:2009-04-24 20:19:54

标签: java jsp jsp-tags

当尝试使用自定义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> rtexprvaluetrue来配置属性,但都没有效果。有没有办法可以配置属性,以便在发送给Handler之前对其进行评估?或者我是否完全错了?

我对JSP标签比较新,所以我愿意接受解决这个问题的替代方案。另外,我意识到在JSP中使用scriptlet是不受欢迎的,但是我在这里使用了一些遗留代码,所以我现在有点困惑。

修改

我也尝试过:

false

也不起作用 - 只输出<foo:myTag myAttribute="something_${index}"/>

3 个答案:

答案 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}"/>