- 浏览: 802148 次
- 性别:
- 来自: 西安
文章分类
- 全部博客 (307)
- struts (8)
- hibernate (3)
- spring (32)
- opensourceproject (12)
- javaScript (9)
- primeton EOS (2)
- journey of heart (10)
- Design pattern (6)
- ejb (17)
- point (37)
- Linux&Unix (22)
- ibatis (10)
- AJAX (6)
- DB (26)
- Protocol (6)
- chart (4)
- web server (11)
- webservice (7)
- integration (3)
- tuxedo (5)
- ext (4)
- android (1)
- c/c++ (12)
- JVM (1)
- paginationFrame (2)
- code (2)
- report (1)
- High-performance web (1)
- svn (1)
- JQuery (1)
- workDaily (2)
- cloud (16)
- Python (8)
- English (2)
- shell (5)
- googleCode (1)
- nio (1)
- hyper-v (1)
- debug (3)
- vbs (2)
- openstack (3)
- K8S (1)
- Mesos (0)
- Spark (0)
- Marathon (0)
最新评论
-
钱图大展:
chao2751021 写道lib包哪里去下载,找不到
大型网站用户行为记录的一个实现--基于clickStream(第一部分) -
钱图大展:
无法下载
大型网站用户行为记录的一个实现--基于clickStream(第一部分) -
fm395728572:
shell脚本中用到了环境变量,但是获取不到,例如脚本中有一句 ...
ganymed-ssh2 for Java -
liuhanjiang:
我qq147229234
大型网站用户行为记录的一个实现--基于clickStream(第一部分) -
liuhanjiang:
博主 我利用您提供的方法实现博文中介绍的clickstream ...
大型网站用户行为记录的一个实现--基于clickStream(第一部分)
digester组件简化了xml文件处理操作,能将xml文件按照事先确定的规则(采用编码形式或xml配置文件形式),映射成java对象。digester组件现在最新版本是2.0,它所依赖的组件是:commons-logging(推荐1.1版本),BeanUtils(推荐1.8版本),还有需要jdk1.5.
基本概念
1. 在Digester的内部采用SAX来解析XML文件。为了能够正确的使用它,必须在解析之前进行相应的设置。同时,在解析xml文件的过程中,它使用Stack来保存和检索这个期间产生的对象.
2. 为了简化使用,它通过匹配模式来定位要解析的xml标签。匹配模式的例子如下:
<?xml version="1.0"?> <students> <student> <name>Tom</name> <course>JSP</course> </student> <student> <name>Mary</name> <course>J2EE</course> </student> </students>
每个标签与相应的匹配模式对应如下表:
标签 匹配模式
<students> students
<student> students/student
<name> students/student/name
<course> students/student/course
3. 使用匹配模式可以很方便的定位需要处理的元素,为了处理这些元素,需要定义处理规则。规则在匹配模式被找到时起作用。所有的规则都是从org.apache.commons.digester.Rule派生的。所有已定义的Rule对象,可以在org.apache.commons.digester中找到。
常用的规则:
- ObjectCreate,创建对象实例。
- SetProperties,将标签属性(Attribute)与要创建的对象的属性相关联。
- BeanPropertySetter,将标签所包含标签与要创建的对象的属性相关联。
- SetNext,设置遇到下一个标签时的动作。
- CallMethod,设置当匹配模式被找到时要调用的方法。
- CallParam,设置对应的callMethod中指定方法所需要的参数值。
基本使用
以正确的顺序调用Digester方法是成功使用Digester处理XML文件的关键。使用步骤如下:
1. 创建org.apache.commons.digester.Digester实例并配置,包括设置实现Digester Rule的对象。
2. 使用Digester的push方法在Digester使用的stack中放置一个初始对象。在解析xml文件的过程中,Digester使用stack来保存它所找到的对象。第一个对象在遇到第一个标签时被放置到stack中,当最后一个标签处理完毕时被弹出。为了最后能检索到这个对象,因此需要一个初始对象来保留一个指向它的引用。
3. 注册匹配模式和rule。
4. 调用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.硬编码形式实现
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; } } 处理类 view plaincopy to clipboardprint? package com.tongda.whl.digester; import org.apache.commons.digester.*; import org.apache.commons.logging.*; import java.io.IOException; import java.util.Vector; import org.apache.commons.digester.xmlrules.*; import org.xml.sax.SAXException; public class DigestTest { private Log log=LogFactory.getLog(this.getClass()); private Vector students; public DigestTest(){ students= new Vector(5); } public void addStudent( Student student){ students.add( student); } public String toString(){ return ((Student)students.get(0)).getName(); } public void digest(){ //digest2.0支持jdk1.5,并且依赖 logging 1.1.1 和 beanutils 1.8.0 //创建实例 Digester digester= new Digester(); //将初始对象压入digester的stack digester.push( this); //指明匹配模式和要创建的类 digester.addObjectCreate( "students/student", Student.class); //设置对象属性 // digester digester.addBeanPropertySetter( "students/student/name"); digester.addBeanPropertySetter( "students/student/course"); //当移动到下一个标签中时的动作 digester.addSetNext( "students/student", "addStudent"); try { //解析,xml文件放在classpath下 DigestTest ds= (DigestTest)digester.parse( getClass().getClassLoader().getResourceAsStream( "students.xml")); log.info(ds); } catch (Exception e) { e.printStackTrace(); } } public static void main(String args[]){ DigestTest test=new DigestTest(); test.digest(); } } package com.tongda.whl.digester; import org.apache.commons.digester.*; import org.apache.commons.logging.*; import java.io.IOException; import java.util.Vector; import org.apache.commons.digester.xmlrules.*; import org.xml.sax.SAXException; public class DigestTest { private Log log=LogFactory.getLog(this.getClass()); private Vector students; public DigestTest(){ students= new Vector(5); } public void addStudent( Student student){ students.add( student); } public String toString(){ return ((Student)students.get(0)).getName(); } public void digest(){ //digest2.0支持jdk1.5,并且依赖 logging 1.1.1 和 beanutils 1.8.0 //创建实例 Digester digester= new Digester(); //将初始对象压入digester的stack digester.push( this); //指明匹配模式和要创建的类 digester.addObjectCreate( "students/student", Student.class); //设置对象属性 // digester digester.addBeanPropertySetter( "students/student/name"); digester.addBeanPropertySetter( "students/student/course"); //当移动到下一个标签中时的动作 digester.addSetNext( "students/student", "addStudent"); try { //解析,xml文件放在classpath下 DigestTest ds= (DigestTest)digester.parse( getClass().getClassLoader().getResourceAsStream( "students.xml")); log.info(ds); } catch (Exception e) { e.printStackTrace(); } } public static void main(String args[]){ DigestTest test=new DigestTest(); test.digest(); } } 结果显示:Tom 3.配置文件方式实现 配置文件: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(); } } 处理类 view plaincopy to clipboardprint? package com.tongda.whl.digester; import org.apache.commons.digester.*; import org.apache.commons.logging.*; import java.io.IOException; import java.util.Vector; import org.apache.commons.digester.xmlrules.*; import org.xml.sax.SAXException; public class DigestTest { private Log log=LogFactory.getLog(this.getClass()); public void digestByConfig(){ Digester digester = DigesterLoader.createDigester(this.getClass().getClassLoader().getResource("studentsRule.xml")); try { Students a= (Students)digester.parse( this.getClass().getClassLoader().getResourceAsStream("students.xml")); System.out.println(a); log.info(a); } catch (IOException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } } public static void main(String args[]){ DigestTest test=new DigestTest(); test.digestByConfig(); } } package com.tongda.whl.digester; import org.apache.commons.digester.*; import org.apache.commons.logging.*; import java.io.IOException; import java.util.Vector; import org.apache.commons.digester.xmlrules.*; import org.xml.sax.SAXException; public class DigestTest { private Log log=LogFactory.getLog(this.getClass()); public void digestByConfig(){ Digester digester = DigesterLoader.createDigester(this.getClass().getClassLoader().getResource("studentsRule.xml")); try { Students a= (Students)digester.parse( this.getClass().getClassLoader().getResourceAsStream("students.xml")); System.out.println(a); log.info(a); } catch (IOException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } } public static void main(String args[]){ DigestTest test=new DigestTest(); test.digestByConfig(); } }
结果显示:Tom
在使用Digester需要注意的地方:
1- 调用顺序,正确的调用顺序才能得出正确的结果。方法调用顺序基本和标签在xml文件中的层次关系相对应。基本的顺序是:先创建对象;然后设置属性;随后处理子元素;最后设置遇到下一个元素所对应的动作。对于子元素的处理,是同样的过程。
2- 正确的使用初始对象。对比上面2个例子,之所以在第一个例子中显示的调用了digester的push方法,其原因就在于我们并没有如第二个例子一样用xml的root元素创建一个实例。如果不显式的调用,我们将会丢失这个元素的引用,那么也就无法得到后续的对象。
3- digester的addSetNex方法中所指定的方法实际上是包含匹配模式对应标签的父标签对应对象的方法。在上两个例子中addStudent,都是包含Student对象的那个对象的方法。对于第一个例子,是DigesterTest;对于第二个例子,是Students。而且它的位置通常是在创建对象语句组的最后,与addObjectCreate相对应。在这2个语句之间的代码中所指定的方法都是所创建对象的方法。而且它们的顺序与匹配模式所对应的标签的顺序必须是一致的。
4- 使用配置文件来创建digester,这样会带来很大的灵活性。
参考:
http://blog.csdn.net/terryzero/archive/2009/07/08/4332257.aspx
发表评论
-
eclipse link 方式管理插件
2012-02-24 15:55 1501以配置tomcat插件为例: (条件:F:\eclip ... -
使用mapinfo 开发GIS 应用
2011-03-18 06:56 12591. mapJ 对象是在tomcat启动的时候 从web ... -
java mail adapter
2011-01-21 12:23 15092011.04.27: 使用jmail 发送中文标题的 ... -
4种调用https服务的方式
2011-01-05 23:45 8732以前在网厅的时候,请求计费的账单开 ... -
正则表达式30分钟入门教程
2010-11-17 12:58 1448正则表达式30分钟入门教程 -
java 异常层次
2010-05-26 16:14 1311Java 中的异常类,包括内置的异常类以及自定义的异常类,都直 ... -
java 解惑你知多少 (转载)
2010-04-26 12:43 1172(1) http://jiangzhengjun.it ... -
jvm调优
2010-04-16 15:35 1253(1) http://pengjiaheng.itey ... -
谈谈重构
2010-04-15 13:34 1288代码重构阅读心得[转] http://www.cnblogs ... -
session会话跟踪的一个小例子
2010-03-14 18:16 1830内容包括: 必备知识: ... -
cookie机制和session机制的区别
2010-03-14 17:06 1171一、cookie机制和sessio ... -
Cookie详解
2010-03-14 16:02 1375Cookie在英文中是小甜品 ... -
什么是Cookie?
2010-03-14 15:06 1432按照Netscape官方文档中 ... -
任务、进程和线程的区别(转)
2010-02-04 17:16 2256任务(task)是最抽象 ... -
加密,解密,认证,数字签名,公钥私钥
2010-01-13 20:42 2296Bob,Alice和数字证书 网络安全中最知名的 ... -
JNI
2009-12-26 14:09 1555JNI是Java Native Inter ... -
JSON在处理hibernate中的cascade对象时的解决方案
2009-12-24 22:12 1500如果数据间存在级联关系,在hibernate中极容易嵌套而 ... -
什么是P问题、NP问题和NPC问题
2009-10-25 20:20 2020什么是P问题、NP问题和NPC问题 出自mat ... -
用Fat Jar Eclipse Plug-In打包可执行jar文件
2009-09-30 08:29 3928Fat Jar Eclipse Plug-In [FJEP] ... -
使用jxl操作excle文件
2009-09-14 08:20 1913有个需求 1. ...
相关推荐
Digester是Apache软件基金会的一个开源项目,它基于SAX解析器,但提供了更高级的抽象,将XML数据转换为Java对象(JavaBean)。Digester通过匹配XML元素和属性与JavaBean的setter方法,自动创建和填充Java对象。这...
Apache Commons Digester 是一个用于处理XML文档的Java库,它允许开发者通过定义一系列规则来将XML数据映射到Java对象的属性或者创建新的Java对象。这个库特别适用于配置文件的解析,因为它简化了从XML到Java对象...
Betwixt提供将 JavaBean 映射至 XML 文档,以及相反映射的服务. Chain Chain 提供实现组织复杂的处理流程的“责任链模式”. CLI CLI 提供针对命令行参数,选项,选项组,强制选项等的简单API. Codec Codec 包含...
commons-digester.jar 能方便地将 XML 文档所定义的元素转化为 JAVA 对象,例如将 XML 文件转换为 Java 对象、将 Java 对象转换为 XML 文件等等。 4. commons-lang.jar commons-lang.jar 扩展了标准 java.lang API...
- **Digester**:解析XML文档,并根据预定义的规则自动创建和配置Java对象。 - **Jelly**:基于标签库的脚本语言,用于生成XML或Java代码。 - **JXPath**:使用XPath表达式在Java对象模型(如Map和JavaBean)中...
commons-digester.jar 的作用是提供了一个方便的方式来将 XML 文档转换为 Java 对象,简化了开发者的工作。 4. Commons-lang.jar: commons-lang.jar 扩展了标准 java.lang API,增加了字符串操作方法、基本数值...
7. **commons-digester.jar**: 用于将XML文档映射到Java对象,简化了从XML配置文件创建Java对象的过程。 8. **commons-fileupload.jar**: 实现了文件上传功能,常用于Web应用中接收用户上传的文件。 9. **commons-...
11. **Digester**: Digester组件可以将XML文档映射到Java对象,常用于解析XML配置文件,实现对象的自动创建和初始化。 12. **Discovery**: Commons-Discovery提供了定位资源和服务的工具,支持通过不同的模式映射...
11. Commons-digester.jar:这是一个 Common 项目中用来解析 XML 的工具包,提供了从 XML 到 JavaBean 的映射。相较于传统的 W3C、SAX 方式解析 XML 文档,Digester 的层次更高,适合更懒得家伙。 12. Commons-...
3. **Commons Betwixt**: 用于将 JavaBean 映射到 XML 文档,并支持反向映射,方便 Java 对象与 XML 数据之间的转换。 4. **Commons Chain**: 实现了设计模式中的“责任链模式”,允许构建复杂的处理流程,每个处理...