Sealyu

          --- 博客已遷移至: http://www.sealyu.com/blog

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            618 隨筆 :: 87 文章 :: 225 評論 :: 0 Trackbacks
          前段時間項目中需要根據xml文件創建java對象,而apache commons-digester是首選.
          一直想把它寫下來,可是總有點懶這次介紹一下digester的常用法,其他更高級的使用方法請參閱digester doc(由于比較忙,下次有時間寫一篇關于cglib的常用法,呵呵)
          Apache Digester應用實例 [原創]
          --------------利用 apache commons-digester 自動根據xml文件創建java 對象
          <day day up>
          author: binker
          email: binker_cao@163.com
          date: 2006/12/16
          note: 本文可以任意轉載,但請保持其完整性并注明來源,謝謝.

          一.序
            Digester是apache的一個組件 apache commons-digester.jar,通過它可以很方便的從xml文件生成java對象.你不用再象以前通過jdom或者Xerces去讀取一個document對象.(jdom和Xerces仍然有它們的用武之地及強大之處,在其它應用里你也少不了它們)
          我只是用一個例子展示一下如何把xml文件生成一個java object.
          首先你必須把jar加入到你的項目classpath.
          (一)準備:
          1.環境: Eclipse, jdk1.4+
          2.需求說明:學院包含學生和老師,學生可以選修課程,老師有不同的資格認證。
          3.Java Class的定義,簡潔起見,略去import內容。
          4.使用Digester生成java對象 必須要定義一個xml文件,此xml文件必須符合digester-rules.dtd的規則。
          5.所有的xml文件必須在classpath路徑中,這樣可以通過Class.getClassLoader().getInputStream()讀取xml文件。

          (二)提要:
            本示例所需的java class 和 xml文件分成四類:
          1.基礎xml文件: [academy.xml]: 你將要解析的xml文件.
          2.基礎java class: [Academy.java, Teacher.java, Student.java, Cousre.java]: 生成的對象的類定義
          3.digesterRules.xml: [academyRules.xml]: 定義了基礎xml文件到基礎java class的匹配(映射)關系
          4.Digester class: [DigestXMLJavaAcademy.java]: 根據digesterRules.xml去解析基礎xml文件,并生成java 對象

          (三)參考資料
             1.English ebook: Pro Jakarta Commons by Harshad Oak  Apress 2004

          二.基礎Java Class
          1.學院 class Academy.java
          Java代碼 復制代碼
          1. public class Academy {  
          2.     private Vector students;  
          3.     private Vector teachers;  
          4.     private String name;  
          5.   
          6.     public Academy() {  
          7.         students = new Vector();  
          8.         teachers = new Vector();  
          9.     }  
          10.   
          11.     public void addStudent(Student student) {  
          12.         students.addElement(student);  
          13.     }  
          14.   
          15.     public void addTeacher(Teacher teacher) {  
          16.         teachers.addElement(teacher);  
          17.     }  
          18.   
          19.     public Vector getStudents() {  
          20.         return students;  
          21.     }  
          22.   
          23.     public void setStudents(Vector newStudents) {  
          24.         students = newStudents;  
          25.     }  
          26.     public Vector getTeachers() {  
          27.         return teachers;  
          28.     }  
          29.   
          30.     public void setTeachers(Vector newTeachers) {  
          31.         teachers = newTeachers;  
          32.     }  
          33.   
          34.     public String getName() {  
          35.         return name;  
          36.     }  
          37.   
          38.     public void setName(String newName) {  
          39.         name = newName;  
          40.     }  
          41. }  

          ============================================================
          2.學生 Student.java
          Java代碼 復制代碼
          1. public class Student {  
          2.     private Vector courses;  
          3.     private String name;  
          4.     private String division;  
          5.   
          6.     public Student() {  
          7.         courses = new Vector();  
          8.     }  
          9.   
          10.     public void addCourse(Course course) {  
          11.         courses.addElement(course);  
          12.     }  
          13.   
          14.     public String getName() {  
          15.         return name;  
          16.     }  
          17.     public void setName(String newName) {  
          18.         name = newName;  
          19.     }  
          20.   
          21.     public String getDivision() {  
          22.         return division;  
          23.     }  
          24.   
          25.     public void setDivision(String newDivision) {  
          26.         division = newDivision;  
          27.     }  
          28.   
          29.     public void setCourses(Vector courses) {  
          30.         this.courses = courses;  
          31.     }  
          32.   
          33.     public Vector getCourses() {  
          34.         return courses;  
          35.     }  
          36. }  

          ============================================================
          3.老師 Teacher.java
          Java代碼 復制代碼
          1. public class Teacher {  
          2.     private String name;  
          3.     private Vector certifications;  
          4.   
          5.     public Teacher() {  
          6.         certifications = new Vector();  
          7.     }  
          8.   
          9.     public void addCertification(String certification) {  
          10.         certifications.addElement(certification);  
          11.     }  
          12.   
          13.     public String getName() {  
          14.         return name;  
          15.     }  
          16.   
          17.     public void setName(String newName) {  
          18.         name = newName;  
          19.     }  
          20.   
          21.     public void setCertifications(Vector certifications) {  
          22.         this.certifications = certifications;  
          23.     }  
          24.   
          25.     public Vector getCertifications() {  
          26.         return certifications;  
          27.     }  
          28. }  

          ============================================================
          4.課程 Course.java
          Java代碼 復制代碼
          1. public class Course {  
          2.     private String id;  
          3.     private String name;  
          4.   
          5.     public Course() {  
          6.     }  
          7.   
          8.     public String getId() {  
          9.         return id;  
          10.     }  
          11.   
          12.     public void setId(String newId) {  
          13.         id = newId;  
          14.     }  
          15.     public String getName() {  
          16.         return name;  
          17.     }  
          18.   
          19.     public void setName(String newName) {  
          20.         name = newName;  
          21.     }  
          22. }  

          三.基礎XML文件
          ============================================================
          學院 academy.xml,包含了學生(包含了課程),老師
          Java代碼 復制代碼
          1. <?xml version="1.0"?>  
          2. <academy name="JAcademy" >  
          3.          <student name="JavaBoy" division="A">  
          4.                   <course>  
          5.                       <id>C1</id>  
          6.                       <name>JSP</name>  
          7.                   </course>  
          8.                   <course>  
          9.                       <id>C2</id>  
          10.                       <name>Servlets</name>  
          11.                   </course>  
          12.          </student>  
          13.          <student name="JavaGirl" division="B">  
          14.                   <course>  
          15.                       <id>C3</id>  
          16.                       <name>EJB</name>  
          17.                   </course>  
          18.          </student>  
          19.   
          20.          <teacher name="JavaGuru">  
          21.                   <certification>SCJP</certification>  
          22.                   <certification>SCWCD</certification>  
          23.          </teacher>  
          24.          <teacher name="JavaMaster">  
          25.                   <certification>OCP</certification>  
          26.                   <certification>SCJP</certification>  
          27.                   <certification>SCEA</certification>  
          28.          </teacher>  
          29. </academy>  

          ============================================================

          四.Digester Class
          DigestXMLJavaAcademy.java 和academyRules.xml
          其中academyRules.xml用來定義xml文件和java對象的匹配(映射)關系,格式要符合digester-rules.dtd格式約束
          DigestXMLJavaAcademy.java 根據academyRules.xml解析academy.xml文件并生成 Academy對象.
          ============================================================
          Java代碼 復制代碼
          1. 1. academyRules.xml  
          2. <?xml version="1.0"?>  
          3. <digester-rules>  
          4.   <pattern value="academy">  
          5.       <object-create-rule classname="com.commonsbook.chap7.academy.Academy" />  
          6.      <set-properties-rule />  
          7.      <pattern value="student">  
          8.          <object-create-rule classname="com.commonsbook.chap7.academy.Student" />  
          9.          <set-properties-rule />  
          10.   
          11.          <pattern value="course">  
          12.              <object-create-rule classname="com.commonsbook.chap7.academy.Course" />  
          13.              <bean-property-setter-rule pattern="id"/>  
          14.              <bean-property-setter-rule pattern="name"/>  
          15.              <set-next-rule methodname="addCourse" />  
          16.          </pattern>  
          17.          <set-next-rule methodname="addStudent" />  
          18.      </pattern>  
          19.   
          20.      <pattern value="teacher">  
          21.          <object-create-rule classname="com.commonsbook.chap7.academy.Teacher" />  
          22.          <set-properties-rule />  
          23.          <call-method-rule pattern="certification" methodname="addCertification"  
          24.              paramcount="1" />  
          25.          <call-param-rule pattern="certification" paramnumber="0"/>  
          26.          <set-next-rule methodname="addTeacher" />  
          27.      </pattern>  
          28.  </pattern>  
          29. </digester-rules>  

          ============================================================
          2. DigestXMLJavaAcademy.java
          Java代碼 復制代碼
          1. public class DigestXMLJavaAcademy {  
          2.     public void digest(){  
          3.         try {  
          4.             //Create Digester using rules defined in academyRules.xml  
          5.             Digester digester = DigesterLoader.createDigester(  
          6.                      this.getClass().getClassLoader().getResource("academyRules.xml"));  
          7.   
          8.             //Parse academy.xml using the Digester to get an instance of Academy  
          9.             Academy a = (Academy)digester.parse(  
          10.             this.getClass().getClassLoader().getResourceAsStream("academy.xml"));  
          11.   
          12.             Vector vStud=a.getStudents();  
          13.             Vector vTeach=a.getTeachers();  
          14.   
          15.             for (int i = 0; i < vStud.size(); i++) {  
          16.                 System.out.println("Student>> "+PropertyUtils.describe(vStud.get(i)));  
          17.             }  
          18.   
          19.             for (int i = 0; i < vTeach.size(); i++) {  
          20.                 System.out.println("Teacher>> "+ PropertyUtils.describe(vTeach.get(i)));  
          21.             }  
          22.          } catch(Exception e) {  
          23.              e.printStackTrace();  
          24.          }  
          25.     }  
          26.   
          27.     public static void main(String[] args) {  
          28.         DigestXMLJavaAcademy xmlDigest= new DigestXMLJavaAcademy();  
          29.         xmlDigest.digest();  
          30.     }  
          31. }  

          五.運行結果
          自己運行吧,呵呵

          六.后記
          寫下來還真得花點時間呢,不過這也是對自己以前思路的一個整理.
          寫出來與大家共同分享也是一種樂趣.呵呵.
          下次有時間寫一篇關于cglib的常用法.
          posted on 2008-09-24 09:59 seal 閱讀(517) 評論(0)  編輯  收藏 所屬分類: Strutsweb
          主站蜘蛛池模板: 安阳县| 镇巴县| 长子县| 仁布县| 克山县| 清水县| 清河县| 宜宾县| 东乡族自治县| 疏勒县| 南昌县| 恩施市| 新竹县| 冀州市| 新巴尔虎右旗| 芜湖县| 阿鲁科尔沁旗| 廉江市| 花垣县| 诸城市| 无锡市| 定结县| 阳谷县| 四子王旗| 来安县| 绥阳县| 木兰县| 纳雍县| 博野县| 马龙县| 巴林左旗| 商水县| 敦煌市| 陵川县| 宁津县| 乐业县| 黔西县| 册亨县| 越西县| 南宫市| 文化|