最近在学习报表的时候,主要用的架构是:jsf+spring +iBATIS,报表用的工具是ireport +Jasperreport
在导出的时候使用Response对象对客户端进行输出字符,主要的代码有:
public void Backingbean(){
//在jsf的backingbean中使用Response与request.
FacesContext faces=FacesContext.getCurrentInstance();
HttpServletResponse response=(HttpServletResponse)faces.getExternalContext().getResponse();
HttpServletRequest request=(HttpServletRequest)faces.getExternalContext().getRequest();
......
......
//利用jasperreport生成pdf报表
byte[] bytes=JasperRunManager.runReportToPdf(path1,null,conn);//path1为报表模板文件位置
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream outStream = response.getOutputStream();
outStream.write(bytes,0,bytes.length);
outStream.flush();
outStream.close();
conn.close();
}
运行测试项目后报表是能导出,但是后台始终爆发一个错误:
java.lang.IllegalStateException: Cannot forward after response has been committed
找了好久都没有找到答案.最后终于将答案从信息海洋中给抠了出来,原来在将输出流关闭以后再加上一句:
faces.responseComplete();
就什么事情都没有了....
希望能给初学jsf者一点提示.....