学习开源项目的最好办法:通过学习官方例子。当然,在这之前最好看看关于这个开源项目是什么东东,有什么基本概念。
对于jasperreport,建议先看看官网里面的这篇文章:
http://jasperforge.org/projects/jasperreports
一、将webapp部署到tomcat上
首先,要run一下ant对应的build.xml文件
看一下主要是做了以下两个事情:
1、将一些需要的jar文件拷贝到lib目录下(注意执行build操作时,这个webapp目录必须要在原来的目录下,或者需要修改build.xml文件里面的部分目录参数)
2、编译class目录下java文件
当然,还可以打包的,但是发现这个功能在这个build.xml中有点问题,所以索性复制整个目录到tomcat里面算了!
到此为止,我们可以通过这个build.xml文件可以学习到这个webapp需要什么lib的支持!
然后,就是复制目录了
最后,就是启动tomcat。
二、通过webapp学习报表生成的过程
步骤一:compile JRXML
例子原来在reports目录就有一个WebappReport.jrxml文件(一个xml文件)
这个步骤完成的就是将WebappReport.jrxml文件编译成一个对应的WebappReport.jasper
示例中分别用了两种方式,servlet和jsp,其实做的东西都差不多,不过个人推荐使用jsp。
下面就节选完成这个步骤的关键代码:
try
{
JasperCompileManager.compileReportToFile
(context.getRealPath
(
"/reports/WebappReport.jrxml"
));
}
catch
(JRException e
)
{
注:在这种情况下,生成的jasper文件的目录与/WebappReport.jrxml一样
总结:一般编译jasper文件不是在线完成的,在线下完成;而且不容易改变的!
步骤二:fill report
将数据渲染到report模板中,得到一个JasperPrint对象
将这个JasperPrint对象放到session,以便后续处理!
关键代码以及分析:
try
{
String reportFileName
= context.getRealPath
(
"/reports/WebappReport.jasper"
);
File reportFile
=
new File
(reportFileName
);
if
(!reportFile.exists
())
throw
new JRRuntimeException
(
"File WebappReport.jasper not found. The report design must be compiled first."
);
//parameters用来对原来jrxml中自定义的parameter进行赋值
Map parameters
=
new HashMap
();
parameters.put
(
"ReportTitle"
,
"Address Report"
);
parameters.put
(
"BaseDir"
, reportFile.getParentFile
());
//里面的 new WebappDataSource()对象是数据的来源
JasperPrint jasperPrint
=
JasperFillManager.fillReport
(
reportFileName
,
parameters
,
new WebappDataSource
()
);
//上面生成的JasperPrint对象可以理解成一个渲染了数据的report的包裹
request.getSession
().setAttribute
(BaseHttpServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE
, jasperPrint
);
}
catch
(JRException e
)
步骤三:export report
根据不同要求(文件格式),将JasperPrint对象以对应的文件格式显示出来。
比如说将report以pdf的方式:
//从session中取回jasperPrint对象
List jasperPrintList
= BaseHttpServlet.getJasperPrintList
(request
);
62
63
if
(jasperPrintList
== null
)
64
{
65
throw
new ServletException
(
"No JasperPrint documents found on the HTTP session."
);
66
}
67
68 Boolean isBuffered
= Boolean.valueOf
(request.getParameter
(BaseHttpServlet.BUFFERED_OUTPUT_REQUEST_PARAMETER
));
69
if
(isBuffered.booleanValue
())
70
{
//生成输出器
71 JRPdfExporter exporter
=
new JRPdfExporter
();
72 exporter.setParameter
(JRExporterParameter.JASPER_PRINT_LIST
, jasperPrintList
);
73
74 ByteArrayOutputStream baos
=
new ByteArrayOutputStream
();
75 exporter.setParameter
(JRExporterParameter.OUTPUT_STREAM
, baos
);
76
77
try
78
{
//输出
79 exporter.exportReport
();
80
}
81
catch
(JRException e
)
解释结束!