【问题标题】:JSP importing a fileJSP 导入文件
【发布时间】:2011-03-03 02:24:29
【问题描述】:

美好的一天!

我在运行我的 JSP 程序时遇到了以下错误。

java.lang.IllegalStateException: PWC3991: getOutputStream() has already been called for this response

似乎我的 JSP 中的 html 文件不起作用。 我的代码如下:

<%@page import  = "java.util.*"%>
<%@page import  = "javax.servlet.*"%>
<%@page import  = "javax.servlet.http.*"%>
<%@page import= "session.*" %>


<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>JSP Page</title>
        </head>
        <body>
            <%
            Item item = (Item) request.getAttribute("invenItem");

            if (item != null) {
                out.println("<html><title>Inventory Item</title>");
                out.println("<body><h1>Inventory Item Details:</h1>");
                out.println("Stock ID  : " + item.getStockID() + "<br/>");
                out.println("Name      : " + item.getItemName() + "<br/>");
                out.println("Unit Price: " + item.getUnitPrice() + "<br/>");
                out.println("On Stock  : " + item.getOnStock() + "<br/>");
                out.println("</body>");
                out.println("</html>");
            } else {
                RequestDispatcher rd = request.getRequestDispatcher("DataForm.html"); //NOT WORKING
                rd.include(request, response);

                out.println("<br>Item not found...<br>");

                rd = request.getRequestDispatcher("ItemEntry.html"); //NOT WORKING
                rd.include(request, response);
            }
            %>
        </body>
    </html>

我的 html 文件位于文件夹 WEB-INF 内。我怎样才能让它工作?我也需要导入吗?谢谢。

【问题讨论】:

  • request.getRequestDispatcher("/WEB-INF/DataForm.html").include(request, response)

标签: java jsp


【解决方案1】:

不要使用 scriptlets(那些 &lt;% %&gt; 的东西)。 JSP 是 HTML 的模板技术。对于 HTML,您不需要所有那些讨厌的 out.println() 东西。只需在 JSP 中编写纯 HTML。

所以,而不是

<%
    out.println("<html><title>Inventory Item</title>");
%>

只是做

<html><title>Inventory Item</title>

(请注意,这会导致 HTML 无效,HTML 页面中应该只有一个 &lt;html&gt; 标记,&lt;head&gt; 中只有一个 &lt;title&gt;,但这是另一个问题,w3 HTML validator应该给出很多提示和答案,也让自己通过一些HTML教程)


JSP 提供EL(表达式语言,那些${ } 事物)来访问后端数据,即作为属性存在于pagerequestsessionapplication 范围内的数据。可以使用属性名访问。

所以,而不是

<%
    Item item = (Item) request.getAttribute("invenItem");
%>

使用

${invenItem}

而不是

<%
    out.println("Stock ID  : " + item.getStockID() + "<br/>");
%>

使用

Stock ID: ${invenItem.stockID}<br/>

JSP 还提供像JSTL 这样的标记库来控制页面流和输出。

所以,而不是

<%
    if (item != null) {

    } else {

    }
%>

使用

<c:choose>
    <c:when test="${invenItem != null}">

    </c:when>
    <c:otherwise>

    </c:otherwise>
</c:choose>

JSP 还提供&lt;jsp:include&gt; 标签来包含页面片段。

所以,而不是

<%
    RequestDispatcher rd = request.getRequestDispatcher("DataForm.html"); //NOT WORKING
    rd.include(request, response);
%>

使用

<jsp:include page="/WEB-INF/DataForm.jsp" />

(并将其重命名为.jsp

并且异常会消失。


另见:


与具体问题无关,此答案中的几乎所有链接都已在您之前的问题中(间接)直接提供给您。认真对待他们。要成为一名出色的程序员(正如您在问题/评论中所说的那样),请花一些时间来浏览这些链接(以及链接中的链接)。

【讨论】:

  • 好的。再次感谢 BalusC 先生!我正在按照您的建议学习 jsp(EL、Javabeans 等)... :)
【解决方案2】:

首先,尽量避免将代码放到您的 JSP 页面上 - 它违反了作为 JSP 核心部分的 MVC/关注点分离范式。

第二,普通的旧 JSP 有点老了 - 现在建议使用 JSF/facelets/etc。

至于您的实际问题,我对您使用的技术并不完全熟悉,但例外情况基本上意味着您尝试在您能够发送的最新时间点之后发送内容(通常是在发送标题)。在这种情况下,我认为发生的情况是,当您要求它发送不同的页面时,您已经开始发送当前页面。

我能想到的最简单的解决方法:与其尝试基于结果的条件包含,不如重定向到不同的页面。

【讨论】:

  • 怎么样?你能给我举个例子吗?谢谢
  • 这毫无意义。该代码中没有重定向 - 只有一个 include()。
  • “尝试在您能够发送的最新点之后发送内容(通常是在发送标头之后)” - 你已经倒退了。服务器首先发送 HTTP 标头,然后是内容。
  • @Mike:我的措辞似乎有点不清楚。再读一遍:我从来没有说过在发布的代码中有重定向,只是试图发送一个页面而不是最初指定的页面。我只是建议为结果显示不同的页面可能是更好的方法。而且,很明显,标题首先发送 - 否则它们将被称为“页脚”。我所说的是,一旦发送了一个页面的标题,您就不能决定开始发送不同的页面。
【解决方案3】:

该错误表示一旦在jsp中将某些内容打印到输出流(甚至包括doctype声明),就无法调用错误代码行

因此,您可以尝试将这些代码放在页面顶部。

【讨论】:

    【解决方案4】:

    你不能用

    out.print() 和 Requestdispatcher 同时......

    这意味着在执行 out.print() 之后,不应该执行任何带有 requestdispatcher.forward() 的语句......

    所以从 else 块中删除 out.println()。

    【讨论】:

      猜你喜欢
      • 2011-02-26
      • 2017-04-29
      • 1970-01-01
      • 2017-04-10
      • 2013-05-27
      • 2012-05-31
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多