一尘不染

使用Java Servlet将Excel文件发送到客户端

jsp

我正在使用 Apache POIJava Servlet中 生成 Excel 文件。 __

getExcel()函数return 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

如果我从上面的代码中删除block1block2,那么它不会给出错误,但是我想发送客户端Excel file和我添加到request对象中的两个属性。

那么可以使用发送Excel文件到客户端request.getRequestDispatcher吗?还是有更好的方法呢?

任何建议将不胜感激。

EDIT1
我知道为什么我收到了IllegalStateException,但后来我的问题是我应该如何发送ExcelFileRequest Attributes两到客户端?

Edit2
之所以要同时发送Excel file和发送Attributes给客户端,是因为其中MyFile.jsp有一个<div>将显示消息从发送servlet

<div style="background-color: aliceblue">
    <h3>${Message}</h3>
</div>

Edit3
之所以要向客户端发送消息,是因为我将其发送Excel fileImport Excel operation客户端将excel file在数据库中插入数据的响应,然后强调excel rows由于重复或任何其他原因而无法插入的消息。因此,我想在“
Message到客户端”中显示“导入统计信息”,并向他提供excel文件的副本,并突出显示错误行。


阅读 333

收藏
2020-06-08

共1个答案

一尘不染

您先冲洗response后再尝试冲洗forward。容器已经将其发送response回客户端,现在在如何forward向另一个JSP发送请求方面陷入了困境,因此它在抛出异常的途中中止了操作。HTTP是一个
请求-响应 模型。一旦你 要求 ,你得到一个 回应 。但是,一旦 响应 已经提交,整个交易就结束了。

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页面。

2020-06-08