JSP导入文件

美好的一天!

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

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

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

          JSP Page   <% Item item = (Item) request.getAttribute("invenItem"); if (item != null) { out.println("Inventory Item"); out.println("

Inventory Item Details:

"); out.println("Stock ID : " + item.getStockID() + "
"); out.println("Name : " + item.getItemName() + "
"); out.println("Unit Price: " + item.getUnitPrice() + "
"); out.println("On Stock : " + item.getOnStock() + "
"); out.println(""); out.println(""); } else { RequestDispatcher rd = request.getRequestDispatcher("DataForm.html"); //NOT WORKING rd.include(request, response); out.println("
Item not found...
"); rd = request.getRequestDispatcher("ItemEntry.html"); //NOT WORKING rd.include(request, response); } %>

我的html文件位于WEB-INF文件夹中。 我怎样才能使它工作? 我还需要import吗? 谢谢。

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

所以,而不是

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

做就是了

 Inventory Item 

(请注意,这会导致HTML无效,HTML页面中只应有一个标记,而只有一个 ,但这是一个不同的问题, w3 HTMLvalidation器应该提供很多提示和答案,也可以通过一些HTML教程)


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

所以,而不是

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

使用

 ${invenItem} 

而不是

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

使用

 Stock ID: ${invenItem.stockID}

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

所以,而不是

 <% if (item != null) { } else { } %> 

使用

       

JSP还提供标记以包含页面片段。

所以,而不是

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

使用

  

(并将其重命名为.jsp

而exception将消失。


也可以看看:

  • JSP标记信息页面
  • 如何避免JSP文件中的Java代码?
  • Java Web开发,我需要哪些技能?

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

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

其次,普通的旧JSP有点陈旧 – 现在推荐使用JSF / facelets / etc。

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

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

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

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

你不能用

out.print()和Requestdispatcher同时….

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

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