Servlet - java.lang.IllegalStateException: 已经为此响应调用了 getWriter()
Servlet - java.lang.IllegalStateException: getWriter() has already been called for this response
我使用 GlassFish 作为服务器和 Netbeans IDE 8.0
这是我的项目结构。
我的程序如何工作:
- 客户端打开localhost:8080/啤酒
- she/he 选择啤酒(在 index.html 中)
- 会POST到BeerSelect.java(简称BS)
- BS 将调用 BeerExpert.java 然后调用 result.jsp 最后将 Test.jar 发送给客户端
这是BS中的重要代码。
/* Result.jsp */
String c = request.getParameter("color");
BeerExpert be = new BeerExpert();
List result = be.getBrands(c);
request.setAttribute("styles", result);
RequestDispatcher view = request.getRequestDispatcher("result.jsp");
view.forward(request, response);
/* Test Client Download */
response.setContentType("application/jar");
ServletContext ctx = getServletContext();
InputStream is = ctx.getResourceAsStream("/Test.jar");
int read = 0;
byte[] bytes = new byte[1024];
OutputStream os = response.getOutputStream();
while ((read = is.read(bytes)) != -1){
os.write(bytes, 0, read);
}
os.flush();
错误:
将您的 Test.jar 移动到 WEB-INF 文件夹中。
您可能需要将 test.jar 移动到项目的源文件夹中,以便可以访问它。
方法 getOutputStream()
的 ServletResponse
javadoc 中是明确的:
可以调用此方法或 getWriter() 来写入正文,但不能同时调用两者,除非已调用 reset()。
但我认为您没有显示相关代码,因为根据堆栈跟踪,错误发生在 controller.BeerSelect.processRequest
,第 83 行 BeerSelect.java
。
根据你显示的内容,我猜不出 getOutputStream
在哪里被调用,但错误说是,所以你可以:
- 要么找到它被调用的地方,然后改用
getWriter
- 或在
BeerSelect.java
中用getOutputStream
替换getWriter
。
同时使用 ServletRequest.getOutputStream() 和 ServletRequest.getWriter() 是非法的。此处已对此进行了详细解答。
java.lang.IllegalStateException: Already using output stream
我使用 GlassFish 作为服务器和 Netbeans IDE 8.0 这是我的项目结构。
我的程序如何工作:
- 客户端打开localhost:8080/啤酒
- she/he 选择啤酒(在 index.html 中)
- 会POST到BeerSelect.java(简称BS)
- BS 将调用 BeerExpert.java 然后调用 result.jsp 最后将 Test.jar 发送给客户端
这是BS中的重要代码。
/* Result.jsp */
String c = request.getParameter("color");
BeerExpert be = new BeerExpert();
List result = be.getBrands(c);
request.setAttribute("styles", result);
RequestDispatcher view = request.getRequestDispatcher("result.jsp");
view.forward(request, response);
/* Test Client Download */
response.setContentType("application/jar");
ServletContext ctx = getServletContext();
InputStream is = ctx.getResourceAsStream("/Test.jar");
int read = 0;
byte[] bytes = new byte[1024];
OutputStream os = response.getOutputStream();
while ((read = is.read(bytes)) != -1){
os.write(bytes, 0, read);
}
os.flush();
错误:
将您的 Test.jar 移动到 WEB-INF 文件夹中。
您可能需要将 test.jar 移动到项目的源文件夹中,以便可以访问它。
方法 getOutputStream()
的 ServletResponse
javadoc 中是明确的:
可以调用此方法或 getWriter() 来写入正文,但不能同时调用两者,除非已调用 reset()。
但我认为您没有显示相关代码,因为根据堆栈跟踪,错误发生在 controller.BeerSelect.processRequest
,第 83 行 BeerSelect.java
。
根据你显示的内容,我猜不出 getOutputStream
在哪里被调用,但错误说是,所以你可以:
- 要么找到它被调用的地方,然后改用
getWriter
- 或在
BeerSelect.java
中用getOutputStream
替换getWriter
。
同时使用 ServletRequest.getOutputStream() 和 ServletRequest.getWriter() 是非法的。此处已对此进行了详细解答。
java.lang.IllegalStateException: Already using output stream