2

我正在使用Apache POI在Java Servlets中生成Excel文件。

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

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

那么可以Excel使用 向客户端发送文件request.getRequestDispatcher吗?或者有没有更好的方法来做到这一点?

任何建议将不胜感激。

Edit1
我知道为什么我会收到IllegalStateException,但是我的问题是我应该如何发送ExcelFile和发送Request Attributes给客户?

Edit2
我想同时发送Excel file和发送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 文件副本。

4

1 回答 1

2

你正在冲洗你的response然后试图forward。Container 已经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 页面。

于 2013-07-05T14:48:40.250 回答