JasperReport那些事儿(二)——从对象到XML数据源

 记得刚学Jasperreport的时候,在谷歌和百度上搜到的大多数入门文章都是教授如何使用数据库来做报表的。对于只采用简单数据集和那些直接面向数据的报表,使用数据库作为数据源是合适的;但是也有很多的报表不是直接面向原始数据的,例如财务报表,都是需要计算和做后续处理;也有一些报表引用的数据粒度小,但是数量多,使用数据库做数据源是不合适的。
       XML一直被认为是一种很好的描述结构化数据的语言。
       首先XML文件的数据结构非常清晰。可以把报表所需要的数据集成到一个XML文件上,然后再通过在文件内查询,这比每需要一条数据就使用SQL来查询要显得更高效和简单。试想一下,你的同事A告诉你,“报表的数据都在这份XML文件里哦”。而同事B则对你说:”那些数据在某个数据库里,你自己去查吧。“,你更喜欢听到哪一句呢?(当然我的语气上的差别就说明了我的喜好,我老怀疑后者在背向我的那一刻有在奸笑。)
       其次,现在对象映射到XML的工具很多。哦?你知道我在暗示什么吗?没错,你可以面向对象,而不用面向丑陋的表格。在上一篇文章中,我给出这样一个数据源。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 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类。大概像下面这样。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 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 }

       
      想像一下,把一个个对象排着队跳进模板,然后一张完整的报表就出来了,不用管那些烦人的Sql,那应该是多么美好的一件事儿。面向对象果然是我们的福音。接下来看看我们如何把对象转换成XML文件。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->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类代码。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 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或以上。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值