JSP导入文件

时间:2011-03-03 02:24:29

标签: java jsp

美好的一天!

运行我的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 文件夹中。我怎样才能使它工作?我还需要进口吗?谢谢。

4 个答案:

答案 0 :(得分:4)

不要使用 scriptlet (那些<% %>事物)。 JSP是HTML的模板技术。对于HTML,您不需要所有那些讨厌的out.println()事物。只需在JSP中编写HTML plain即可。

所以,而不是

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

只是做

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

(请注意,这会导致HTML无效,HTML页面中只应有一个<html>标记,<title>中只有一个<head>,但这是不同的问题,w3 HTML validator应该提供很多提示和答案,也可以通过一些HTML教程来解决。


JSP提供EL(表达式语言,那些${ }个东西)来访问后端数据,即在pagerequest,{{session中作为属性存在的数据1}}和application范围。可以使用属性名称访问它。

所以,而不是

<%
    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还提供<jsp:include>标记以包含页面片段。

所以,而不是

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

使用

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

(并将其重命名为.jsp

异常将消失。


另见:


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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

其次,普通的旧JSP有点旧 - 建议最近使用JSF / facelets /等。

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

我能想到的最简单的修复:而不是根据结果尝试条件包含,只需重定向到不同的页面。

答案 3 :(得分:1)

你不能使用

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

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

所以删除out.println()form else。