- 浏览: 85003 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
ssy341:
说的简单了点,和官网的文档差不多,多文件上传也不是很好,不过可 ...
jQuery插件AjaxFileUpload文件上传实现Javascript多文件上传功能 -
蓝凝幽偌:
有没有jar包?
org.apache.commons.net.ftp.FTPClient 的简单用法 -
tinguo002:
在这里缓缓走过,很为楼主钻研精神感动,也感谢楼主分享。
关于Struts2资源文件的配置
想弄清楚struts1到底是怎么解析struts-config.xml文件。于是在源代码中发现用的是apache的Digester库。第一次接触这个,于是好好的查阅了一番。
下面的代码,是从http://soft901.iteye.com/blog/335452上面弄过来的,自己改造了一下,只为了自己更清楚的理解。
待读取的XML文件datasource.xml:
Java代码
<?xml version="1.0"?>
<datasources>
<datasource>
<name>mysqldatasource</name>
<driver>com.jdbc.mysql.Driver</driver>
<url>jdbc:mysql://localhost:3306/test</url>
<username>root</username>
<password>1234</password>
</datasource>
<datasource>
<name>oracledatasource</name>
<driver>oracle.jdbc.driver.oracledriver</driver>
<url>jdbc:oracle:thin:@localhost:1521:orcl</url>
<username>scott</username>
<password>tiger</password>
</datasource>
</datasources>
此xml文件分2层结构,分别为:
<datasources>节点 其下包含2个<datasource>节点
<datasource>节点,其下包含各种信息节点 : 如:<name> 、<url>等。
我们的操作目标是把datasource中的信息节点的内容提取出来。
把每个<datasource>看做为一个对象,<datasource>中信息节点的内容为对象中的元素。
设定一个类DatasourceConfig.java 其内容如下:
Java代码
package xmlParse.digester;
public class DataSourceConfig {
private String name;
private String driver;
private String url;
private String username;
private String password;
public String getName() {
return name;
}
public String getDriver() {
return driver;
}
public String getUrl() {
return url;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public void setName(String name) {
this.name = name;
}
public void setDriver(String driver) {
this.driver = driver;
}
public void setUrl(String url) {
this.url = url;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public String toString() {
return "DataSource : " + "name : " + name + " Driver : " + driver
+ " URL : " + url + " Username : " + username + " Password : "
+ password;
}
}
其中设置解析的rule规则的方法有四种,一一列出代码。
第一种 使用addCallMethod方法,映射XML所对应的节点与这个Call method的参数即可,这个call method将读取的一个标签内所有的值存入对象,然后再存入一个集合中。
Java代码
package xmlParse.digester;
/**
* 利用digester来解析xml.
*/
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.digester.Digester;
import org.xml.sax.SAXException;
public class DigesterParseTest {
private List<DataSourceConfig> dataSources;
public static void main(String[] args) {
DigesterParseTest sd = new DigesterParseTest();
sd.digester();
System.out.println(sd.toString());
}
void digester() {
Digester digester = new Digester();
setDataSources(new ArrayList<DataSourceConfig>());
// 把当前对象压入到digester栈中。
digester.push(this);
/* 设定解析此xml文件的规则 */
// 将XML文件解析所对应的方法.this.addDataSource();参数个数为5个.
digester.addCallMethod("datasources/datasource", "addDataSource", 5);
digester.addCallParam("datasources/datasource/name", 0);
digester.addCallParam("datasources/datasource/driver", 1);
digester.addCallParam("datasources/datasource/url", 2);
digester.addCallParam("datasources/datasource/username", 3);
digester.addCallParam("datasources/datasource/password", 4);
try {
digester.parse("config/datasource.xml");
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
public void addDataSource(final String name, final String driver,
final String url, final String username, final String password) {
DataSourceConfig dataSource = new DataSourceConfig();
dataSource.setName(name);
dataSource.setDriver(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
getDataSources().add(dataSource);
}
public List<DataSourceConfig> getDataSources() {
return dataSources;
}
public void setDataSources(List<DataSourceConfig> dataSources) {
this.dataSources = dataSources;
}
public String toString() {
String newline = System.getProperty("line.separator");
StringBuffer buff = new StringBuffer();
if (getDataSources() != null) {
for (DataSourceConfig ds : getDataSources()) {
buff.append(newline).append(ds);
}
return buff.toString();
}
return "";
}
}
第二种 使用addObjectCreate方法,创建对象映射XML文件的属性对java Bean. 读取完一个对象将对象加入到一个集合中,然后再读取XML文件的下一个标签:
Java代码
package xmlParse.digester;
/**
* 利用digester来解析xml.
*/
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.digester.Digester;
import org.xml.sax.SAXException;
public class DigesterParseTest2 {
private List<DataSourceConfig> dataSources;
public static void main(String[] args) {
DigesterParseTest sd = new DigesterParseTest();
sd.digester();
System.out.println(sd.toString());
}
private void digester() {
Digester digester = new Digester();
setDataSources(new ArrayList<DataSourceConfig>());
// 把当前对象压入到digester栈中。
digester.push(this);
/* 设定解析此xml文件的规则 */
digester.addObjectCreate("datasources/datasource", DataSourceConfig.class);
//效果跟addSetProperties一样
// digester.addBeanPropertySetter("datasources/datasource/name","name");
// digester.addBeanPropertySetter("datasources/datasource/driver", "driver");
// digester.addBeanPropertySetter("datasources/datasource/url", "url");
// digester.addBeanPropertySetter("datasources/datasource/username", "username");
// digester.addBeanPropertySetter("datasources/datasource/password", "password");
Java代码
digester.addSetProperties("datasources/datasource/name");
digester.addSetProperties("datasources/datasource/driver");
digester.addSetProperties("datasources/datasource/url");
digester.addSetProperties("datasources/datasource/username");
digester.addSetProperties("datasources/datasource/password");
digester.addSetNext("datasources/datasource", "addDataSource");
try {
digester.parse("config/datasource.xml");
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
public void addDataSource(final DataSourceConfig datasource){
getDataSources().add(datasource);
}
public List<DataSourceConfig> getDataSources() {
return dataSources;
}
public void setDataSources(List<DataSourceConfig> dataSources) {
this.dataSources = dataSources;
}
public String toString() {
String newline = System.getProperty("line.separator");
StringBuffer buff = new StringBuffer();
if (getDataSources() != null) {
for (DataSourceConfig ds : getDataSources()) {
buff.append(newline).append(ds);
}
return buff.toString();
}
return "";
}
}
第三种:使用addRule方法来解析datasource.xml:
Java代码
private void digester() {
Digester digester = new Digester();
setDataSources(new Vector<DataSource>());
// 把当前对象压入到digester栈中。
digester.push(this);
Rule objectCreate = new ObjectCreateRule(DataSource.class);
digester.addRule("datasources/datasource", objectCreate);
digester.addRule("datasources/datasource", new SetNextRule(
"addDataSource"));
digester.addRule("datasources/datasource/name", new CallMethodRule(
"setName", 0, new Class[] { String.class }));
digester.addRule("datasources/datasource/driver", new CallMethodRule(
"setDriver", 0, new Class[] { String.class }));
digester.addRule("datasources/datasource/url", new CallMethodRule(
"setUrl", 0, new Class[] { String.class }));
digester.addRule("datasources/datasource/username", new CallMethodRule(
"setUsername", 0, new Class[] { String.class }));
digester.addRule("datasources/datasource/password", new CallMethodRule(
"setPassword", 0, new Class[] { String.class }));
try {
digester.parse("datasource.xml");
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
第四种:把规则写在xml文件中。新建rules.xml
Java代码
<? xml version = " 1.0 " ?>
<digester-rules>
<object-create-rule pattern=" datasources "
classname=" datasources " />
<pattern value=" datasources/datasource ">
<object-create-rule classname=" datasource " />
<call-method-rule pattern=" name " methodname=" setName "
paramcount=" 0 " />
<call-method-rule pattern=" driver " methodname=" setDriver "
paramcount=" 0 " />
<call-method-rule pattern=" url " methodname=" setUrl "
paramcount=" 0 " />
<call-method-rule pattern=" username " methodname=" setUsername "
paramcount=" 0 " />
<call-method-rule pattern=" password " methodname=" setPassword "
paramcount=" 0 " />
<set-next-rule methodname=" addDatasource " />
</pattern>
</digester-rules>
digester方法如下:
Java代码
private void digester() {
setDataSources(new ArrayList<DataSourceConfig>());
try {
File rules = new File("config/rules.xml");
//创建digester对象并指定解析规则
Digester digester = DigesterLoader.createDigester(rules.toURL());
digester.parse("config/datasource.xml");
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
以上是digester四种解析xml的方法。这些例子只是些直观的说明。竹笋炒肉的三篇有关digester的笔记更深入一步的讲解了有关digester的知识。链接见下:
digester学习笔记1
digester学习笔记2
digester学习笔记3
另附上commons-digester-2.0 API和官网
回到文章开头说的,其实了解digester是为了弄明白struts怎么解析配置文件的。本来想自己整理下,但是发现struts学习--初始化MoudleConfig 正好解释的很清楚,只以解析DataSourceConfig标签为例稍微补充下RuleSet配置说明。
Java代码
通过ActionServlet的成员变量configDigester的初始化来深入理解struts-config.xml文件的加载,其中配置信息可以通过org.apache.struts.config.impl.ModuleConfigImpl类描述。
configDigester上注册了RuleSet类为ConfigRuleSet,主要通过覆盖方法public void addRuleInstances(Digester digester)来为digester注册Rule,代码分析如下:
1.处理ModuleConfigImpl对象中的数据源DataSourceConfig对象:
/* 1.1当遇到struts-config/data-sources/data-source开始标记时便创建此标记className属性标示的类实例,如果没有className属性,则创建org.apache.struts.config.DataSourceConfig对象,并入栈;遇到结束标记时对象出栈。*/
digester.addObjectCreate
("struts-config/data-sources/data-source", "org.apache.struts.config.DataSourceConfig", "className");
/*1.2 当遇到struts-config/data-sources/data-source开始标记时根据data-source标记的属性设置栈顶元素对象的属性 */
digester.addSetProperties
("struts-config/data-sources/data-source");
/*1.3 遇到struts-config/data-sources/data-source结束标记时将调用次栈顶元素ModuleConfigImpl对象的addDataSourceConfig方法,将当前栈顶元素DataSourceConfig对象为值,struts-config/data-sources/data-source标记的key属性为键推入到ModuleConfigImpl的HashMap类型成员变量dataSources中。*/
digester.addSetNext
("struts-config/data-sources/data-source", "addDataSourceConfig", "org.apache.struts.config.DataSourceConfig");
/*1.4 将遇到的set-property标记的property属性值为key,value属性值为值添加到栈顶DataSourceConfig对象的HashMap类型成员变量properties中。*/ digester.addRule
("struts-config/data-sources/data-source/set-property", new AddDataSourcePropertyRule());
下面的代码,是从http://soft901.iteye.com/blog/335452上面弄过来的,自己改造了一下,只为了自己更清楚的理解。
待读取的XML文件datasource.xml:
Java代码
<?xml version="1.0"?>
<datasources>
<datasource>
<name>mysqldatasource</name>
<driver>com.jdbc.mysql.Driver</driver>
<url>jdbc:mysql://localhost:3306/test</url>
<username>root</username>
<password>1234</password>
</datasource>
<datasource>
<name>oracledatasource</name>
<driver>oracle.jdbc.driver.oracledriver</driver>
<url>jdbc:oracle:thin:@localhost:1521:orcl</url>
<username>scott</username>
<password>tiger</password>
</datasource>
</datasources>
此xml文件分2层结构,分别为:
<datasources>节点 其下包含2个<datasource>节点
<datasource>节点,其下包含各种信息节点 : 如:<name> 、<url>等。
我们的操作目标是把datasource中的信息节点的内容提取出来。
把每个<datasource>看做为一个对象,<datasource>中信息节点的内容为对象中的元素。
设定一个类DatasourceConfig.java 其内容如下:
Java代码
package xmlParse.digester;
public class DataSourceConfig {
private String name;
private String driver;
private String url;
private String username;
private String password;
public String getName() {
return name;
}
public String getDriver() {
return driver;
}
public String getUrl() {
return url;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public void setName(String name) {
this.name = name;
}
public void setDriver(String driver) {
this.driver = driver;
}
public void setUrl(String url) {
this.url = url;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public String toString() {
return "DataSource : " + "name : " + name + " Driver : " + driver
+ " URL : " + url + " Username : " + username + " Password : "
+ password;
}
}
其中设置解析的rule规则的方法有四种,一一列出代码。
第一种 使用addCallMethod方法,映射XML所对应的节点与这个Call method的参数即可,这个call method将读取的一个标签内所有的值存入对象,然后再存入一个集合中。
Java代码
package xmlParse.digester;
/**
* 利用digester来解析xml.
*/
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.digester.Digester;
import org.xml.sax.SAXException;
public class DigesterParseTest {
private List<DataSourceConfig> dataSources;
public static void main(String[] args) {
DigesterParseTest sd = new DigesterParseTest();
sd.digester();
System.out.println(sd.toString());
}
void digester() {
Digester digester = new Digester();
setDataSources(new ArrayList<DataSourceConfig>());
// 把当前对象压入到digester栈中。
digester.push(this);
/* 设定解析此xml文件的规则 */
// 将XML文件解析所对应的方法.this.addDataSource();参数个数为5个.
digester.addCallMethod("datasources/datasource", "addDataSource", 5);
digester.addCallParam("datasources/datasource/name", 0);
digester.addCallParam("datasources/datasource/driver", 1);
digester.addCallParam("datasources/datasource/url", 2);
digester.addCallParam("datasources/datasource/username", 3);
digester.addCallParam("datasources/datasource/password", 4);
try {
digester.parse("config/datasource.xml");
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
public void addDataSource(final String name, final String driver,
final String url, final String username, final String password) {
DataSourceConfig dataSource = new DataSourceConfig();
dataSource.setName(name);
dataSource.setDriver(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
getDataSources().add(dataSource);
}
public List<DataSourceConfig> getDataSources() {
return dataSources;
}
public void setDataSources(List<DataSourceConfig> dataSources) {
this.dataSources = dataSources;
}
public String toString() {
String newline = System.getProperty("line.separator");
StringBuffer buff = new StringBuffer();
if (getDataSources() != null) {
for (DataSourceConfig ds : getDataSources()) {
buff.append(newline).append(ds);
}
return buff.toString();
}
return "";
}
}
第二种 使用addObjectCreate方法,创建对象映射XML文件的属性对java Bean. 读取完一个对象将对象加入到一个集合中,然后再读取XML文件的下一个标签:
Java代码
package xmlParse.digester;
/**
* 利用digester来解析xml.
*/
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.digester.Digester;
import org.xml.sax.SAXException;
public class DigesterParseTest2 {
private List<DataSourceConfig> dataSources;
public static void main(String[] args) {
DigesterParseTest sd = new DigesterParseTest();
sd.digester();
System.out.println(sd.toString());
}
private void digester() {
Digester digester = new Digester();
setDataSources(new ArrayList<DataSourceConfig>());
// 把当前对象压入到digester栈中。
digester.push(this);
/* 设定解析此xml文件的规则 */
digester.addObjectCreate("datasources/datasource", DataSourceConfig.class);
//效果跟addSetProperties一样
// digester.addBeanPropertySetter("datasources/datasource/name","name");
// digester.addBeanPropertySetter("datasources/datasource/driver", "driver");
// digester.addBeanPropertySetter("datasources/datasource/url", "url");
// digester.addBeanPropertySetter("datasources/datasource/username", "username");
// digester.addBeanPropertySetter("datasources/datasource/password", "password");
Java代码
digester.addSetProperties("datasources/datasource/name");
digester.addSetProperties("datasources/datasource/driver");
digester.addSetProperties("datasources/datasource/url");
digester.addSetProperties("datasources/datasource/username");
digester.addSetProperties("datasources/datasource/password");
digester.addSetNext("datasources/datasource", "addDataSource");
try {
digester.parse("config/datasource.xml");
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
public void addDataSource(final DataSourceConfig datasource){
getDataSources().add(datasource);
}
public List<DataSourceConfig> getDataSources() {
return dataSources;
}
public void setDataSources(List<DataSourceConfig> dataSources) {
this.dataSources = dataSources;
}
public String toString() {
String newline = System.getProperty("line.separator");
StringBuffer buff = new StringBuffer();
if (getDataSources() != null) {
for (DataSourceConfig ds : getDataSources()) {
buff.append(newline).append(ds);
}
return buff.toString();
}
return "";
}
}
第三种:使用addRule方法来解析datasource.xml:
Java代码
private void digester() {
Digester digester = new Digester();
setDataSources(new Vector<DataSource>());
// 把当前对象压入到digester栈中。
digester.push(this);
Rule objectCreate = new ObjectCreateRule(DataSource.class);
digester.addRule("datasources/datasource", objectCreate);
digester.addRule("datasources/datasource", new SetNextRule(
"addDataSource"));
digester.addRule("datasources/datasource/name", new CallMethodRule(
"setName", 0, new Class[] { String.class }));
digester.addRule("datasources/datasource/driver", new CallMethodRule(
"setDriver", 0, new Class[] { String.class }));
digester.addRule("datasources/datasource/url", new CallMethodRule(
"setUrl", 0, new Class[] { String.class }));
digester.addRule("datasources/datasource/username", new CallMethodRule(
"setUsername", 0, new Class[] { String.class }));
digester.addRule("datasources/datasource/password", new CallMethodRule(
"setPassword", 0, new Class[] { String.class }));
try {
digester.parse("datasource.xml");
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
第四种:把规则写在xml文件中。新建rules.xml
Java代码
<? xml version = " 1.0 " ?>
<digester-rules>
<object-create-rule pattern=" datasources "
classname=" datasources " />
<pattern value=" datasources/datasource ">
<object-create-rule classname=" datasource " />
<call-method-rule pattern=" name " methodname=" setName "
paramcount=" 0 " />
<call-method-rule pattern=" driver " methodname=" setDriver "
paramcount=" 0 " />
<call-method-rule pattern=" url " methodname=" setUrl "
paramcount=" 0 " />
<call-method-rule pattern=" username " methodname=" setUsername "
paramcount=" 0 " />
<call-method-rule pattern=" password " methodname=" setPassword "
paramcount=" 0 " />
<set-next-rule methodname=" addDatasource " />
</pattern>
</digester-rules>
digester方法如下:
Java代码
private void digester() {
setDataSources(new ArrayList<DataSourceConfig>());
try {
File rules = new File("config/rules.xml");
//创建digester对象并指定解析规则
Digester digester = DigesterLoader.createDigester(rules.toURL());
digester.parse("config/datasource.xml");
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
以上是digester四种解析xml的方法。这些例子只是些直观的说明。竹笋炒肉的三篇有关digester的笔记更深入一步的讲解了有关digester的知识。链接见下:
digester学习笔记1
digester学习笔记2
digester学习笔记3
另附上commons-digester-2.0 API和官网
回到文章开头说的,其实了解digester是为了弄明白struts怎么解析配置文件的。本来想自己整理下,但是发现struts学习--初始化MoudleConfig 正好解释的很清楚,只以解析DataSourceConfig标签为例稍微补充下RuleSet配置说明。
Java代码
通过ActionServlet的成员变量configDigester的初始化来深入理解struts-config.xml文件的加载,其中配置信息可以通过org.apache.struts.config.impl.ModuleConfigImpl类描述。
configDigester上注册了RuleSet类为ConfigRuleSet,主要通过覆盖方法public void addRuleInstances(Digester digester)来为digester注册Rule,代码分析如下:
1.处理ModuleConfigImpl对象中的数据源DataSourceConfig对象:
/* 1.1当遇到struts-config/data-sources/data-source开始标记时便创建此标记className属性标示的类实例,如果没有className属性,则创建org.apache.struts.config.DataSourceConfig对象,并入栈;遇到结束标记时对象出栈。*/
digester.addObjectCreate
("struts-config/data-sources/data-source", "org.apache.struts.config.DataSourceConfig", "className");
/*1.2 当遇到struts-config/data-sources/data-source开始标记时根据data-source标记的属性设置栈顶元素对象的属性 */
digester.addSetProperties
("struts-config/data-sources/data-source");
/*1.3 遇到struts-config/data-sources/data-source结束标记时将调用次栈顶元素ModuleConfigImpl对象的addDataSourceConfig方法,将当前栈顶元素DataSourceConfig对象为值,struts-config/data-sources/data-source标记的key属性为键推入到ModuleConfigImpl的HashMap类型成员变量dataSources中。*/
digester.addSetNext
("struts-config/data-sources/data-source", "addDataSourceConfig", "org.apache.struts.config.DataSourceConfig");
/*1.4 将遇到的set-property标记的property属性值为key,value属性值为值添加到栈顶DataSourceConfig对象的HashMap类型成员变量properties中。*/ digester.addRule
("struts-config/data-sources/data-source/set-property", new AddDataSourcePropertyRule());
发表评论
-
java编程思想final的理解
2015-03-06 13:38 319根据上下文环境,java的关键字final也存在着细微的区别, ... -
PDF2SWF中文字符集解决方案
2014-02-26 15:12 784转自:http://www.cnblogs.com/liver ... -
Runtime.getRuntime().exec() 输出流阻塞的解决方法
2014-02-26 09:40 1805转自:http://blog.csdn.net/xiaoani ... -
笔记(不用老搜索了)
2013-07-17 16:16 0下面代码则执行了subgo()函数, <a href ... -
利用LinkedBlockingQueue实现生产者-消费者模式
2013-06-05 16:09 661由于LinkedBlockingQueue 实现是线程安全的, ... -
加密123
2013-05-08 22:35 784/** * 加密传输时的密码 * @author weirhp ... -
jsoup解析
2013-04-28 15:31 642http://www.ibm.com/developerwor ... -
java线程管理利器:java.util.current的用法举例
2012-12-05 15:42 966DK5中增加了Doug Lea的并发库,这一引进给java线程 ... -
Tomcat - 解决which must be escaped when used within the value错误
2012-11-19 15:17 623http://www.cnblogs.com/javadu/a ... -
Java POI Word 写文档
2012-11-09 09:19 7831 package apache.poi; 2 3 ... -
使用COS组件实现文件上传
2012-06-15 11:25 1436转自:http://blog.csdn.net/jadyer/ ... -
Java Annotation(1)
2011-06-19 09:48 624作者:曾巧(numenzq) 摘要 Annotation( ... -
关于request得到路径的几种方法
2011-06-08 15:43 910request.getRequestURI() /jque ... -
JAVA EXCEL API 简介
2011-04-18 16:32 687转自:http://www.ibm.com/dev ... -
Hibernate 多对多双向关联
2011-03-21 11:09 584Hibernate 多对多双向关联 一、模型介绍 多个 ... -
Hibernate 一对多连接表双向关联
2011-03-21 11:09 733Hibernate 一对多连接表双向关联 一、模型介绍 ... -
Hibernate 一对多外键双向关联
2011-03-21 11:08 743Hibernate 一对多外键双向关联 一、模型介绍 ... -
Hibernate 一对一主键双向关联
2011-03-21 11:07 675Hibernate 一对一主键双向关联 一对一主键映射在一 ... -
Hibernate 一对一外键双向关联
2011-03-21 11:07 608Hibernate 一对一外键双向关联 一对一外键关联是一 ... -
Hibernate 多对多单向关联
2011-03-21 11:06 604Hibernate 多对多单向关联 一、模型介绍 多个人( ...
相关推荐
使用Apache的Digester来解析XML文档,代码,有解析!
Digester java解析xml jar包
digester解析xml的问题.pdf
博文链接:https://aga.iteye.com/blog/218587
不错的解析XML的类,主要利用org.apache.commons.digester.Digester;
Digester解析XML,也是找到的别人的。
Digester解析XML文件
使用STRUTS的解析XML技术digester来解析多层嵌套的XML文件,简单易懂
使用Digester解析XML文档示例
Digester解析XML问题.pdf
java反射,Digester解析xml文档
这是一个JAVA工程,导入后可直接运行,主要演示如何用digester解析XML文件
digeter解析xml所必须的jar包,包括commons-logging-1.2.jar、commons-digester-2.1.jar、commons-beanutils-1.9.3.jar
org.apache.commons.digester解析XML.rar 完整的测试工程,里面有需要的四个包
使用digester配置rule.xml规则来解析自定义的xml文件
digester是解析xml的一个架包,有他的方法
接口利用Digester类解析Xml文件为对象 个人感觉简单易懂,如有问题,还请多多指教。
Digester使用堆栈来保存xml节点(stack.push()方法),当该xml节点中嵌套的所有子节点解析完毕,该节点将被弹出(stack.pup()方法)。Digester最大的优点就是使用模式匹配来表示xml文件中节点之间的父子关系 。
NULL 博文链接:https://zhglhy.iteye.com/blog/1539777