<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Heis的Blog

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

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

           記得剛學(xué)Jasperreport的時候,在谷歌和百度上搜到的大多數(shù)入門文章都是教授如何使用數(shù)據(jù)庫來做報表的。對于只采用簡單數(shù)據(jù)集和那些直接面向數(shù)據(jù)的報表,使用數(shù)據(jù)庫作為數(shù)據(jù)源是合適的;但是也有很多的報表不是直接面向原始數(shù)據(jù)的,例如財務(wù)報表,都是需要計算和做后續(xù)處理;也有一些報表引用的數(shù)據(jù)粒度小,但是數(shù)量多,使用數(shù)據(jù)庫做數(shù)據(jù)源是不合適的。
           XML一直被認(rèn)為是一種很好的描述結(jié)構(gòu)化數(shù)據(jù)的語言。
           首先XML文件的數(shù)據(jù)結(jié)構(gòu)非常清晰??梢园褕蟊硭枰臄?shù)據(jù)集成到一個XML文件上,然后再通過在文件內(nèi)查詢,這比每需要一條數(shù)據(jù)就使用SQL來查詢要顯得更高效和簡單。試想一下,你的同事A告訴你,“報表的數(shù)據(jù)都在這份XML文件里哦”。而同事B則對你說:”那些數(shù)據(jù)在某個數(shù)據(jù)庫里,你自己去查吧。“,你更喜歡聽到哪一句呢?(當(dāng)然我的語氣上的差別就說明了我的喜好,我老懷疑后者在背向我的那一刻有在奸笑。)
           其次,現(xiàn)在對象映射到XML的工具很多。哦?你知道我在暗示什么嗎?沒錯,你可以面向?qū)ο?,而不用面向丑陋的表格。在上一篇文章中,我給出這樣一個數(shù)據(jù)源。
     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>
           
            如果你是個典型的面向?qū)ο蟮乃伎颊撸瑧?yīng)該馬上想到一個叫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,那應(yīng)該是多么美好的一件事兒。面向?qū)ο蠊皇俏覀兊母R?。接下來看看我們?nèi)绾伟褜ο筠D(zhuǎn)換成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:“這不是擺明更麻煩么?對象轉(zhuǎn)換為XML,再從XML查數(shù)據(jù),你這瞎折騰我,浪費資源在轉(zhuǎn)換上??!”
          俺:“也許是多了一些功夫,多占用了點資源。但是這可以讓報表的數(shù)據(jù)可讀性更強,更重要的是報表制作可以和SQL說拜拜,他和對象走得更密切了。”
          Q:“但是你的XML文件不是還是需要查詢么?你能保證那些查詢語句比SQL更簡單么?”
          俺:“我能給你肯定的回答。但是XML的查詢就要留到下一章去介紹了。這星期OT比較多,先溜啦,88。”
          Q:“哎,你給我說清楚點再走……”
         






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

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

    評論

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

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

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

    如果相對于那些時常導(dǎo)出報表的,如在瀏覽器上導(dǎo)出報表的這確實一個很好的方案。
    但是還是搞不清如何解決查詢的問題,所以期待你的下一章。
    2009-02-25 09:44 | duduli
    主站蜘蛛池模板: 国产精品亚洲AV三区| 男人天堂免费视频| 中文字幕不卡亚洲 | 免费人成视频在线观看视频| 成在线人免费无码高潮喷水| 亚洲精品无码久久久久久久 | 亚洲JIZZJIZZ中国少妇中文| 久久精品私人影院免费看| 亚洲夂夂婷婷色拍WW47| 国产免费一区二区三区VR| 十八禁无码免费网站| 国产精品亚洲天堂| 日韩精品亚洲人成在线观看| 精品久久久久久久免费加勒比| 99久久99这里只有免费的精品 | 久久久精品视频免费观看 | 最近2018中文字幕免费视频| 亚洲国产成人久久综合| 亚洲色欲色欲www在线丝| 成人免费无遮挡无码黄漫视频| 黄视频在线观看免费| 中日韩亚洲人成无码网站| 亚洲成色WWW久久网站| www.亚洲色图| 女人被弄到高潮的免费视频 | 国产午夜无码精品免费看| 亚洲AV无码一区二区乱子仑 | 黄页免费在线观看| 日韩一级片免费观看| 亚洲午夜精品久久久久久app| 图图资源网亚洲综合网站| 亚洲国产综合精品中文字幕 | 在线免费观看一级片| 嘿嘿嘿视频免费网站在线观看| 亚洲欧洲精品成人久久曰影片| 天天影院成人免费观看| 免费人成在线观看视频高潮| 香蕉视频亚洲一级| 亚洲天堂免费在线| 亚洲福利一区二区三区| 亚洲av激情无码专区在线播放|