前段时间项目中需要根据xml文件创建java对象,而apache commons-digester是首选.

一直想把它写下来,可是总有点懒这次介绍一下digester的常用法,其他更高级的使用方法请参阅digester doc(由于比较忙,下次有时间写一篇关于cglib的常用法,呵呵)

Apache Digester应用实例 [原创]

————–利用 apache commons-digester 自动根据xml文件创建java 对象



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. public Academy() {
  6. students = new Vector();
  7. teachers = new Vector();
  8. }
  9. public void addStudent(Student student) {
  10. students.addElement(student);
  11. }
  12. public void addTeacher(Teacher teacher) {
  13. teachers.addElement(teacher);
  14. }
  15. public Vector getStudents() {
  16. return students;
  17. }
  18. public void setStudents(Vector newStudents) {
  19. students = newStudents;
  20. }
  21. public Vector getTeachers() {
  22. return teachers;
  23. }
  24. public void setTeachers(Vector newTeachers) {
  25. teachers = newTeachers;
  26. }
  27. public String getName() {
  28. return name;
  29. }
  30. public void setName(String newName) {
  31. name = newName;
  32. }
  33. }


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

2.学生 Student.java

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


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

3.老师 Teacher.java

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


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

4.课程 Course.java

Java代码 复制代码
  1. public class Course {
  2. private String id;
  3. private String name;
  4. public Course() {
  5. }
  6. public String getId() {
  7. return id;
  8. }
  9. public void setId(String newId) {
  10. id = newId;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String newName) {
  16. name = newName;
  17. }
  18. }


三.基础XML文件

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

学院 academy.xml,包含了学生(包含了课程),老师

Java代码 复制代码
  1. C1
  2. JSP
  3. C2
  4. Servlets
  5. C3
  6. EJB
  7. SCJP
  8. SCWCD
  9. OCP
  10. SCJP
  11. SCEA


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

四.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. paramcount=”1″ />


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

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. //Parse academy.xml using the Digester to get an instance of Academy
  8. Academy a = (Academy)digester.parse(
  9. this.getClass().getClassLoader().getResourceAsStream(“academy.xml”));
  10. Vector vStud=a.getStudents();
  11. Vector vTeach=a.getTeachers();
  12. for (int i = 0; i < vStud.size(); i++) {
  13. System.out.println(“Student>> “+PropertyUtils.describe(vStud.get(i)));
  14. }
  15. for (int i = 0; i < vTeach.size(); i++) {
  16. System.out.println(“Teacher>> “+ PropertyUtils.describe(vTeach.get(i)));
  17. }
  18. } catch(Exception e) {
  19. e.printStackTrace();
  20. }
  21. }
  22. public static void main(String[] args) {
  23. DigestXMLJavaAcademy xmlDigest= new DigestXMLJavaAcademy();
  24. xmlDigest.digest();
  25. }
  26. }


五.运行结果

自己运行吧,呵呵

六.后记

写下来还真得花点时间呢,不过这也是对自己以前思路的一个整理.

写出来与大家共同分享也是一种乐趣.呵呵.

下次有时间写一篇关于cglib的常用法.

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注