避免在Java自定义标记处理程序中生成html,第2部分

时间:2012-07-16 05:08:18

标签: java servlets jsp-tags

我试图找到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()

我有一个问题,我正试图得到答案,但谷歌的神今晚对我不好:

  1. 如果我需要从标记处理程序插入一个HTML块,这是最好的方法吗?
  2. 在原始答案中,海报使用经典标签处理程序。是否有某种方法可以使用简单的标记处理程序(即,在扩展SimpleTagSupport的类中)来实现它?
  3. 即使上面提到的问题中的提问者接受了答案,我也无法复制成功的结果。我错过了提问者接受的一些我要离开的东西吗?
  4. 我是否只是以某种方式离开这里,我甚至都不知道?我对整个jsp / servlets事情都不熟悉,我并不是100%肯定这个设计模式是我应该使用的。我基本上试图设计调用后端Java的jsp文件来执行一些业务逻辑并生成结果HTML,但就像我上面所说的那样,我不想在我的Java中粘贴一堆println()调用标签处理程序。
  5. 感谢您的帮助和/或见解!

2 个答案:

答案 0 :(得分:0)

我找到一个答案,但我不知道这是否是最佳答案。我将buffer =“none”插入到我的主jsp页面的page指令中,现在辅助jsp页面符合预期。同样,我不知道它是否是最好的答案,因为在我看来我应该能够缓冲页面。如果有人有更好的建议,我会将问题保持开放几天。

答案 1 :(得分:0)

Woot,我终于找到了一个更好的答案,而我知道我必须忽略一些可能相对简单且相当明显的东西。还有另一个版本的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”。如果有其他人遇到这个问题和答案,我希望你觉得它有用,因为它确实给我带来了一堆悲伤。 :)