1

我遇到了一个问题,试图找到关于如何避免在自定义标记处理程序中生成 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,但就像我上面所说的,我不想println()在我的 Java 标记处理程序中粘贴一堆调用。

感谢您的任何帮助和/或见解!

4

2 回答 2

0

Woot,我终于找到了一个更好的答案,我知道我必须忽略一些可能相对简单且相当明显的东西。还有另一个版本include()将布尔值作为第二个参数。 根据文档

如果 flush 为真,则在处理包含之前,此 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); }
}

这不仅更短更简单,而且意味着我不必将 buffer="none" 放入所有 JSP 页面指令中。如果其他人遇到这个问题和答案,我希望你觉得它有用,因为它确实给我带来了很多悲伤。:)

于 2012-07-17T03:15:06.503 回答
0

我找到答案,但我不知道这是否是最佳答案。我将 buffer="none" 插入到我的主 jsp 页面的页面指令中,现在辅助 jsp 页面位于它应该在的位置。同样,我不知道这是否是最好的答案,因为在我看来我应该能够缓冲页面。如果有人有更好的建议,我会把这个问题留几天。

于 2012-07-16T14:12:30.083 回答