Heis的Blog

          保持簡單,保持愚蠢
          隨筆 - 29, 文章 - 1, 評論 - 122, 引用 - 0
          數據加載中……

          JasperReport那些事兒(二)——從對象到XML數據源

                 記得剛學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 }
                 
                想像一下,把一個個對象排著隊跳進模板,然后一張完整的報表就出來了,不用管那些煩人的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類代碼。
           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:“哎,你給我說清楚點再走……”
               






          程序員的一生其實可短暫了,這電腦一開一關,一天過去了,嚎;電腦一開不關,那就成服務器了,嚎……

          posted on 2009-02-21 21:14 Heis 閱讀(3104) 評論(2)  編輯  收藏 所屬分類: JasperReport那些事兒

          評論

          # re: JasperReport那些事兒(二)——從對象到XML數據源  回復  更多評論   

          這樣確實解決了煩人的SQL但是增加了額外的負擔,fillReport你需要的數據源需要從xmlDatasource中加載,如果再來點統計、圖表型等等,scriplet也會讓你越來越頭疼,首先維護起來麻煩,其次為了填充obj大對象所帶來代碼額外的代碼、性能開銷......
          2009-02-23 08:55 | 凌晨風

          # re: JasperReport那些事兒(二)——從對象到XML數據源  回復  更多評論   

          如果相對于那些時常導出報表的,如在瀏覽器上導出報表的這確實一個很好的方案。
          但是還是搞不清如何解決查詢的問題,所以期待你的下一章。
          2009-02-25 09:44 | duduli
          主站蜘蛛池模板: 甘孜县| 建水县| 佳木斯市| 万源市| 兰考县| 海兴县| 永清县| 眉山市| 灵寿县| 罗源县| 陆丰市| 晋宁县| 师宗县| 克拉玛依市| 淮阳县| 高阳县| 酒泉市| 双江| 许昌市| 孟津县| 临颍县| 栾城县| 磐石市| 临夏县| 双峰县| 静安区| 兴文县| 阳原县| 华宁县| 五台县| 高唐县| 云梦县| 仙桃市| 永川市| 宁南县| 准格尔旗| 自贡市| 札达县| 天柱县| 揭阳市| 滨州市|