2011-11-01 91 views
10

我想编写一个自定义JSP标记,其输出包含其他JSP标记,本身也应该进行动态评估。但显然,我的TagSupport子类写入pageContext.getOut()的所有内容都直接传送给客户端,无需进一步评估。如何制作使用其他JSP标签的自定义JSP标签?

我有一种感觉,这应该是非常简单的,因为它似乎是人们想要使用自定义标签的第一件事情之一:封装和重复使用其他自定义标签,避免代码重复。

如何使下面的代码做它显然想办?:

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

这应有助于:http://stackoverflow.com/问题/ 2502282/custom-jsp-tag-how-do-i-get-the-body-of-the-tag –

回答

5

你可以将你的课程分成标签类和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>"); 
} 
+0

我最终做了类似的事情 - 一个getHTML()方法,标签本身用于生成其输出,以及哪些其他标签可以用来将相同的输出嵌入到自己的输出中。我想很高兴知道没有其他方法(没有进入标签文件)。 –

14

最简单的方法是写你的custome标签作为一个JSP标记文件,而一个例子比在Java中。这样,新标签可以轻松使用其他自定义标签。创建/ WEB-INF /标签文件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

+0

这是很好的知道,但我忽略了在我的问题中提到在我的特殊情况下使用标记文件不是一个选项(我实际上将功能添加到一个大的,预先存在的项目,必须运行在一个较旧的没有标签文件支持的JDK)。不过,我会为你投票,因为这是一个有效的解决方案! –