BOOS让用JasperReports做报表,只能老老实实请教度娘了,但是网上资源又多又乱,多是copy的,代码都不知道有没有验证过、、、
自己做了一遍,贴出来供大家学习.
首先要确定你的tomcat、JDK、iReport是配置好的,下面我们开始,我用的事Myeclipse开发网站
一个很常见的例子
一、定义bean
ProductBean.java
package test6; public class ProductBean { private String productName; public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } }二、在iReport中设定数据源及创建报表
1、首先把路径添加上去,就是你编译好的class文件的路径:iReport、工具--选项--路径(classpath)添加我的路径是最下面的那个,就是编译好的class文件路径
2、在工具栏找到ReportDataSources工具,添加数据源:点击新建、之后选择JavaBeans set datasource
选中之后会出现如下界面:
需要填写的包括Name、Factory class和static method,这个地方要注意,如果你已经编写好了数据制造工厂,就是说不基于网络来做,那么
你要填写Factory class这一栏,路径为:package.XXXXX,其中XXXX是你自己创建的工厂类的名字;同时在static method,,里面填写你创建的函数,即返回的list列表。
这种方式,下次有时间我再写出来,今天说基于网络的。
基于网络的那么就不用填写下面两项,只要把名字写一下好了,比如我的是新建一个报表,一路next下去创建好之后,在界面上很容易找到添加数据的一个按钮:选择第二个选项,JavaBean Datasource
我新建的包是test6所以输入的classname就是test6.ProductBean
点击右边Read attributes就会出现一个class一个productName,当然,后面就是我们之前新建的一个属性,添加都会的吧
添加之后在我们的报表左边栏Fields里面看到了,将它拖入到编辑面板,要拖入到Details里面,这个我就不多说了,不懂看文档
之后是这样效果:
保存编译,之后找到你创建报表的路径,里面会有编译好的文件,我的文件名是repor_tservlet,所以生成两个
我们这次使用上面那个.jasper文件,当然下面的也是可以使用的,只是代码不同,如果又人需要留言好了,下面将report_servlet.jasper拷贝到你的服务器文件夹下,随便新建个文件夹就行
下面编写我们的Servlet程序:BeanReportServlet.java
package test6; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sf.jasperreports.engine.JRDataSource; import net.sf.jasperreports.engine.JRExporterParameter; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; import net.sf.jasperreports.engine.export.JRPdfExporter; import net.sf.jasperreports.engine.util.JRLoader; import net.sf.jasperreports.j2ee.servlets.BaseHttpServlet; public class BeanReportServlet extends HttpServlet { private static final long serialVersionUID = 348226870594216833L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { //生成测试数据 ArrayList<ProductBean> data = new ArrayList<ProductBean>(); for(int i = 1; i <= 100; i++) { ProductBean bean = new ProductBean(); bean.setProductName("Product " + i); data.add(bean); } JRDataSource dataSource = new JRBeanCollectionDataSource(data); //获取报表模板文件 String root_path = this.getServletContext().getRealPath("/"); root_path = root_path.replaceAll("\\\\", "/"); String reportFilePath = root_path + "jasper/report_servlet.jasper"; System.out.println("jasper file is " + reportFilePath); // File reportFile = new File(reportFilePath); //生成JasperPrint JasperReport report = (JasperReport)JRLoader.loadObject(reportFilePath); // JasperReport report = (JasperReport)JRLoader.loadObject(reportFile); JasperPrint jasperPrint = JasperFillManager.fillReport(report, null, dataSource); //设定输出格式 OutputStream ouputStream = resp.getOutputStream(); resp.setContentType("application/pdf"); resp.setCharacterEncoding("UTF-8"); resp.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode("PDF报表", "UTF-8") + ".pdf\""); // 使用JRPdfExproter导出器导出pdf JRPdfExporter exporter = new JRPdfExporter(); // 设置JasperPrintList exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream); exporter.exportReport(); ouputStream.close(); } catch (Exception e) { e.printStackTrace(); } } }这个代码是我从其他网友那边拷贝来的,当然问题很多、不能用,我修改之后的这个应该是没问题的,至少在我的电脑环境下是可以用的。
新建之后要注意一些Jar包的引入,因为我也是初学,所以才用最笨的方法,就是将D:\Program Files\Jaspersoft\iReport-4.6.0\ireport\modules下面的所有的jar包全部放到WEB-INF的lib下面
这样肯定是没什么问题了,把一些必要的jar包引入你的代码
注意:
如果你是从其他地方拷贝来的代码,注意以下几点
root_path = root_path.replaceAll("\\\\", "/");很多博客写的不规范,就是不能用,上面这种写法是正确的一种,给个参考:http://www.blogjava.net/hefang/articles/324456.html
JasperReport report = (JasperReport)JRLoader.loadObject(reportFilePath);这一行可能会报错,说loadObject什么已经过期,我郁闷了好久,最后是把所有的jar包拷贝到WEB-INF的lib下面解决的,具体还有待研究
String root_path = this.getServletContext().getRealPath("/"); root_path = root_path.replaceAll("\\\\", "/"); String reportFilePath = root_path + "jasper/report_servlet.jasper";
注意路径修改成你的路径
上面做好之后,记得在web.xml里面配置
<pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>report</servlet-name> <servlet-class>test6.BeanReportServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>report</servlet-name> <url-pattern>/report</url-pattern> </servlet-mapping> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
运行Tomcat在浏览器里面输入:http://localhost:8080/Jb_test6/report
report是在xml里面的映射名,不用解释吧
<img src="http://img.blog.csdn.net/20140829132926115?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb211emkwODAy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" height="452" width="666" alt="" /> 看到最下面的提示了吧,那说明我们的运行成功了,点击打开 看到我们生成的100个产品了吧 <img src="http://img.blog.csdn.net/20140829133041104?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb211emkwODAy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" /> 好的,GameOver如果有哪位还有问题可以留言, 需要原代码的也留言第一次认真的写博客,蛋蛋的忧伤