我想延迟自定义标签的输出。
原因是:我想在文档头部添加一个标签,该标签将编译样式和脚本列表以包含在页面中。页面中的后续标签将添加到元素列表中,并且在生成页面主体后将打印该列表。
这是可能的还是有更好的方法来做到这一点。(我不想知道在页面编译期间要添加哪些链接。)
谢谢
使用JSPContext pushBody()
,popBody()
您可以对输出顺序进行一些控制。
<%
Writer body = new StringWriter();
out = pageContext.pushBody(body);
// following code will write to 'body' and not to client
%>
...
<%
out = pageContext.popBody();
// normal output again
%>
...
<% // write the captured output %>
<%= body %>
即使它有效,也可能更好地解决,因为它非常令人困惑。
我在各种网站上问过这个问题,但没有得到我想要的答案(尽管有些很有创意,谢谢!)所以我最终自己做了很多研究,以寻找“最好”的方法做这个。这就是我想出的:
我创建了三个自定义标签,因此我的 html 如下所示:
<html:page>
<html:head>
...
</html:head>
<html:body>
...
</html:body>
</html:page>
页面标记在 doStartTag() 方法中的 REQUEST_SCOPE 中创建一个名为“headercontents”的变量,该变量可以编译我想要放置在文档头部的输出列表。
head 元素只是简单地将其所有正文内容添加到此变量中。
body 元素现在什么都不做,只有一个带有简单 .
正文中的任何元素现在都可以使用“headercontents”变量将信息发布到 html 页面的头部。(因此在头部而不是正文中链接它需要的任何样式表或脚本)。
然后最后在页面标签的 doEndTag() 方法中打印“headercontents”变量的内容,然后打印自身的内容(html:body 标签的内容)。
结果是文档可以根据需要自行加载和重新排列。这仍然是一个初级版本,但我会完善它并在将来的某个时候发布源代码。