我正在尝试创建一个使用其他自定义标签的自定义 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 对象,以便我可以将其写入输出.
当然,我也愿意接受任何替代解决方案。
自定义标签输出的文本应该是浏览器可以理解的文本(HTML、JavaScript、CSS 等)。
该内容永远不会再次被解析,因为它没有太大意义:当服务器知道它应该停止解析输出的内容并将其发送到浏览器时?这样做的开销是多少?.
你可以做的是:无论如何,
<some-other-custom-tag>
所做的都是Java代码,因为JSP标签是Java类。我将重构标签类以扩展一个通用的抽象类,然后将其共享功能放在后者中,以便您的两个自定义标签都可以访问它。
您错误地使用了自己的自定义标签。只需要在JSP页面声明即可。
您使用该方法输出的所有内容都将由浏览器处理
jspWriter.write()
将由浏览器处理。 JSP自定义标签由JSP编译器解析并转换为服务器端可执行的servlet。它应该在创建并将最终数据发送给用户之前完成。
查看这些文章以更准确地了解问题: