一尘不染

如何制作使用其他JSP标签的自定义JSP标签?

jsp

我想编写一个自定义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>标签的输出中呈现用户名。


阅读 361

收藏
2020-06-08

共1个答案

一尘不染

您可以将您的类分为一个标记类和一个tagRenderer类。

在您的情况下,将有两个新类称为CommentTagRendererUserTagRenderer

这是一个新的例子 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>");
}
2020-06-08