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