使用java servlet将excel文件发送到客户端

使用java servlet将excel文件发送到客户端,java,jsp,servlets,apache-poi,export-to-excel,Java,Jsp,Servlets,Apache Poi,Export To Excel,我使用ApachePOI在Javaservlet中生成Excel文件 getExcel()函数返回我要发送给客户端的HSSFWorkbook HSSFWorkbook wb = getExcel(); 这就是我迄今为止所尝试的 //block1 ByteArrayOutputStream outByteStream = new ByteArrayOutputStream(); wb.write(outByteStream); byte [] outArray = outByteStream.t

我使用ApachePOI在Javaservlet中生成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
如果我从上面的代码中删除
block1
block2
,那么它不会给出错误,但我想发送客户
Excel文件
和我添加到
请求
对象的两个属性

所以可以使用
request.getRequestDispatcher
Excel
文件发送到客户端吗?或者有没有更好的方法

如有任何建议,将不胜感激

Edit1
我知道为什么我会得到
非法状态异常
,但我的问题是如何将
ExcelFile
请求属性
都发送给客户端

Edit2
我想将
Excel文件
属性
发送到客户端的原因是
MyFile.jsp
有一个
,它将显示从
servlet发送的消息

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

${Message}
Edit3

我想向客户端发送消息的原因是,我正在发送此
Excel文件
,作为对
Import Excel操作
的响应,在该操作中,客户端将提供
Excel文件
,用于在数据库中插入数据,然后我突出显示了由于重复或任何其他原因而无法插入的
excel行
。因此,我想在
消息中向客户显示导入统计信息,并给他一份突出显示错误行的excel文件副本。

您正在刷新
响应,然后尝试转发
。容器已经将
响应
发送回客户机,现在在如何
将请求转发到另一个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);
根据:

IllegalStateException-如果响应已提交

编辑1后:


不,你不能两者都做。你需要决定你想要什么。将字节写入响应,设置正确的头和MIME-TYPE。您无法让浏览器下载内容,也无法从同一响应中显示JSP页面。

触发文件下载时,您无法执行重定向或转发。只需在响应中写入文件内容并关闭响应流,然后让浏览器处理此问题。可能的重复项您测试过吗?请注意我对OP问题的评论,然后请测试此代码,看看它是否真的有效。@谢谢您的回答,我知道为什么会出现
非法状态异常
,但是我的问题是,我应该如何将
ExcelFile
Request Attributes
都发送到客户端?在为文件下载准备响应后执行转发。。。OP想要触发文件下载和转发,这是不可能的,而且您也没有提供解决方案。请注意,这不是一个难题,很简单:服务器不会做任何事情。@LuiggiMendoza这是OP的代码,我添加了注释来指定发生了什么。没有,但您将无法转发响应或发送重定向。