我正在使用 Apache POI 在 Java Servlet中 生成 Excel 文件。 __
getExcel()函数return HSSFWorkbook,我想发送给客户端。
getExcel()
HSSFWorkbook
HSSFWorkbook wb = getExcel();
到目前为止,这是我尝试过的。
//block1 ByteArrayOutputStream outByteStream = new ByteArrayOutputStream(); wb.write(outByteStream); byte [] outArray = outByteStream.toByteArray(); response.setContentType("application/ms-excel"); response.setContentLength(outArray.length); response.setHeader("Expires:", "0"); response.setHeader("Content-Disposition", "attachment; filename=Demo1.xls"); OutputStream outStream = response.getOutputStream(); outStream.write(outArray); outStream.flush(); //block2 request.setAttribute("Message", str1); request.setAttribute("MessageDetails", str2); request.getRequestDispatcher("/MyFile.jsp").forward(request, response);
上面的代码将excel文件发送到客户端,但是给了我一个例外:
java.lang.IllegalStateException: Cannot forward after response has been committed
如果我从上面的代码中删除block1或block2,那么它不会给出错误,但是我想发送客户端Excel file和我添加到request对象中的两个属性。
block1
block2
Excel file
request
那么可以使用发送Excel文件到客户端request.getRequestDispatcher吗?还是有更好的方法呢?
Excel
request.getRequestDispatcher
任何建议将不胜感激。
EDIT1 我知道为什么我收到了IllegalStateException,但后来我的问题是我应该如何发送ExcelFile和Request Attributes两到客户端?
IllegalStateException
ExcelFile
Request Attributes
Edit2 之所以要同时发送Excel file和发送Attributes给客户端,是因为其中MyFile.jsp有一个<div>将显示消息从发送servlet。
Attributes
MyFile.jsp
<div>
servlet
<div style="background-color: aliceblue"> <h3>${Message}</h3> </div>
Edit3 之所以要向客户端发送消息,是因为我将其发送Excel file为Import Excel operation客户端将excel file在数据库中插入数据的响应,然后强调excel rows由于重复或任何其他原因而无法插入的消息。因此,我想在“ Message到客户端”中显示“导入统计信息”,并向他提供excel文件的副本,并突出显示错误行。
Import Excel operation
excel file
excel rows
Message
您先冲洗response后再尝试冲洗forward。容器已经将其发送response回客户端,现在在如何forward向另一个JSP发送请求方面陷入了困境,因此它在抛出异常的途中中止了操作。HTTP是一个 请求-响应 模型。一旦你 要求 ,你得到一个 回应 。但是,一旦 响应 已经提交,整个交易就结束了。
response
forward
outStream.write(outArray); // you already committed the response here by flushing the output stream outStream.flush(); //block2 request.setAttribute("Message", str1); request.setAttribute("MessageDetails", str2); // this is illegal after you have already flushed the response request.getRequestDispatcher("/MyFile.jsp").forward(request, response);
根据Javadoc:
IllegalStateException-如果响应已经提交。
在EDIT1之后:
不,你不能两者都做。您需要决定想要什么。将字节写入响应设置正确的HEADERS和MIME- TYPE。您无法从相同的响应中获得浏览器下载内容以及显示JSP页面。