JSP 异常错误:已为此响应调用getWriter()

hiz5n14c  于 2022-12-07  发布在  其他
关注(0)|答案(4)|浏览(243)

我使用GlassFish作为服务器,使用Netbeans IDE 8.0。下面是我的项目结构。

我的程序如何工作:
1.客户端打开本地主机:8080/Beer
1.她/他选择啤酒(在index.html中)

  1. it will POST to BeerSelect.java (BS for short)
  2. BS will call BeerExpert.java and then call result.jsp for finally send Test.jar to client
    下面是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();

错误代码:

vecaoik1

vecaoik11#

同时使用ServletRequest.getOutputStream()和ServletRequest.getWriter()是非法的。这个问题已经在这里详细回答了。
java.lang.IllegalStateException:已在使用输出流

hlswsv35

hlswsv352#

对于getOutputStream()方法,它在ServletResponse javadoc中是显式的:

  • 可以调用此方法或getWriter()来写入主体,但不能同时调用两者,除非调用了reset()。*

但我认为您没有显示相关代码,因为根据堆栈跟踪,错误发生在controller.BeerSelect.processRequest中的BeerSelect.java第83行。
根据您显示的内容,我无法猜测getOutputStream在哪里被调用,但错误显示它在哪里,因此您可以:

  • 或者找到调用它的位置并改用getWriter
  • 或者在BeerSelect.java中用getOutputStream替换getWriter
wnrlj8wa

wnrlj8wa3#

将您Test.jar移到WEB-INF文件夹中

7gcisfzg

7gcisfzg4#

您可能需要将test.jar移到项目的源文件夹中,以便可以访问它。

相关问题