【问题标题】:How can I make a custom JSP tag that uses other JSP tags?如何制作使用其他 JSP 标记的自定义 JSP 标记?
【发布时间】:2011-11-01 19:15:04
【问题描述】:

我想编写一个自定义 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;
    }   
}

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

【问题讨论】:

标签: jsp jsp-tags


【解决方案1】:

最简单的方法是将您的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

【讨论】:

  • 很高兴知道这一点,尽管我忽略了在我的问题中提到在我的特定情况下使用标签文件不是一个选项(我实际上是在向一个大型的、预先存在的项目添加功能必须在不支持标记文件的旧 JDK 上运行)。不过,我会给你投票,因为这通常是一个有效的解决方案!
【解决方案2】:

您可以将您的类拆分为一个标签类和一个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>");
}

【讨论】:

  • 我最终做了类似的事情——一个 getHTML() 方法,标签本身用来生成它的输出,其他标签可以用它来将相同的输出嵌入到它们自己的输出中。我想很高兴知道真的没有其他方法(不进入标签文件)。
猜你喜欢
  • 2015-01-27
  • 2011-04-16
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多