日期:2014-05-17 浏览次数:21140 次
JasperReports使用Report模型,典型的Report包括title, summary, detail, and page and group headers and footers。
?
?
给Report填上数据,首先要编译一下Report的XML定义。编译好的Report以.jasper作为扩展名,并且增加了一些信息,比如自定义的一些表达式等(由于表达式支持beanshell, groovy, java等,这里是否翻译成统一的结构?)。这些编译好的报表可以serialized然后存在硬盘上或者从网上传输。在填充数据的步骤,将重新使用这些编译好的报表。实际上,编译的内容只是一些表达式而已。
?
net.sf.jasperreports.view.JasperDesigner类就是察看报表模型的类,可以 load 报表定义JRXML或者其编译好的文件(如何?)。虽然他不具有复杂的 GUI 和操作,但是利用它可以使报表模型可视化。
?
在所有的例子中,共有两个 ANT task :viewDesign and viewDesignXML。第一个可以 load report? template ,后缀名是*.jasper;第二个可以 load JRXML , load jrxml 更加有用,因为他是 xml 格式的,可以被编辑(编辑完成后通过 refresh 立即可以看到结果)。
?
使用net.sf.jasperreports.engine.util.JRSaver将 serializing objects变成文件或者流。从流或者文件中 load ,可以使用net.sf.jasperreports.
engine.util.JRLoader utility类,这个类提供多种 load 方法,可以从文件、 inputstream, url, classpath 资源获得 Report template 。这些方法如:loadObjectFromLocation(String location)。
?
有些时候需要手工加载 report template 以便使用代码进行修改,这时候,你就需要将JRXML文件变成net.sf.jasperreports.engine.design.JasperDesign类,这个类是没有编译前的报表模型。在net.sf.jasperreports.engine.design.JasperDesign 类中的 load() 方法将一个JRXML文件变成报表模型或者使用类net.sf.jasperreports.engine.xml . JRXmlLoader。使用 writeReport() 方法将 JasperDesign 类写回,或者使用net.sf.jasperreports.engine.xml.JRXmlWrite r 。
?
编译的动作就是将net.sf.jasperreports.engine.design.JasperDesign变为net.sf.jasperreports.engine.JasperReport。这两个类都继承自net.sf.jasperreports.engine.JRReport接口。
?
编译动作的执行者是net.sf.jasperreports.engine.design.JRCompiler接口,接口中定义了两个方法:
public JasperReport compileReport(JasperDesign design) throws JRException;
public JREvaluator loadEvaluator(JasperReport jasperReport) throws JRException;
?
基于Groovy的报表编译器是net.sf.jasperreports.compilers.JRGroovyCompiler;基于 BeanShell 没有打包在核心库中,可以从例子中找到。
/demo/samples/beanshell和/demo/samples/groovy
?
为了简化编译, Jasper 提供了net.sf.jasperreports.engine.JasperCompileManager,这个类有一些静态方法可以从文件、流或者内存中编译报表。
首先,net.sf.jasperreports.engine.design.JRDefaultCompiler从配置文件中读取net.sf.jasperreports.compiler.class的信息(通过修改这个配置,可以自己定义所需的编译器)。如果没有定义,则使用 DefaultCompiler , DefaultCompiler 首先试图在 classpath 中寻找找到 Eclipse 的JDT compiler,如果找到了,则使用net.sf.jasperreports.engine.design.JRJdtCompiler的实现进行编译,现有版本的 Jasper 随包打有 JDT ,在/lib/jdt-compiler.jar里面。如果 JDT 找不到,则开始尝试使用与JDK 1.3兼容的 Sun 的 Java Compiler