Servlet - java.lang.IllegalStateException: 已经为此响应调用了 getWriter()

新手上路,请多包涵

我使用 GlassFish 作为服务器和 Netbeans IDE 8.0 这是我的项目结构。

在此处输入图像描述

我的程序是如何工作的:

  1. 客户端打开 localhost:8080/Beer
  2. 她/他选择了一种啤酒(在 index.html 中)
  3. 它将 POST 到 BeerSelect.java(简称 BS)
  4. 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();

错误:在此处输入图像描述

原文由 Altiano Gerung 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

在 --- 方法的 ServletResponse getOutputStream()

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

但我认为你没有显示相关代码,因为根据堆栈跟踪,错误发生在 controller.BeerSelect.processRequest ,在 BeerSelect.java 第 83 行。

根据您展示的内容,我猜不出 getOutputStream 被调用的位置,但错误提示是这样的,因此您可以:

  • 要么找到调用它的位置并使用 getWriter 代替
  • 或将 getWriter 替换为 getOutputStreamBeerSelect.java

原文由 Serge Ballesta 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题