日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

竹筍炒肉: Digester學(xué)習(xí)筆記(三)

 shaobin0604@163.com 2007-01-24

Digester學(xué)習(xí)筆記(三)

  總覺(jué)得,Digester不僅僅能作配置文件解析,而且可以作得更多。

配置屬性

  Digester用來(lái)解析應(yīng)用系統(tǒng)的配置文件,其本身也有很可配置的屬性。
屬性 描述
classLoader 指定類裝載器(class loader)。ObjectCreateRule 和 FactoryCreateRule兩個(gè)規(guī)則中,需要?jiǎng)討B(tài)加載一些類(如那些盛放XML解析出來(lái)的數(shù)據(jù)的javaBean等),裝載器可以在次指定。如果不指定,對(duì)這此類的加載將會(huì)利用線程上下文中的加載器(當(dāng)useContextClassLoader值為真時(shí))或利用加載Digester的那個(gè)加載器。
errorHandler 指定 SAX ErrorHandler,以在出現(xiàn)此類錯(cuò)誤時(shí)調(diào)用。默認(rèn)情況下,任何解析錯(cuò)誤都會(huì)被記入日志,Digest會(huì)繼續(xù)進(jìn)行解析。
namespaceAware 一個(gè)布爾值,為真時(shí)對(duì)XML文件的解析時(shí)會(huì)考慮元素的域名空間(如不同的域名空間的同名元素會(huì)視為不同的元素)
ruleNamespaceURI 指定后續(xù)加入的規(guī)則所屬的命名空間,如果此值為null,則加入的規(guī)則不與任何命名空間相聯(lián)系。
rules 設(shè)定規(guī)則模板與XML元素的匹配處理程序。由于這個(gè)匹配程序是插件式的,所以匹配工作的完成可以用用戶定義的匹配程序未完成。默認(rèn)情況下,使用Digester提供的匹配器。
useContextClassLoader 一個(gè)布爾值,為真時(shí)FactoryCreateRule 和 ObjectCreateRule 兩個(gè)規(guī)則中對(duì)類的裝載將會(huì)采用當(dāng)前線程上下文中指定的加載器。默認(rèn)情況下,對(duì)類的動(dòng)態(tài)加載會(huì)利用加載Digester的那個(gè)裝載器。
validating 一個(gè)布爾值,為真時(shí)解析器會(huì)根據(jù)DTD內(nèi)容對(duì)XML文檔進(jìn)行合法性檢查,默認(rèn)值是假,解析器只是檢查XML是否格式良好(well formed).

  除了上述屬性外,還可以注冊(cè)一個(gè)本地DTD,以供DOCTYPE聲明引用。這樣的注冊(cè)告訴XML解析器,當(dāng)遇到DOCTYPE聲明時(shí),應(yīng)使用剛注冊(cè)的DTD的內(nèi)容,而不是DOCTYPE聲明中的標(biāo)識(shí)符(identifier)。
  例如,Struect框架控制器中,使用下述的注冊(cè),告訴Structs使用一個(gè)本地的DTD中的相關(guān)內(nèi)容來(lái)處理Structs配置文件,這樣可以適用于那些沒(méi)有連接到互聯(lián)網(wǎng)的應(yīng)用環(huán)境,而在連到互聯(lián)網(wǎng)的環(huán)境中可以加快運(yùn)行速度(因?yàn)樗苊饬送ㄟ^(guò)網(wǎng)絡(luò)去取相關(guān)的資源)。
URL url = new URL("/org/apache/struts/resources/struts-config_1_0.dtd");
digester.register("-//Apache Software Foundation//DTD Struts Configuration 1.0//EN",url.toString());

規(guī)則集打包


  通常情況下,一個(gè)規(guī)則被創(chuàng)建后,接著便注冊(cè),然后等在event時(shí)被調(diào)用,這些規(guī)則集很難為其它應(yīng)用程序直接復(fù)用。一個(gè)解決方法是將所有規(guī)則都放在一個(gè)類中,此由這些規(guī)則可以很簡(jiǎn)單地被裝載然后被注冊(cè)使用。RuleSet接口就是為些而設(shè)計(jì),一般是通過(guò)擴(kuò)展RuleSetBase類來(lái)開(kāi)發(fā)規(guī)則集類。如例:
public class MyRuleSet extends RuleSetBase {
  public MyRuleSet() {
    this("");
  }
  public MyRuleSet(String prefix) {
    super();
    this.prefix = prefix;
    this.namespaceURI = "http://www./MyNamespace";
  }
  protected String prefix = null;
  public void addRuleInstances(Digester digester) {
    digester.addObjectCreate(prefix + "foo/bar",
      "com.mycompany.MyFoo");
    digester.addSetProperties(prefix + "foo/bar");
  }
}
可以這樣使用這個(gè)規(guī)則集
Digester digester = new Digester();
... 一些配置Digester ...
digester.addRuleSet(new MyRuleSet("baz/"));

帶命名空間的XML解析


  這種情況下,使用Digester的步驟為:
  1. 在Digester初始化部分,指明要考慮命名空間。
    digester.setNamespaceAware(true);

  2. 指明一些規(guī)則的命名空間,如
    digester.setRuleNamespaceURI("http://www./MyNamespace");

  3. 接下來(lái)定義一些與此命名空間有關(guān)的規(guī)則,此時(shí)可以省卻前綴,如
    digester.addObjectCreate("foo/bar", "com.mycompany.MyFoo");
    digester.addSetProperties("foo/bar");

  4. 對(duì)其它命名空間,重復(fù)前面的2步

  另外,在指明要digester考慮命名空間之后,在定義匹配模板時(shí),可以將命名空間別名加“:”作為元素名稱的一部分使用。這與無(wú)命名空間時(shí)是一致的。

開(kāi)發(fā)定制的匹配處理過(guò)程


  通過(guò)實(shí)現(xiàn) org.apache.commons.digester.Rules接口或擴(kuò)展org.apache.commons.digester.RulesBase類來(lái)達(dá)到定制匹配過(guò)程的目的。
  Digester提供ExtendedBaseRules來(lái)擴(kuò)展了匹配模板的定義,引入了特殊通配字符?和*以及!,提供RegexRules來(lái)支持以正則式的語(yǔ)法定義匹配模板,提供WithDefaultsRulesWrapper來(lái)支持默認(rèn)規(guī)則(即其它規(guī)則都不匹配時(shí)的處理規(guī)則)。

一些認(rèn)識(shí)


  通過(guò)看說(shuō)明材料,尤其在學(xué)習(xí)Digester包中的Catalog例子以后,有一些認(rèn)識(shí):
  1、由于xml對(duì)屬性名字的定義要求,與Java中對(duì)方法名字的定義要求不一致,導(dǎo)致出現(xiàn)不能自動(dòng)映射的情況,如year-made標(biāo)簽屬性,就不可能有方法setYear-made;
  2、對(duì)于根元素,與其子元素建立聯(lián)系,有幾種辦法:一種是先生成根元素實(shí)例,壓入棧,然后解析,將調(diào)用方法規(guī)則建立聯(lián)系;另一種是解析的過(guò)程中第一個(gè)創(chuàng)建它,然后用getRoot的方法得到。
  3、如果某對(duì)象類構(gòu)造都要參數(shù),則此時(shí)需要擴(kuò)展AbstractObjectCreationFactory類為這種對(duì)象建立一個(gè)Factory,在這個(gè)Factory中取得初始化參數(shù)值然后再創(chuàng)建一個(gè)對(duì)象實(shí)例。
  4、設(shè)有某個(gè)標(biāo)簽,要想自動(dòng)用該標(biāo)簽子元素的內(nèi)容填充該標(biāo)簽對(duì)應(yīng)的對(duì)象的屬性,則需要用digester.setRules(new ExtendedBaseRules()),然后addRules(),然后再調(diào)用addBeanPropertySetter("bala/lala/?");進(jìn)行規(guī)則定義,注意此模板中有通配符。
  5、如果對(duì)象的屬性是整型,則Digester自動(dòng)將xml文件中字符串值轉(zhuǎn)換為整型。
  6、在指明要digester考慮命名空間之后,如果不會(huì)引起歧義,完全可以忽略命名空間的存在,除非你要針對(duì)特定的命名空間進(jìn)行特定的處理。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多