久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

常用jar包之commons-digester使用

 catph 2011-06-07

 digester組件簡化了xml文件處理操作,能將xml文件按照事先確定的規(guī)則(采用編碼形式或xml配置文件形式),,映射成java對象,。 digester組件現(xiàn)在最新版本是2.0,它所依賴的組件是:commons-logging(推薦1.1版本),BeanUtils(推薦1.8版 本),,還有需要jdk1.5.


基本概念
1. 在Digester的內(nèi)部采用SAX來解析XML文件。為了能夠正確的使用它,必須在解析之前進行相應(yīng)的設(shè)置,。同時,,在解析xml文件的過程中,它使用Stack來保存和檢索這個期間產(chǎn)生的對象.
2. 為了簡化使用,,它通過匹配模式來定位要解析的xml標(biāo)簽,。匹配模式的例子如下:
<?xml version="1.0"?>
<students>
 <student>
 <name>Tom</name>
 <course>JSP</course>
 </student>
 <student>
 <name>Mary</name>
 <course>J2EE</course>
 </student>
</students>
每個標(biāo)簽與相應(yīng)的匹配模式對應(yīng)如下表:
標(biāo)簽              匹配模式
<students> students
<student>  students/student
<name>     students/student/name
<course>   students/student/course
3. 使用匹配模式可以很方便的定位需要處理的元素,為了處理這些元素,,需要定義處理規(guī)則,。規(guī)則在匹配模式被找到時起作用。所有的規(guī)則都是從 org.apache.commons.digester.Rule派生的,。所有已定義的Rule對象,,可以在 org.apache.commons.digester中找到。
常用的規(guī)則:
- ObjectCreate,,創(chuàng)建對象實例,。
- SetProperties,將標(biāo)簽屬性(Attribute)與要創(chuàng)建的對象的屬性相關(guān)聯(lián),。
- BeanPropertySetter,,將標(biāo)簽所包含標(biāo)簽與要創(chuàng)建的對象的屬性相關(guān)聯(lián)。
- SetNext,,設(shè)置遇到下一個標(biāo)簽時的動作,。
- CallMethod,設(shè)置當(dāng)匹配模式被找到時要調(diào)用的方法,。
- CallParam,,設(shè)置對應(yīng)的callMethod中指定方法所需要的參數(shù)值。


基本使用
以正確的順序調(diào)用Digester方法是成功使用Digester處理XML文件的關(guān)鍵,。使用步驟如下:
1. 創(chuàng)建org.apache.commons.digester.Digester實例并配置,,包括設(shè)置實現(xiàn)Digester Rule的對象。
2. 使用Digester的push方法在Digester使用的stack中放置一個初始對象,。在解析xml文件的過程中,,Digester使用stack 來保存它所找到的對象。第一個對象在遇到第一個標(biāo)簽時被放置到stack中,,當(dāng)最后一個標(biāo)簽處理完畢時被彈出,。為了最后能檢索到這個對象,因此需要一個初 始對象來保留一個指向它的引用,。
3. 注冊匹配模式和rule,。
4. 調(diào)用parse來解析xml文件。


使用舉例
1.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<students>
 <student>
 <name>Tom</name>
 <course>JSP</course>
 </student>
 <student>
 <name>Mary</name>
 <course>J2EE</course>
 </student>
</students>
2.硬編碼形式實現(xiàn)
Student類
package com.tongda.whl.digester;
public class Student {
 private String name;
 private String course;
 public void setName(String name){
  this.name=name;
 }
 public void setCourse(String course){
  this.course=course;
 }
 public String getName(){
  return this.name;
 }
 public String getCourse(){
  return this.course;
 }
}
處理類

  1. package com.tongda.whl.digester;  
  2. import org.apache.commons.digester.*;  
  3. import org.apache.commons.logging.*;  
  4. import java.io.IOException;  
  5. import java.util.Vector;  
  6. import org.apache.commons.digester.xmlrules.*;  
  7. import org.xml.sax.SAXException;  
  8. public class DigestTest {  
  9.  private Log log=LogFactory.getLog(this.getClass());  
  10.  private Vector students;  
  11.  public DigestTest(){  
  12.   students= new Vector(5);  
  13.  }  
  14.  public void addStudent( Student student){  
  15.   students.add( student);  
  16.  }  
  17.  public String toString(){  
  18.   return ((Student)students.get(0)).getName();  
  19.  }  
  20.  public void digest(){  
  21.   //digest2.0支持jdk1.5,并且依賴 logging 1.1.1 和 beanutils 1.8.0  
  22.   //創(chuàng)建實例  
  23.   Digester digester= new Digester();  
  24.   //將初始對象壓入digester的stack  
  25.   digester.push( this);  
  26.   //指明匹配模式和要創(chuàng)建的類  
  27.   digester.addObjectCreate( "students/student", Student.class);  
  28.   //設(shè)置對象屬性  
  29.  // digester  
  30.   digester.addBeanPropertySetter( "students/student/name");  
  31.   digester.addBeanPropertySetter( "students/student/course");  
  32.   //當(dāng)移動到下一個標(biāo)簽中時的動作  
  33.   digester.addSetNext( "students/student""addStudent");  
  34.   try {  
  35.   //解析,,xml文件放在classpath下  
  36.    DigestTest ds= (DigestTest)digester.parse( getClass().getClassLoader().getResourceAsStream( "students.xml"));    
  37.     log.info(ds);  
  38.   } catch (Exception e) {  
  39.   e.printStackTrace();  
  40.    }  
  41.  }  
  42.  public static void main(String args[]){  
  43.   DigestTest test=new DigestTest();  
  44.   test.digest();  
  45.  }   
  46. }  

 

結(jié)果顯示:Tom
3.配置文件方式實現(xiàn)
 配置文件:studentsRule.xml
 <?xml version="1.0"?>
<digester-rules>
 <pattern value="students">
 <object-create-rule classname="com.tongda.whl.digester.Students" />
 <set-properties-rule />
 <pattern value="student">
 <object-create-rule classname="com.tongda.whl.digester.Student" />
 <bean-property-setter-rule pattern="name"/>
 <bean-property-setter-rule pattern="course"/>
 <set-next-rule methodname="addStudent" />
 </pattern>
 </pattern>
</digester-rules>
Student類
package com.tongda.whl.digester;
public class Student {
 private String name;
 private String course;
 public void setName(String name){
  this.name=name;
 }
 public void setCourse(String course){
  this.course=course;
 }
 public String getName(){
  return this.name;
 }
 public String getCourse(){
  return this.course;
 }
}
Students類
package com.tongda.whl.digester;
import java.util.Vector;
public class Students {
  private Vector students;
  public Students(){
   students= new Vector(5);
 }
  public void addStudent( Student student){
   students.add( student);
  }
  public String toString(){
     return ((Student)students.get(0)).getName();
  }
}
處理類

  1. package com.tongda.whl.digester;  
  2. import org.apache.commons.digester.*;  
  3. import org.apache.commons.logging.*;  
  4. import java.io.IOException;  
  5. import java.util.Vector;  
  6. import org.apache.commons.digester.xmlrules.*;  
  7. import org.xml.sax.SAXException;  
  8. public class DigestTest {  
  9.  private Log log=LogFactory.getLog(this.getClass());  
  10.  public void digestByConfig(){  
  11.   Digester digester = DigesterLoader.createDigester(this.getClass().getClassLoader().getResource("studentsRule.xml"));  
  12.   try {  
  13.   Students a= (Students)digester.parse( this.getClass().getClassLoader().getResourceAsStream("students.xml"));  
  14.      System.out.println(a);  
  15.   log.info(a);  
  16.   } catch (IOException e) {  
  17.   e.printStackTrace();  
  18.  } catch (SAXException e) {  
  19.   e.printStackTrace();  
  20.  }  
  21.  }  
  22.  public static void main(String args[]){  
  23.   DigestTest test=new DigestTest();  
  24.   test.digestByConfig();  
  25.  }   
  26. }  

 

結(jié)果顯示:Tom


在使用Digester需要注意的地方:
1- 調(diào)用順序,,正確的調(diào)用順序才能得出正確的結(jié)果。方法調(diào)用順序基本和標(biāo)簽在xml文件中的層次關(guān)系相對應(yīng),?;镜捻樞蚴牵合葎?chuàng)建對象,;然后設(shè)置屬性;隨后處理子元素,;最后設(shè)置遇到下一個元素所對應(yīng)的動作,。對于子元素的處理,是同樣的過程,。
2- 正確的使用初始對象,。對比上面2個例子,之所以在第一個例子中顯示的調(diào)用了digester的push方法,,其原因就在于我們并沒有如第二個例子一樣用xml的root元素創(chuàng)建一個實例,。如果不顯式的調(diào)用,我們將會丟失這個元素的引用,,那么也就無法得到后續(xù)的對象,。
3- digester的addSetNex方法中所指定的方法實際上是包含匹配模式對應(yīng)標(biāo)簽的父標(biāo)簽對應(yīng)對象的方法。在上兩個例子中addStudent,,都 是包含Student對象的那個對象的方法,。對于第一個例子,是DigesterTest,;對于第二個例子,,是Students。而且它的位置通常是在創(chuàng) 建對象語句組的最后,,與addObjectCreate相對應(yīng),。在這2個語句之間的代碼中所指定的方法都是所創(chuàng)建對象的方法,。而且它們的順序與匹配模式所 對應(yīng)的標(biāo)簽的順序必須是一致的,。
4- 使用配置文件來創(chuàng)建digester,這樣會帶來很大的靈活性,。

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多