如何创建使用其他JSP标记的自定义JSP标记?

Max*_*y-B 11 jsp jsp-tags

我想编写一个自定义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;
    }   
}
Run Code Online (Sandbox Code Playgroud)

编辑:我的特定用例的一些背景,如果它有帮助.我有一个自定义标签<user>,它以对我的应用程序有用的方式动态呈现用户名(鼠标悬停在名字,姓氏,电话号码等).我现在正在编写另一个<comment>用于显示用户注释的标记,我想使用我现有的<user>标记在<comment>标记的输出中呈现用户名.

JB *_*zet 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.
Run Code Online (Sandbox Code Playgroud)

有关标记文件的更多信息,请访问:http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPTags5.html


san*_*den 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;
  }
Run Code Online (Sandbox Code Playgroud)

这是一个例子 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>");
}
Run Code Online (Sandbox Code Playgroud)