美好的一天!
运行我的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 文件夹中。我怎样才能使它工作?我还需要进口吗?谢谢。
答案 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(表达式语言,那些${ }
个东西)来访问后端数据,即在page
,request
,{{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。