java digester_Digester学习笔记(一)
在windows下开发程序,用M$提供的接口处理.ini文件或管理注册表的键值是非常方便的。在java平台上开发程序,则习惯于以xml格式的文件来存放系统的配置信息,对这种文件的解析和处理,可以用sax或 dom。有没有更简便的方法呢?有,就是用digester模块。
Digester是Jakarta 子项目Commons下的一个模块,支持基于规则的对任意XML文档的处理。它最初是Structs项目的一部分,后因其通用性而划归Commons.
password: anoncvs
cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic checkout jakarta-commons/digester
cd jakarta-commons/digester
ant dist
Digester的运行依赖下列包:
public class Foo {
public void addBar(Bar bar);
public Bar findBar(int id);
public Iterator getBars();
public String getName();
public void setName(String name);
}
public mypackage;
public class Bar {
public int getId();
public void setId(int id);
public String getTitle();
public void setTitle(String title);
}
用下面的xml文件进行配置
用下面几行代码即可完成配置文件解析工作:
Digest解析代码
注释
Digester digester = new Digester();
digester.setValidating(false);
不进行XML与相应的DTD的合法性验证
digester.addObjectCreate("foo", "mypackage.Foo");
当遇到时创建一个mypackage.Foo对象,并将其放在栈顶
digester.addSetProperties("foo");
根据元素的属性(attribute),对刚创建的Foo对象的属性(property)进行设置
digester.addObjectCreate("foo/bar", "mypackage.Bar");
当遇到的子元素时创建一个mypackage.Bar对象,并将其放在栈顶。
digester.addSetProperties("foo/bar");
根据元素的属性(attribute),对刚创建的Bar对象的属性(property)进行设置
digester.addSetNext("foo/bar", "addBar", "mypackage.Bar");
当再次遇到的子元素时创建一个mypackage.Bar对象,并将其放在栈顶,同时调用第二栈顶元素(Foo对象)的addBar方法。
Foo foo = (Foo) digester.parse();
分析结束后,返回根元素。
使用Digester,须按照以下步骤:
具体说来,元素和其子元素间,用”/”相隔,如果一些元素前没有”/”则其必为根元素。如例:
-- 匹配模板 "a/b"
-- 匹配模板 "a/b/c"
-- 匹配模板 "a/b/c"
-- 匹配模板 "a/b"
-- 匹配模板 "a/b/c"
-- 匹配模板 "a/b/c"
-- 匹配模板 "a/b/c"
字符”*”表示任意级别,如”*/a”表示任意级别的都可匹配(不包括根元素级的).熟悉XLST的朋友,对这种思路一定不陌生。
从上面的描述,可知某个元素同时满足多个匹配模板是非常可能的,在这种情况下,与各个模板相关联的处理规则(processing rule)的执行顺序如下:对begin或body方法,按照各个rule的注册顺序的先后,对end方法则是注册顺序的反序。
从形式上讲,一个处理规则是一个java类,它扩展了org.apache.commons.digester.Rule类。每个处理规则,实现下列的一个或几个事件处理方法(event method),当相应的模板匹配成功以后,在已定义的某个时刻,这些事件方法会被触发。
在设置digester时,通过调用addRule()方法,来注册一个特定的元素匹配模板以及相应的一个Rule类的实例。如上所述,Rule类中的事件处理方法,会在适当的时间被调用。这个机制,允许动态地生成Rule的实现。
另外,digester也提供了一些处理常见情况的处理规则类。
对这些标准的规则类,可以创建它们的实例,并调用digester.addRule来注册它们。由于经常使用它们,所以digester定义了一些简便的方法来注册它们。如:
digester.addRule("a/b/c", rule);
java digester_Digester学习笔记(一)相关推荐
- Java NIO 学习笔记(三)----Selector
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- 可能是最全面的 Java G1学习笔记
转载自 可能是最全面的 Java G1学习笔记 引子 最近遇到很多朋友过来咨询G1调优的问题,我自己去年有专门学过一次G1,但是当时只是看了个皮毛,因此自己也有不少问题.总体来讲,对于G1我有几个疑惑 ...
- 深入浅出 Java CMS 学习笔记
转载自 深入浅出 Java CMS 学习笔记 引子 带着问题去学习一个东西,才会有目标感,我先把一直以来自己对CMS的一些疑惑罗列了下,希望这篇学习笔记能解决掉这些疑惑,希望也能对你有所帮助. 1. ...
- Java NIO学习笔记之图解ByteBuffer
转载自 Java NIO学习笔记之图解ByteBuffer ByteBuffer前前后后看过好几次了,实际使用也用了一些,总觉得条理不够清晰. <程序员的思维修炼>一本书讲过,主动学习,要 ...
- 转载:mongoDB java驱动学习笔记
http://www.blogjava.net/watchzerg/archive/2012/09/22/388346.html mongoDB java驱动学习笔记 指定新mongo实例: Mong ...
- 2019年Java Web学习笔记目录
Java Web学习笔记目录 1.Java Web学习笔记01:动态网站初体验 2.Java Web学习笔记02:在Intellij里创建Web项目 3.Java Web学习笔记03:JSP元素 4. ...
- 【Java基础学习笔记】- Day11 - 第四章 引用类型用法总结
Java基础学习笔记 - Day11 - 第四章 引用类型用法总结 Java基础学习笔记 - Day11 - 第四章 引用类型用法总结 4.1 class作为成员变量 4.2 interface作为成 ...
- Java 虚拟机学习笔记 | 类加载过程和对象的创建流程
前言 创建对象是 Java 语言绕不开的话题,那么对象是如何创建出来的呢?我们今天就来聊一聊.对象创建第一步就是检查类是否加载,而类的加载又牵扯到类的加载过程.如果单说对象的创建而绕开类的加载过程,感 ...
- Java中大数据数组,Java基础学习笔记之数组详解
摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...
- Java IO学习笔记总结
Java IO学习笔记总结 前言 前面的八篇文章详细的讲述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字节流的操作 InputStreamReader和OutputStreamW ...
最新文章
- AI一周热闻:GitHub免费开放无限私有库;苹果市值蒸发超450亿美元;小米入股TCL...
- 【转帖】dopod touch diamond 应用小常识:)
- adguard没有核心 core no_业主装修最后悔的五个地方!没有之一
- Python-第三方库requests详解
- 关于程序员的脑筋急转弯(附答案)
- 单调栈思维 2021年度训练联盟热身训练赛第三场——K题	Summer Trip
- 封装EF code first用存储过程的分页方法
- USACO-Section1.3 Milking Cows (区间问题)
- 计算机视觉空间域(spatial)注意力机制——CBAM
- FontAwesome图标大全
- sublime test3 php语法错误高亮
- 确认OHS版本的方法
- aect17定义_美AECT日前发布新的教育技术定义
- 2、深入HTTP请求流程
- React State
- python dis模块
- 百度OCR识别图片文字,解决image format error错误
- Vue3 项目遇到的问题
- 数据结构与算法:实验报告(串及其应用)
- 基于html+css+js的图书管理系统