【问题标题】:Using <jsp:include> to make a servlet call that returns additional <jsp:include>'s, but they're not being rendered使用 <jsp:include> 进行 servlet 调用,返回额外的 <jsp:include>,但它们没有被渲染
【发布时间】:2011-11-23 02:38:13
【问题描述】:

所以这个问题建议在执行包含之前使用 servlet 进行文件检查: How can you check if a file exists before including/importing it in JSP?

所以我写了一个 servlet 来做这件事。我用类似的东西来称呼它

<jsp:include page='<%= "/servlet/fileChecker?section=THX&file=1138" &>'></jsp:include>

但是该 servlet 调用的输出包含一个 jsp:include 标记,指向我正在检查的文件。不幸的是,浏览器没有“包含”它。我收到诸如“没有属性 'page'”和“element 'jsp:include' undefined”之类的错误——这表明 servlet 输出没有被呈现为 Java,而是呈现为 HTML。

这是输出:

<p>Text before the servlet call</p>
    <p><h4>From THX1138</h4><jsp:include page='thx/results_1138.jsp'></jsp:include></p>
<p>Text after the servlet call</p>

这是我的 servlet 的主要调用:

private String FileChecker(String section, String file) {
    String result = ""; // assume file does not exist

    String pathToCheck = section + "/results_" + file + ".jsp";
    // realPath is defined in the init() method as config.getServletContext().getRealPath("/");
    File fileToCheck = new File(realPath + pathToCheck);
    if (fileToCheck.exists()) {
        result = "<p><h4>" + section + "</h4><jsp:include page='" + pathToCheck + "'></jsp:include></p>";
    }

    return result;
}

我觉得答案很接近,但我不确定我应该在后面看什么窗帘。有什么帮助吗?

【问题讨论】:

  • jsp:... 标签不包含在浏览器中,它们在服务器上被解释。浏览器只理解 HTML。你的fileChecker 怎么样?
  • 这样不行。 filechecker 的输出不会再被解释。能否请您出示filechecker或其相关部分的代码?
  • 离题:停止使用原始 servlet。使用诸如 struts、tile、spring-mvc、jsf 之类的东西。
  • @DwB:嗯——如果没有理由需要一个大框架,不要使用。 Servlet 只要不被滥用就可以,就像其他任何东西一样。无论如何,此功能都可以包含在基于 JSP 的自定义标记中。

标签: java jsp servlets


【解决方案1】:

不要将带有一堆 HTML 和 JSP 标记的字符串写入响应。这是没有意义的。浏览器不理解 JSP 标签。

请致电RequestDispatcher#include()

request.getRequestDispatcher(checkedJspPath).include(request, response);

然后将该 HTML 移回 JSP。


与具体问题无关,我知道您指的是我的旧答案,但我意识到实际上最好检查 ServletContext#getResource() 是否不返回 null而不是使用File#exists()。这样,只要 WAR 没有展开,它也能正常工作。

【讨论】:

  • 感谢您的回复。我可以使用 RequestDispatcher 但除了包含之外还有其他 HTML 标记(简单的

    标记)吗?

  • 是的,您可以在include() 调用之前和之后将其写入响应。然而,这不是最佳做法。 HTML 不属于 servlet。考虑另一个包含该 HTML 的包装包含 JSP 文件。
  • 再次感谢。我将阅读 RequestDispatcher 并尝试一下。 (您可能会说我以前从未使用过它。)非常感谢!
猜你喜欢
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 2020-08-17
  • 2012-07-25
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
相关资源
最近更新 更多