设为首页 收藏本站
查看: 516|回复: 0

[经验分享] Tomcat4 源代码分析 (15) How Tomcat Works 第十五章

[复制链接]

尚未签到

发表于 2017-2-10 07:26:13 | 显示全部楼层 |阅读模式
   
  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"?>
<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>
   
  Office.java
  public class Office {
  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;
  }
}

  Address.java
  
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;
  }
}

   
  Test02.java
   
  public class Test02 {
    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();
    // 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();
    }
  } 
}
  运行结果为:
    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 :
   

      在给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中的。
  (待续...)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-339888-1-1.html 上篇帖子: 一种局部配置多数据源的方案(tomcat 5.5)1 下篇帖子: TOmcat启动后报:IOException while loading persisted sessions: java.io.EOFException
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表