JasperReports与servlet结合后图片无法显示
代码如下:
package com.xbstar.application.patrol.reportServlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import org.ofbiz.entity.GenericEntityException;
import org.ofbiz.entity.jdbc.ConnectionFactory;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
import net.sf.jasperreports.j2ee.servlets.ImageServlet;
public class firstServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
// 接收查询参数,将来这个参数就是我们在报表中定义的parDname
String STAT_MONTH = request.getParameter("STAT_MONTH");
String LU_XIAN_BIAO_SHI = request.getParameter("LU_XIAN_BIAO_SHI");
System.out.println("LU_XIAN_BIAO_SHI:"+LU_XIAN_BIAO_SHI);
// 报表文件路径,我们用ireport做的jasper文件路径
// JasperReport需要jasper文件的真实路径
String reportPath = request.getSession().getServletContext()
.getRealPath("ireport/report11.jasper");
// 报表参数,jasper文件可能不只一个参数
// 在程序里,用一个Map对象,向jasper文件传递他需要的参数
Map reportParameters = new HashMap();
reportParameters.put("STAT_MONTH", STAT_MONTH);
reportParameters.put("LU_XIAN_BIAO_SHI", LU_XIAN_BIAO_SHI);
// 报表连数据库所用的数据连接
Connection con = null;
// 清空响应流
response.reset();
try {
con = ConnectionFactory.getConnection("localoracle");
} catch (GenericEntityException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
//being
try {
JasperPrint jasperPrint = JasperFillManager.fillReport(reportPath, reportParameters, con);
request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);
} catch (JRException e1) {
e1.printStackTrace();
}
JRHtmlExporter exporter = new JRHtmlExporter();
exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "/servlets/image?image=");
//end
// 设置输出格式
response.setContentType("application/html");
// JasperReport提供的类,用于生成一个HTML文件
try {
JasperRunManager.runReportToHtmlFile(reportPath, reportParameters, con);
} catch (JRException e) {
e.printStackTrace();
}
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
response.sendRedirect(request.getContextPath()+ "/ireport/report11.html");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
建议用用看FineReport,这款软件基本不存在你说的问题
官方网址:http://www.finereport.com/
下载地址:http://www.finereport.com/products/trial
如果生成的报表时html的话,那么jasperreport在该html同等目录创建一个文件夹,该文件夹包含一个px文件,有时候这个文件创建会有问题,所以手动创建一个px文件就开源解决html页面中图片不显示的问题。
顺便说一句,最好不要直接把 connection传给JasperReport,而是传一个JRDataSource,把一个集合作为JRDataSource的构造器参数创建给它,负责的报表不能让jasperreport链表什么的查询,而且这样也会用不到缓存的,如果有。