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

时间:2015-07-05 05:51:50

标签: java jsp servlets inputstream

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

enter image description here

我的计划如何运作:

  1. 客户端打开localhost:8080 / Beer
  2. 她/他选择啤酒(在index.html中)
  3. 它将POST到BeerSelect.java(简称BS)
  4. BS将调用BeerExpert.java然后调用result.jsp以最终将Test.jar发送到客户端
  5. 以下是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();
    

    错误: enter image description here

4 个答案:

答案 0 :(得分:5)

同时使用ServletRequest.getOutputStream()和ServletRequest.getWriter()是非法的。这里已经详细解答了这一点。

java.lang.IllegalStateException: Already using output stream

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

方法getOutputStream()的{​​{3}}中明确指出:

除非调用reset(),否则可以调用此方法或getWriter()来编写正文,而不是两者。

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

根据你所展示的内容,我无法猜出getOutputStream被调用的地方,但是错误说它是,所以你可以:

  • 要么找到它的调用位置,请使用getWriter代替
  • 或将getWriter替换为getOutputStream中的BeerSelect.java