我想编写一个自定义JSP标记,其输出包含其他JSP标记,这些标记本身也应该被动态评估。但显然我的TagSupport
子类写入pageContext.getOut()
的所有内容都直接发送给客户端而没有任何进一步的评估。
我觉得这应该非常简单,因为它似乎是人们想要使用自定义标签的第一件事:封装和重用其他自定义标签,避免代码重复。
如何让以下代码执行它显然想做的事情?:
public class MyTag extends TagSupport {
public int doStartTag() throws JspException {
try {
pageContext.getOut().println(
"The output from this tag includes other tags " +
"like <mypackage:myOtherTag>this one</mypackage:myOtherTag> " +
"which should themselves be evaluated and rendered."
)
} catch (IOException e) {
throw new JspException(e);
}
return SKIP_BODY;
}
}
编辑:我的特定用例的一些背景,如果它有帮助。我有一个自定义标记<user>
,它以对我的应用程序有用的方式动态呈现用户名(鼠标悬停在名字,姓氏,电话号码等)。我现在正在编写另一个标记<comment>
来显示用户评论,我想使用现有的<user>
标记在<comment>
标记的输出中呈现用户名。
答案 0 :(得分:15)
最简单的方法是将您的custome标记编写为JSP标记文件,而不是Java。这样,新标记可以轻松使用其他自定义标记。在/ WEB-INF / tags中创建一个文件myTag.tag,并使用以下代码:
<%@ tag %>
<%@ attribute name="value" required="true" rtexprvalue="true" type="java.lang.String"%>
<%@ taglib prefix="mypackage" uri="mypackage.tld" %>
The output from this tag includes other tags
like <mypackage:myOtherTag>${value}</mypackage:myOtherTag>
which should themselves be evaluated and rendered.
有关标记文件的更多信息,请访问:http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPTags5.html
答案 1 :(得分:5)
您可以将类拆分为标记类和tagRenderer
类。
在您的情况下,会有两个名为CommentTagRenderer
和UserTagRenderer
的新类。
以下是新CommentTag
public int doStartTag() throws JspException {
JspWriter out = pageContext.getOut();
Comment comment = getComment();
User user = getUser();
CommentTagRenderer commentRenderer = new CommentTagRenderer(out);
UserTagRenderer userRenderer = new UserTagRenderer(out);
try {
commentRenderer.renderComment(comment);
userRenderer.renderUser(user);
} catch (IOException e) {
//some error handling
}
return SKIP_BODY;
}
以下是CommentTagRenderer
private Writer out;
public CommentTagRenderer(Writer out) {
this.out = out;
}
public void renderComment(Comment comment) throws IOException {
out.write("<div>");
out.write(comment.getComment());
out.write("</div>");
}