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

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

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

    lqxue

    常用鏈接

    統(tǒng)計(jì)

    book

    tools

    最新評(píng)論

    利用Digester把XML轉(zhuǎn)換成為Java對(duì)象

    在一個(gè)比較完整的應(yīng)用系統(tǒng)里,經(jīng)常需要有一些配置文件。簡(jiǎn)單的屬性使用。properties文件即可,但要配置一些復(fù)雜對(duì)象,則應(yīng)該考慮使用xml文件。一般用來(lái)讀取xml文件的工具包有DOM、SAX和JDOM等,但用過(guò)的人都知道,它們屬于比較底層的API,寫(xiě)起來(lái)代碼量很大,而且如果修改了xml文件的格式,代碼也要做大幅度的改動(dòng)。Jakarta Commons項(xiàng)目里的Digester包,可以輕松實(shí)現(xiàn)xml文件到Java對(duì)象的轉(zhuǎn)換,看下面這個(gè)例子。

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

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

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

      為了方便使用Digester,我們讓ChartConfig也具有統(tǒng)計(jì)圖的每個(gè)屬性(id、title、legendVisible等等),名稱(chēng)與charts.xml里的元素的屬性(子元素)一一對(duì)應(yīng),并且都具有g(shù)etter和setter方法,也就是說(shuō),ChartConfig是一個(gè)bean類(lèi)。在ChartRegistry類(lèi)里定義一個(gè)deregister()方法,它的作用是用Digester讀入并解析指定的xml文件,代碼如下;還有一個(gè)register()方法用來(lái)把ChartConfig對(duì)象加到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);
    }

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

      順利得到了ChartRegister對(duì)象,我就可以在程序里根據(jù)它的內(nèi)容構(gòu)造統(tǒng)計(jì)圖了(統(tǒng)計(jì)圖一般使用jfreechart來(lái)生成,這里就不贅述了)。與Digester具有類(lèi)似功能的工具包其實(shí)還有不少,例如Caster、Jato等等,我沒(méi)有實(shí)際使用過(guò)它們,但因?yàn)槲覍?duì)用過(guò)的Jakarta其他項(xiàng)目都很滿(mǎn)意(例如BeanUtils、HttpClient,品牌效應(yīng)?),所以一開(kāi)始就選擇了Digester:簡(jiǎn)單方便。

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

    posted on 2007-08-06 17:34 lqx 閱讀(237) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): xml

    主站蜘蛛池模板: 50岁老女人的毛片免费观看| 小说专区亚洲春色校园| 久久免费精品视频| 亚洲乱码国产乱码精品精| 高清永久免费观看| 亚洲成a人片在线观看无码| 美女在线视频观看影院免费天天看| 亚洲午夜久久久久久噜噜噜| 十八禁视频在线观看免费无码无遮挡骂过| 亚洲一区二区精品视频| 99久久99这里只有免费的精品| 亚洲va久久久噜噜噜久久男同| 久久w5ww成w人免费| 亚洲日本香蕉视频观看视频| 男女免费观看在线爽爽爽视频 | 成年网站免费视频A在线双飞| 亚洲高清日韩精品第一区| 免费人成网站在线观看10分钟| 国内精品久久久久影院亚洲| 国产真人无遮挡作爱免费视频 | 国产又大又长又粗又硬的免费视频 | 亚洲精品国产精品乱码不99| 精品无码国产污污污免费网站 | 亚洲国产精品激情在线观看| 99久久成人国产精品免费| 久久国产亚洲高清观看| 成年人网站在线免费观看| 免费一级毛suv好看的国产网站 | 曰批全过程免费视频在线观看| 亚洲精品色播一区二区| 亚洲天堂中文字幕在线| 84pao国产成视频免费播放| 亚洲国产无线乱码在线观看| 超清首页国产亚洲丝袜| 免费A级毛片无码A∨免费| 麻豆亚洲AV成人无码久久精品| 亚洲人成网站在线播放vr| 美女视频黄的全免费视频| h视频在线观看免费| 亚洲制服丝袜在线播放| 亚洲国产成人爱av在线播放|