定制标签创建自定义标签

时间:2012-08-21 09:40:53

标签: jsp taglib custom-tag

我正在尝试创建一个使用其他自定义标记的自定义标记。

我的方法是这样的:

public int doAfterBody() throws JspTagException {
    BodyContent bc = getBodyContent();
    if (bc!=null) {
        String body = bc.getString().toUpperCase();
        try {
            bc.clearBody();
            bc.getEnclosingWriter().write("<some-other-custom-tag>");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return SKIP_BODY;
}

这似乎不起作用,因为我使用BodyContent编写的内容不再处理,因此JSP的输出仍然包含<some-other-custom-tag>。 有没有办法在输出结束之前处理输出?

编辑:我可能没有很好地说出我的问题。 (我想)我知道编译是如何工作的以及请求如何变成文档。

据我了解,编译器遍历我的JSP并找到<custom-tag>。它查看引用的TLD并找到与标记关联的Java类。它调用类,设置参数和东西,然后执行像doAfterBody()这样的方法(取决于类扩展的标记处理程序的类型)。从那里我将<some-other-custom-tag>写入JSP的输出。我知道这不起作用,因为编译器不会再查看它,因此没有意识到还有另一个自定义标签要处理。

我正在寻找一种方法:(1)让编译器再次处理(部分)输出,或者(2)让编译器处理包含<some-other-custom-tag>的String对象,这样我就可以写了那是输出。

当然,我也对任何替代解决方案持开放态度。

2 个答案:

答案 0 :(得分:1)

自定义标记的文本输出应该是文本,而不是浏览器可以理解的文本(HTML,JavaScript,CSS等)。

该内容永远不会被再次解析,因为它没有多大意义:当服务器知道它应该停止解析输出的内容并将其发送到浏览器?这样做的开销是多少?。

您可以做的是:无论如何,<some-other-custom-tag>所做的任何事情都是Java代码,因为JSP标记是Java类。我会重构标记类以扩展一个常见的抽象类,然后将其共享功能放在后者中,这样你的两个自定义标记都可以访问它。

答案 1 :(得分:0)

您错误地使用了自定义标记。您只需要在JSP页面上声明它。

您使用该方法输出的所有内容都将由浏览器处理jspWriter.write()浏览器处理。 JSP自定义标记由JSP编译器解析,并在服务器端转换为可执行的servlet。它应该在创建之前完成,并将最终数据发送给用户。

查看这些文章,以便更准确地了解问题:

The life cycle of a JSP page

Custom tags in JSP pages