【发布时间】:2011-06-02 09:36:32
【问题描述】:
我正在尝试创建一个仅在标签内可用的 el 变量,以便它类似于:
<mytaglib:mytag>
Foo is ${foo}
</mytaglib:mytag>
我已经按照我可以找到的创建嵌套 el 变量的文档进行操作,但是,${foo} 在 mytag 结束后可用。
.tld 文件的缩短版本是:
<?xml version="1.0" encoding="UTF-8" ?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
<description>My Tags</description>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>mytaglib</short-name>
<uri>http://www.example.com/taglibs/mytaglib</uri>
<tag>
<name>mytag</name>
<tag-class>com.example.tags.MyTag</tag-class>
<body-content>JSP</body-content>
<variable>
<name-given>used</name-given>
<variable-class>java.lang.String</variable-class>
<scope>NESTED</scope>
</variable>
</tag>
</taglib>
然后 MyTag 执行以下操作(我已删除所有不应相关的代码):
public class MyTag extends BodyTagSupport
{
// these are subtags
private JspFragment below;
private JspFragment at;
@Override
public int doStartTag() throws JspException
{
return EVAL_BODY_BUFFERED;
}
@Override
public int doEndTag() throws JspException
{
try
{
if (aBoolean)
{
below.invoke(pageContext.getOut());
}
else
{
at.invoke(pageContext.getOut());
}
}
catch (IOException e)
{
throw new JspException(e);
}
return EVAL_PAGE;
}
@Override
public void doInitBody() throws JspException
{
pageContext.setAttribute("used", "valueOfUsed");
}
@Override
public int doAfterBody() throws JspException
{
try
{
bodyContent.writeOut(bodyContent.getEnclosingWriter());
}
catch (IOException e)
{
throw new JspException(e);
}
return SKIP_BODY;
}
}
我的理解是 doInitBody 中的 pageContext.setAttribute() 应该在嵌套范围内,并且您在 doAfterBody 中评估实际正文。 尽管“已使用”在标签范围之外可用,但似乎应该是这种情况。
一般背景...标签看起来像(简化形式)
<mytaglib:mytag>
Used is ${used}
</mytaglib:mytag>
或
<mytaglib:mytag>
<mytaglib:at>
You are at your limit, you have used: ${used}
</mytaglib:at>
<mytaglib:below>
You are below your limit, you have used: ${used}
</mytaglib:below>
</mytaglib:mytag>
如何将 ${used} 限定为 mytag?
【问题讨论】:
-
您的问题令人困惑。
${foo}不是脚本变量。那是<% String foo = "something"; %>。那些${}的东西被称为EL(表达语言),另见stackoverflow.com/tags/el/info -
java.sun.com/products/jsp/syntax/2.0/syntaxref2013.html 似乎也将 EL 称为“脚本变量”。我正在更新问题以使其更清楚。您知道如何将 EL 变量限定为 NESTED 吗?