我试图找到this question关于如何避免在自定义标记处理程序中生成HTML的答案。就像这个提问者一样,我试图在我的标记处理程序中避免一堆println()
语句,我真的想从另一个.jsp文件中提取数据。
因此,我尝试了建议的方法:
public int doStartTag() throws JspException {
try {
pageContext.getResponse().flushBuffer();
pageContext.getRequest()
.getRequestDispatcher("/views/tags/loginBlock.jsp")
.include(pageContext.getRequest(), pageContext.getResponse());
} catch (Exception e) { throw new RuntimeException(e); }
return EVAL_BODY_INCLUDE;
}
然而,我得到的是loginBlock.jsp 上面的内容标签所在的jsp的输出,而不是像我预期的那样插入代替标签,甚至致电flushBuffer()
。
我有一个问题,我正试图得到答案,但谷歌的神今晚对我不好:
println()
调用标签处理程序。感谢您的帮助和/或见解!
答案 0 :(得分:0)
我找到一个答案,但我不知道这是否是最佳答案。我将buffer =“none”插入到我的主jsp页面的page指令中,现在辅助jsp页面符合预期。同样,我不知道它是否是最好的答案,因为在我看来我应该能够缓冲页面。如果有人有更好的建议,我会将问题保持开放几天。
答案 1 :(得分:0)
include()
,它将布尔值作为第二个参数。 According to the documentation:
如果flush为true,则在处理include之前,此JSP的当前JspWriter“out”将作为此调用的副作用刷新。否则,JspWriter“out”不会被刷新。
所以我上面的原始代码应该在一个扩展SimpleTagHandler的类中,而应该是这样的:
public void doTag() {
PageContext context = (PageContext)getJspContext();
try {
// The second parameter below (true) causes the JspWriter to be flushed
context.include("/views/tags/loginBlock.jsp", true);
} catch (Exception e) { throw new RuntimeException(e); }
}
这不仅更短更简单,而且意味着我不必在所有JSP页面指令中放置buffer =“none”。如果有其他人遇到这个问题和答案,我希望你觉得它有用,因为它确实给我带来了一堆悲伤。 :)