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

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

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

    lqxue

    常用鏈接

    統計

    book

    tools

    最新評論

    利用Digester把XML轉換成為Java對象

    在一個比較完整的應用系統里,經常需要有一些配置文件。簡單的屬性使用。properties文件即可,但要配置一些復雜對象,則應該考慮使用xml文件。一般用來讀取xml文件的工具包有DOM、SAX和JDOM等,但用過的人都知道,它們屬于比較底層的API,寫起來代碼量很大,而且如果修改了xml文件的格式,代碼也要做大幅度的改動。Jakarta Commons項目里的Digester包,可以輕松實現xml文件到Java對象的轉換,看下面這個例子。

      在一個項目里,需要提供一些統計圖,但圖的內容暫時未能確定。所以我決定讓圖可以配置,所有定義保存在一個名為charts.xml(或國際化后的文件名如charts_zh_CN.xml,這里只考慮缺省語言)的文件內,下面是該文件的部分內容:

         false
        true
        Bar
        時間
        數據
        500
        360
        select count(c),
    c.department.name
    from edu.pku.pub.
    aims.model.business.
    Client c group
    by c.department

      可以看出,我為每個圖定義了id、title、legendVisible等等屬性,這些屬性的意義都很明顯,它們將影響統計圖的數據和在頁面中的表現。在程序里,我需要把這個文件里的定義讀到一個注冊表類ChartRegistry里,該注冊表維護一個java.util.List類型的registry變量,其中每個元素是一個ChartConfig類。現在Digester該顯示它的價值了。

      為了方便使用Digester,我們讓ChartConfig也具有統計圖的每個屬性(id、title、legendVisible等等),名稱與charts.xml里的元素的屬性(子元素)一一對應,并且都具有getter和setter方法,也就是說,ChartConfig是一個bean類。在ChartRegistry類里定義一個deregister()方法,它的作用是用Digester讀入并解析指定的xml文件,代碼如下;還有一個register()方法用來把ChartConfig對象加到registry里。


     

    public void deregister(URL url) throws IOException,SAXException{
      InputStream is = new FileInputStream(url.getFile());
      Digester digester = new Digester();
      digester.push(this);
      digester.setValidating(false);
      digester.addObjectCreate("charts/chart", ChartConfig.class);
      digester.addSetProperties("charts/chart");
      digester.addBeanPropertySetter("charts/chart/legendVisible");
      digester.addBeanPropertySetter("charts/chart/toolTipsVisible");
      digester.addBeanPropertySetter("charts/chart/title");
      digester.addBeanPropertySetter("charts/chart/type");
      digester.addBeanPropertySetter("charts/chart/labelx");
      digester.addBeanPropertySetter("charts/chart/labely");
      digester.addBeanPropertySetter("charts/chart/width");
      digester.addBeanPropertySetter("charts/chart/height");
      digester.addBeanPropertySetter("charts/chart/hql");
      digester.addBeanPropertySetter("charts/chart/description");
      digester.addSetNext("charts/chart","register");
      digester.parse(is);
      Collections.sort(registry);
    }

      基本上來說,Digester和SAX解析xml的過程很像,它的原理就是制定一些規則,在遍歷每個節點時檢查是否有匹配的規則,如果有就執行對應的操作。例如,上面的代碼中,“digester.addObjectCreate("charts/chart", ChartConfig.class);”這一句的作用是告訴Digester:如果遇到匹配“charts/chart”形式的節點,就執行一個“對象創建”操作,創建什么對象呢,應該創建Class為“ChartConfig.class”的對象;類似的,addSetProperties()是告訴Digester將指定節點的屬性全部映射到對象的屬性,在這個例子里指的就是id屬性;addBeanPropertySetter()是將子節點轉換為對象的屬性,這個方法還可以有第二個參數,當對象的屬性名和子節點的名字不一樣時用來指定對象的屬性名;addSetNext()是說在遇到匹配節點后,對當前對象的父對象執行一個方法,參數是當前參數,對這個例子來說就是執行ChartConfig.register(ChartConfig)方法。因此這樣構造得到的Digester會把charts.xml里的每個元素轉換為一個ChartConfig對象,并register到ChartRegistry里。

      順利得到了ChartRegister對象,我就可以在程序里根據它的內容構造統計圖了(統計圖一般使用jfreechart來生成,這里就不贅述了)。與Digester具有類似功能的工具包其實還有不少,例如Caster、Jato等等,我沒有實際使用過它們,但因為我對用過的Jakarta其他項目都很滿意(例如BeanUtils、HttpClient,品牌效應?),所以一開始就選擇了Digester:簡單方便。

    from :http://java.chinaitlab.com/WebServices/715609.html

    posted on 2007-08-06 17:34 lqx 閱讀(230) 評論(0)  編輯  收藏 所屬分類: xml

    主站蜘蛛池模板: 两个人的视频高清在线观看免费| 一级毛片免费毛片一级毛片免费 | 国产亚洲AV手机在线观看| 亚洲AV无码成人精品区狼人影院 | 三根一起会坏掉的好痛免费三级全黄的视频在线观看 | 黄瓜视频影院在线观看免费| 久久精品蜜芽亚洲国产AV| 亚洲中文字幕无码不卡电影| 日本高清不卡中文字幕免费| 亚洲国产成人久久综合一区77| 国产精品亚洲精品日韩电影| 国产婷婷高清在线观看免费| 无人视频在线观看免费播放影院 | 亚洲精品免费在线| 97se亚洲国产综合自在线| 成人au免费视频影院| 欧美日韩亚洲精品| 亚洲日本在线观看视频| 亚洲精品美女久久久久| 免费A级毛片无码A∨免费| 亚洲制服丝袜精品久久| 毛片a级毛片免费观看品善网| 亚洲人成网站18禁止| 亚洲麻豆精品国偷自产在线91| 亚洲一区动漫卡通在线播放| 免费精品国产自产拍在| 亚洲国产综合AV在线观看| 伊在人亚洲香蕉精品区麻豆| 国产色无码精品视频免费| 亚洲人成免费网站| 国产伦精品一区二区三区免费迷 | 亚洲啪AV永久无码精品放毛片| 高清在线亚洲精品国产二区| 久久精品视频免费看| 亚洲高清中文字幕免费| 67pao强力打造国产免费| 亚洲乱色熟女一区二区三区蜜臀| 亚洲片国产一区一级在线观看 | MM1313亚洲国产精品| 亚洲国产综合无码一区| 国产va免费精品观看精品|