JasperReport那些事儿(二)——从工具到XML数据源
副标题#e#
记得刚学Jasperreport的时候,在谷歌和百度上搜到的大大都入门文章都是传授如何利用数据库来做报表的。对付只回收简朴数据集和那些直接面向数据的报表,利用数据库作为数据源是符合的;可是也有许多的报表不是直接面向原始数据的,譬喻财政报表,都是需要计较和做后续处理惩罚;也有一些报表引用的数据粒度小,可是数量多,利用数据库做数据源是不符合的。
XML一直被认为是一种很好的描写布局化数据的语言。
首先XML文件的数据布局很是清晰。可以把报表所需要的数据集成到一个XML文件上,然后再通过在文件内查询,这比每需要一条数据就利用SQL来查询要显得更高效和简朴。试想一下,你的同事A汇报你,“报表的数据都在这份XML文件里哦”。而同事B则对你说:”那些数据在某个数据库里,你本身去查吧。“,你更喜欢听到哪一句呢?(虽然我的语气上的不同就说明白我的爱好,我老猜疑后者在背向我的那一刻有在狞笑。)
其次,此刻工具映射到XML的东西许多。哦?你知道我在体现什么吗?没错,你可以面向工具,而不消面向丑恶的表格。在上一篇文章中,我给出这样一个数据源。
1 <?xml version="1.0" encoding="utf-8" ?>
2 <NameList>
3 <Person>
4 <Name>强尼</Name>
5 <Gender>男</Gender>
6 <Age>56</Age>
7 </Person>
8 <Person>
9 <Name>阿美</Name>
10 <Gender>女</Gender>
11 <Age>23</Age>
12 </Person>
13 <Person>
14 <Name>李丽</Name>
15 <Gender>女</Gender>
16 <Age>58</Age>
17 </Person>
18 <Person>
19 <Name>杰森</Name>
20 <Gender>男</Gender>
21 <Age>32</Age>
22 </Person>
23 <Person>
24 <Name>刘三</Name>
25 <Gender>男</Gender>
26 <Age>21</Age>
27 </Person>
28 </NameList>
假如你是个典范的面向工具的思考者,应该顿时想到一个叫Person的Java类。或许像下面这样。
1 package com.blogjava.heis.jasper.chapter2;
2
3 public class Person {
4
5 private String name;
6 private String gender;
7 private int age;
8
9 private String getName() {
10 return name;
11 }
12 private void setName(String name) {
13 this.name = name;
14 }
15 private String getGender() {
16 return gender;
17 }
18 private void setGender(String gender) {
19 this.gender = gender;
20 }
21 private int getAge() {
22 return age;
23 }
24 private void setAge(int age) {
25 this.age = age;
26 }
27 }
#p#副标题#e#
想像一下,把一个个工具排着队跳进模板,然后一张完整的报表就出来了,不消管那些烦人的Sql,那应该是何等优美的一件事儿。面向工具公然是我们的福音。接下来看看我们如何把工具转换成XML文件。
package com.blogjava.heis.jasper.chapter2;
import java.io.File;
import java.io.FileWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import org.apache.commons.betwixt.io.BeanWriter;
public class BeanToXMLConverter {
private final static String FILE_PATH="c:/test.xml";
/**
* Create an example bean and then convert it to xml.
*/
public static final void main(String [] args) throws Exception {
Person person1=new Person();
person1.setName("张三");
person1.setGender("男");
person1.setAge(35);
Person person2=new Person();
person2.setName("李四");
person2.setGender("女");
person2.setAge(25);
ArrayList<Person> al=new ArrayList<Person>();
al.add(person1);
al.add(person2);
NameList nameList=new NameList();
nameList.setList(al);
try{
BeanToXMLConverter wea=new BeanToXMLConverter();
wea.writeToXMLFile(nameList);
}catch(Exception e){
e.printStackTrace();
}
}
private void writeToXMLFile(Object obj)throws Exception{
StringWriter outputWriter = new StringWriter();
outputWriter.write("<?xml version='1.0' ecoding='UTF-8' ?>\n");
BeanWriter beanWriter = new BeanWriter(outputWriter);
beanWriter.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false);
beanWriter.getBindingConfiguration().setMapIDs(false);
beanWriter.enablePrettyPrint();
beanWriter.write(obj);
String xmlFilePath=FILE_PATH;
File xmlFile=new File(FILE_PATH);
if(!xmlFile.exists()){
xmlFile.createNewFile();
}
FileWriter fw=new FileWriter(xmlFilePath);
fw.write(outputWriter.toString().toCharArray());
fw.flush();
System.out.println(outputWriter.toString());
outputWriter.close();
}
}
NameList类代码。
#p#分页标题#e#
1 package com.blogjava.heis.jasper.chapter2;
2
3 import java.util.List;
4
5 public class NameList {
6
7 private List<Person> list;
8
9 public List<Person> getList() {
10 return list;
11 }
12
13 public void setList(List<Person> list) {
14 this.list = list;
15 }
16 }
17
运行以上的代码需要四个包,commons-betwixt.jar,commons-logging.jar, commons-collections.jar, commons-beanutils-core.jar。这些都可以从http://commons.apache.org/下载。JDK需要1.5或以上。
看到这里你心里也许开始抵牾(可能不屑),对,同事Q也是这样想的。
Q:“这不是摆明更贫苦么?工具转换为XML,再从XML查数据,你这瞎折腾我,挥霍资源在转换上!!”
俺:“也许是多了一些工夫,多占用了点资源。可是这可以让报表的数据可读性更强,更重要的是报表建造可以和SQL说拜拜,他和工具走得更密切了。”
Q:“可是你的XML文件不是照旧需要查询么?你能担保那些查询语句比SQL更简朴么?”
俺:“我能给你必定的答复。可是XML的查询就要留到下一章去先容了。这礼拜OT较量多,先溜啦,88。”
Q:“哎,你给我说清楚点再走……”