struts2报错: getWriter() has already been called for this response

来源:互联网 发布:维多利亚秘密 知乎 编辑:程序博客网 时间:2024/06/07 20:33

struts2报错: java.lang.IllegalStateException: getWriter() has already been called for this response

Struts2常报getWriter() has already been called for this response
这个异常。我们在操作各种IO流时,也很容易报这个异常,所以io流报错时,可以借鉴本文。

1.异常如下:

java.lang.IllegalStateException: getWriter() has already been called for this response    at org.apache.catalina.connector.Response.getOutputStream(Response.java:628)    at org.apache.catalina.connector.ResponseFacade.getOutputStream(ResponseFacade.java:196)    at com.wrt.action.order.EndOrderAction.exportInfo(EndOrderAction.java:143)    。。。。。。。。    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)

2.大致代码如下

public void exportInfo(){        try {            //web对象            HSSFWorkbook wb = new HSSFWorkbook();            //创建表头等            HSSFSheet sheet = wb.createSheet("test1");            //创建行            HSSFRow row = sheet.createRow(0);            //创建列            HSSFCell cell = row.createCell(0);            //**************省略excel创建部分..            HttpServletResponse response = ServletActionContext.getResponse();            OutputStream output = getRepsonse().getOutputStream();              response.reset();             response.setHeader("Content-disposition", "attachment; filename=details.xls");              response.setContentType("application/msexcel");                      wb.write(output);            output.close();            System.out.println("成功创建excel文件");        } catch (Exception e) {            e.printStackTrace();        }    }

3.解决方案:

将response.reset();放到OutputStream output = getRepsonse().getOutputStream()前面。

HttpServletResponse response= ServletActionContext.getResponse();            response.reset();             OutputStream output= getRepsonse().getOutputStream();              response.setHeader("Content-disposition", "attachment; filename=details.xls");              response.setContentType("application/msexcel");  

小结:应避免可能出现未关闭的getWriter(),使用了response.reset();进行刷新,而此时却在未刷新的情况下进行了OutputStream output = getRepsonse().getOutputStream();操作。

4.会出现如下异常的三种可能:
1.通过response.reset(); 刷新可能存在一些未关闭的getWriter().
2.struts2请求方法中返回了success此类会返回数据或者界面的返回值。举例如下:

public String saveSubmitOrder(){return "success";}//改成public String saveSubmitOrder(){return null;}

3.存在多个getWriter且未关闭状态,或者getWriter与OutputStream同时出现。

总之,一个请求过来只会有一个返回结果,如果存在两个或以上则会出现此异常.

阅读全文
0 0
原创粉丝点击