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

Servlet-java.lang.IllegalStateException:已为此响应调用getWriter(),java,jsp,servlets,inputstream,Java,Jsp,Servlets,Inputstream,我使用GlassFish作为服务器和Netbeans IDE 8.0 这是我的项目结构 我的程序如何工作: 客户端开放本地主机:8080/台 她/他选择一杯啤酒(在index.html中) 它将发布到BeerSelect.java(简称BS) BS将调用BeerExpert.java,然后调用result.jsp,以便最终将Test.jar发送到客户端 下面是BS中的重要代码 /* Result.jsp */ String c = request.getParameter("c

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

我的程序如何工作:

  • 客户端开放本地主机:8080/台
  • 她/他选择一杯啤酒(在index.html中)
  • 它将发布到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移动到项目的源文件夹中,以便可以访问它。

    在for方法
    getOutputStream()
    中明确指出:

    可以调用此方法或getWriter()来写入主体,而不是同时调用两者,除非调用了reset()

    但是我认为您没有显示相关的代码,因为根据stacktrace,错误发生在
    controller.BeerSelect.processRequest
    BeerSelect.java
    第83行

    根据您所展示的内容,我无法猜测调用了
    getOutputStream
    的位置,但错误表明调用了,因此您可以:

    • 找到调用它的位置并使用
      getWriter
    • 或者将
      BeerSelect.java
      中的
      getWriter
      替换为
      getOutputStream

    同时使用ServletRequest.getOutputStream()和ServletRequest.getWriter()是非法的。这里已经详细回答了这个问题