- 浏览: 454833 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (371)
- Java (44)
- Flex (25)
- Design Pattern / UML (5)
- JVM (14)
- Software Engineer (4)
- Testing (30)
- Web Backend (60)
- Linux (7)
- Database (11)
- SOA (28)
- English (6)
- FX (5)
- SAP Support (25)
- SAP Development (5)
- SAP Impl & Oprn (8)
- Articles (15)
- Music (4)
- Recipe (14)
- Multi-thread (4)
- Lucene (2)
- CS basic / Algorithm (12)
- Tour (3)
- C C++ (21)
- Others (10)
- Code Repository C++ (1)
- Code Repository Java (1)
- Code Repository Algorithm (1)
- Code Repository SQL (1)
- Web Frontend (4)
最新评论
-
xiangxm:
Java 强引用、 软引用、 弱引用、虚引用 -
nml-lyb:
123
Mule 的第一个例子 -
nml-lyb:
http://www.baidu.com
Mule 的第一个例子 -
white___ant:
...
Java 强引用、 软引用、 弱引用、虚引用 -
joeyon:
...
Java NIO介绍
Chapter 15 : Digester
概览
在之前的章节中,我们用Bootstrap类来实例化connector, context, wrappers 以及其他的组件。当把组件注入到父级组件中时,我们使用的是set方法,比如说:
connector.setContainer(context);
context.setPath("/myApp");
context.setDocBase("myApp");
再比如说:
context.setLoader(loader);
context.addChild(wrapper1);
context.addChild(wrapper2);
这种注入方式的缺点是不灵活,改动时需要动源代码。Tomcat4使用了更加灵活的方式,即使用xml配置文件的方法。
Digester
Digester是一个开源的项目,解析xml文件,然后把里面的element变为java object。
下面给出三个小例子,很容易了解digester的使用方法\
Example 1 :
employee1.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<employee firstName="Brian" lastName="May">
</employee>
Employee.java
public class Employee {
private String firstName;
private String lastName;
private ArrayList offices = new ArrayList();
public Employee() {
System.out.println("Creating Employee");
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
System.out.println("Setting firstName : " + firstName);
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
System.out.println("Setting lastName : " + lastName);
this.lastName = lastName;
}
public void addOffice(Office office) {
System.out.println("Adding Office to this employee");
offices.add(office);
}
public ArrayList getOffices() {
return offices;
}
public void printName() {
System.out.println("My name is " + firstName + " " + lastName);
}
}
Test01.java
public class Test01 {
public static void main(String[] args) {
String path = System.getProperty("user.dir") + File.separator + "etc";
File file = new File(path, "employee1.xml");
Digester digester = new Digester();
// add rules
digester.addObjectCreate("employee", "ex15.pyrmont.digestertest.Employee");
digester.addSetProperties("employee");
digester.addCallMethod("employee", "printName");
try {
Employee employee = (Employee) digester.parse(file);
System.out.println("First name : " + employee.getFirstName());
System.out.println("Last name : " + employee.getLastName());
}
catch(Exception e) {
e.printStackTrace();
}
}
}
结果:
Creating Employee Setting firstName : Brian Setting lastName : May My name is Brian May First name : Brian Last name : May
Example 2 :
xml file :
<?xml version="1.0" encoding="ISO-8859-1"?> Office.java public class Office { Address.java Test02.java public class Test02 { public static void main(String[] args) { 运行结果为:
Creating Employee Setting firstName : Freddie Setting lastName : Mercury ..Creating Office ..Setting office description : Headquarters ....Creating Address ....Setting streetName : Wellington Avenue ....Setting streetNumber : 223 ..Setting office address : ....223 Wellington Avenue Adding Office to this employee ..Creating Office ..Setting office description : Client site ....Creating Address ....Setting streetName : Downing Street ....Setting streetNumber : 10 ..Setting office address : ....10 Downing Street Adding Office to this employee ------------------------------------------------- Headquarters Address : 223 Wellington Avenue -------------------------------- Client site Address : 10 Downing Street -------------------------------- Example 3 :
<employee firstName="Freddie" lastName="Mercury">
<office description="Headquarters">
<address streetName="Wellington Avenue" streetNumber="223"/>
</office>
<office description="Client site">
<address streetName="Downing Street" streetNumber="10"/>
</office>
</employee>
private Address address;
private String description;
public Office() {
System.out.println("..Creating Office");
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
System.out.println("..Setting office description : " + description);
this.description = description;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
System.out.println("..Setting office address : " + address);
this.address = address;
}
}
public class Address {
private String streetName;
private String streetNumber;
public Address() {
System.out.println("....Creating Address");
}
public String getStreetName() {
return streetName;
}
public void setStreetName(String streetName) {
System.out.println("....Setting streetName : " + streetName);
this.streetName = streetName;
}
public String getStreetNumber() {
return streetNumber;
}
public void setStreetNumber(String streetNumber) {
System.out.println("....Setting streetNumber : " + streetNumber);
this.streetNumber = streetNumber;
}
public String toString() {
return "...." + streetNumber + " " + streetName;
}
}
String path = System.getProperty("user.dir") + File.separator + "etc";
File file = new File(path, "employee2.xml");
Digester digester = new Digester();
// add rules
digester.addObjectCreate("employee", "ex15.pyrmont.digestertest.Employee");
digester.addSetProperties("employee");
digester.addObjectCreate("employee/office", "ex15.pyrmont.digestertest.Office");
digester.addSetProperties("employee/office");
digester.addSetNext("employee/office", "addOffice");
digester.addObjectCreate("employee/office/address",
"ex15.pyrmont.digestertest.Address");
digester.addSetProperties("employee/office/address");
digester.addSetNext("employee/office/address", "setAddress");
try {
Employee employee = (Employee) digester.parse(file);
ArrayList offices = employee.getOffices();
Iterator iterator = offices.iterator();
System.out.println("-------------------------------------------------");
while (iterator.hasNext()) {
Office office = (Office) iterator.next();
Address address = office.getAddress();
System.out.println(office.getDescription());
System.out.println("Address : " +
address.getStreetNumber() + " " + address.getStreetName());
System.out.println("--------------------------------");
}
}
catch(Exception e) {
e.printStackTrace();
}
}
}
在给digester注入解析规则的时候,上面的两个例子是逐条注入的。还有一种方法是 集体注入。
实体对象沿用上例中的定义。
规则的集合定义在一个类中
EmployeeRoleSet.java
public class EmployeeRuleSet extends RuleSetBase {
public void addRuleInstances(Digester digester) {
// add rules
digester.addObjectCreate("employee", "ex15.pyrmont.digestertest.Employee");
digester.addSetProperties("employee");
digester.addObjectCreate("employee/office", "ex15.pyrmont.digestertest.Office");
digester.addSetProperties("employee/office");
digester.addSetNext("employee/office", "addOffice");
digester.addObjectCreate("employee/office/address",
"ex15.pyrmont.digestertest.Address");
digester.addSetProperties("employee/office/address");
digester.addSetNext("employee/office/address", "setAddress");
}
}
Test03.java
public class Test03 {
public static void main(String[] args) {
String path = System.getProperty("user.dir") + File.separator + "etc";
File file = new File(path, "employee2.xml");
Digester digester = new Digester();
digester.addRuleSet(new EmployeeRuleSet());//注入规则集合
try {
Employee employee = (Employee) digester.parse(file);
ArrayList offices = employee.getOffices();
Iterator iterator = offices.iterator();
System.out.println("-------------------------------------------------");
while (iterator.hasNext()) {
Office office = (Office) iterator.next();
Address address = office.getAddress();
System.out.println(office.getDescription());
System.out.println("Address : " +
address.getStreetNumber() + " " + address.getStreetName());
System.out.println("--------------------------------");
}
}
catch(Exception e) {
e.printStackTrace();
}
}
}
结果为:
Creating Employee Setting firstName : Freddie Setting lastName : Mercury ..Creating Office ..Setting office description : Headquarters ....Creating Address ....Setting streetName : Wellington Avenue ....Setting streetNumber : 223 ..Setting office address : ....223 Wellington Avenue Adding Office to this employee ..Creating Office ..Setting office description : Client site ....Creating Address ....Setting streetName : Downing Street ....Setting streetNumber : 10 ..Setting office address : ....10 Downing Street Adding Office to this employee ------------------------------------------------- Headquarters Address : 223 Wellington Avenue -------------------------------- Client site Address : 10 Downing Street -------------------------------- ContextConfig 下面 言归正传 , 通过讲解contextConfig,来看看tomcat的web.xml文件(两个,tomcat default一个,application一个)是怎么注入到context中的。 (待续...)
发表评论
-
Servlet Async
2015-05-15 02:29 421http://www.importnew.com/8864. ... -
EHcache
2014-09-06 23:32 470http://blog.csdn.net/liuzhenwe ... -
Maven构建并热部署一个简略的Web Project
2014-08-01 01:51 672zz from : http://www.myexcept ... -
Tomcat 权限配置,当使用Eclipse启动时都会被修改为默认
2014-07-31 07:57 458http://zhidao.baidu.com/link?u ... -
解决tomcat占用8080端口问题图文教程
2014-07-30 21:59 540zz from http://jingyan.baidu. ... -
HttpURLConnection用法详解
2013-09-04 02:08 615http://www.cnblogs.com/guodong ... -
使用HttpSessionListener接口监听Session 的创建和失效
2013-09-03 03:55 753http://uule.iteye.com/blog/824 ... -
web.xml 中的listener、 filter、servlet 加载顺序及其详解
2013-09-03 03:49 314http://www.cnblogs.com/JesseV/ ... -
servlet listener
2013-09-03 03:43 589http://sakyone.iteye.com/blog/ ... -
servlet filter
2013-09-03 03:42 650http://sakyone.iteye.com/blog/ ... -
Servlet中Request的getAttribute getParameter 区别
2013-08-29 12:31 1059http://blog.csdn.net/yangqillo ... -
用windows启动tomcat
2013-07-04 09:36 566services.msc -
Spring 加载 application.xml 出错FileNotFoundException
2013-06-23 21:26 898http://zhidao.baidu.com/questi ... -
<context-param>与<init-param>的区别与作用
2013-06-18 08:08 649http://www.cnblogs.com/hzj-/ar ... -
HttpWatch工具简介及使用技巧
2012-05-09 14:13 3817http://cfeng518.blog.163.com/bl ... -
Web Service (Axis2实现)
2012-04-19 11:13 1268转载from http://wangyaobeiji ... -
Tomcat4 源代码分析 (20) How Tomcat Works 第二十章
2009-07-27 17:24 846Chapter 20 : JMX-Based Manageme ... -
Tomcat4 源代码分析 (19) How Tomcat Works 第十九章
2009-07-27 17:19 724Chapter 19 : Manager Servlet ... -
Tomcat4 源代码分析 (18) How Tomcat Works 第十八章
2009-07-27 16:58 768Chapter 18 : Deployer T ... -
Tomcat4 源代码分析 (17) How Tomcat Works 第十七章
2009-07-24 17:57 1019Chapter 17 : Tomcat Startup ...
相关推荐
Apache Tomcat 最新源代码Apache Tomcat 最新源代码Apache Tomcat 最新源代码Apache Tomcat 最新源代码Apache Tomcat 最新源代码Apache Tomcat 最新源代码Apache Tomcat 最新源代码Apache Tomcat 最新源代码Apache ...
How Tomcat Works中文版
Tomcat8源代码
HowTomcatWorks书籍课程实例工程与代码 书籍剖析了Tomcat 4.1.12和Tomcat 5.0.18--一个免费的、开源的、深受大众欢迎的、代号为Catalina的servlet容器,并讲解其容器的内部运行机制。通过迭代实现一个简化版软件来...
How Tomcat Work 源代码,对于了解tomcat工作机制非常有帮助。
How Tomcat Works 中文版+例程源码; 源码在src目录下
How Tomcat Works【英文PDF+中文HTML+源码】 How Tomcat Works 主要是讲解Tomcat如何运行的一些核心资料。
此文档包含了tomcat6的全部源代码,同时,该源代码可以直接通过Eclipse编译运行,对于想要调试运行tomcat6的同志很有帮助!
how tomcat works一书中的全部代码 java类
tomcat的基本思想,学习完可以对理解spring的基本原理有大致了解,很值得学习
tomcat工作原理深入详解——HowTomcatWorks中文版.pdf
HowTomcatWorks(书和源码)
how tomcat works 高清版 学习tomcat必备书籍 how tomcat works
Apache Tomcat 7 源代码
How Tomcat Works 全书共20章!
tomcat源代码学习,以及详细分析,当然不是原创,前段时间看过的,希望对大家有帮助。
how tomcat works中文版 + 英文版,深入解析了tomcat的实现机制
How Tomcat works(PDF),不可用于商业用途,如有版权问题,请联系删除!
Tomcat源代码学习研究(包括代码注释、文档、用于代码分析的测试用例)
web开发 how-tomcat-works