使用java servlet将excel文件发送到客户端
我使用ApachePOI在Javaservlet中生成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
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的代码,我添加了注释来指定发生了什么。没有,但您将无法转发响应或发送重定向。