定义自定义 JSP 标签

问题描述 投票:0回答:2

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

我的方法是这样的:

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 对象,以便我可以将其写入输出.

当然,我也愿意接受任何替代解决方案。

jsp taglib custom-tag
2个回答
1
投票

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

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

你可以做的是:无论如何,

<some-other-custom-tag>
所做的都是Java代码,因为JSP标签是Java类。我将重构标签类以扩展一个通用的抽象类,然后将其共享功能放在后者中,以便您的两个自定义标签都可以访问它。


0
投票

您错误地使用了自己的自定义标签。只需要在JSP页面声明即可。

您使用该方法输出的所有内容都将由浏览器处理

jspWriter.write()
将由浏览器处理。 JSP自定义标签由JSP编译器解析并转换为服务器端可执行的servlet。它应该在创建并将最终数据发送给用户之前完成。

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

JSP页面的生命周期

JSP页面中的自定义标签

© www.soinside.com 2019 - 2024. All rights reserved.