《how tomcat work》 搬运工 Chapter 15: Digester

在之前的章节都是通过Bootstrap类来初始化connector,context,wrapper。

而且手动来绑定它们的关系。

connector.setContainer(context); 

或者手动设置实例的属性

context.setPath("/myApp") ;

context.setDocBase("myApp"); 

在tomcat中,是用web.xml来设置的。而digester是一个开源的库,可以读取xml,通过xml来加载类,实例化。

Digester 

最普通的就是添加实例方法:

public void addObjectCreate(java.lang.String pattern, java.lang.Class clazz)
public void addObjectCreate(java.lang.String pattern, java.lang.String className)

 

 

设置属性:

public void addSetProperties(java.lang.String pattern),这是通过读取xml的内容,例:

digester.addObjectCreate("employee",   "ex15.pyrmont.digestertest.Employee"); digester.addSetProperties("employee"); 

<employee firstName="Brian" lastName="May"> 

这个就会调用setFirstName和setLastName来设置属性

 

绑定对象的关系:

比如说Employee对象可以拥有多个Office。

digester.addObjectCreate("employee",   "ex15.pyrmont.digestertest.Employee"); digester.addObjectCreate("employee/office",   "ex15.pyrmont.digestertest.Office");

需要连续添加到digerter的栈里。

digester.addSetNext("employee/office", "addOffice"); 

 

Employee类

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);        
       } 
} 
<?xml version="1.0" encoding="ISO-8859-1"?>
<employee firstName="Brian" lastName="May">
</employee>
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();
    }
  }  
  
}

 

 

ContextConfig 

在context启动前,需要绑定一个listener。这个listener设置了StandardContext实例。和之前的SimpleContexConfig只是简单地设置configured属性为true相比,ContextConfig做了很多准备工作。比如读取默认的web.xml和application的web.xml,来创建实例。将url和severlet相映射。

在ContextConfig中,lifecycleEvent(LifecycleEvent event)方法判断,如果是Lifecycle.START_EVENT这调用start()方法,如果是Lifecycle.STOP_EVENT则调用stop()方法。

其中,start()方法则调用defaultConfig();   applicationConfig(); 方法。分别读取默认的web.xml和application的web.xml。

新版的bootstrap,其中没有warpper的绑定。

public final class Bootstrap {

  // invoke: http://localhost:8080/app1/Modern or 
  // http://localhost:8080/app2/Primitive
  // note that we don't instantiate a Wrapper here,
  // ContextConfig reads the WEB-INF/classes dir and loads all servlets.
  public static void main(String[] args) {
    System.setProperty("catalina.base", System.getProperty("user.dir"));
    Connector connector = new HttpConnector();

    Context context = new StandardContext();
    // StandardContext's start method adds a default mapper
    context.setPath("/app1");
    context.setDocBase("app1");
    LifecycleListener listener = new ContextConfig();
    ((Lifecycle) context).addLifecycleListener(listener);

    Host host = new StandardHost();
    host.addChild(context);
    host.setName("localhost");
    host.setAppBase("webapps");

    Loader loader = new WebappLoader();
    context.setLoader(loader);
    connector.setContainer(host);
    try {
      connector.initialize();
      ((Lifecycle) connector).start();
      ((Lifecycle) host).start();
      Container[] c = context.findChildren();
      int length = c.length;
      for (int i=0; i<length; i++) {
        Container child = c[i];
        System.out.println(child.getName());
      }

      // make the application wait until we press a key.
      System.in.read();
      ((Lifecycle) host).stop();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
}
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
  <servlet>
    <servlet-name>Modern</servlet-name>
    <servlet-class>ModernServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>Primitive</servlet-name>
    <servlet-class>PrimitiveServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Modern</servlet-name>
    <url-pattern>/Modern</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Primitive</servlet-name>
    <url-pattern>/Primitive</url-pattern>
  </servlet-mapping>
</web-app>

 

转载于:https://www.cnblogs.com/xuyung/p/4927381.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在风能领域,准确预测风速对于风电场的运行与管理至关重要。Matlab作为一个强大的数学计算和数据分析平台,被广泛应用于风速预测模型的构建。本文将深入探讨基于四种风速——随机风、基本风、阵风和渐变风的组合风速预测技术。 我们来理解这四种风速类型: 1. **随机风**:随机风是指风速呈现出随机性的变化,通常由大气湍流引起。在建模中,通常通过统计方法如高斯分布或Weibull分布来模拟这种不确定性。 2. **基本风**:基本风速是指在无特定扰动条件下的平均风速,它是长期观测结果的平均值,通常用于结构设计和风能评估。 3. **阵风**:阵风是短时间内风速显著增强的现象,对建筑物和风力发电机造成的主要威胁之一。阵风的预测涉及到风的脉动特性分析。 4. **渐变风**:渐变风是指风速随时间和空间逐渐变化的过程,常见于风向转变或地形影响下的风场变化。 在Matlab中,利用这四种风速类型进行组合预测,可以提高预测的准确性。预测模型可能包括以下几个步骤: 1. **数据收集与预处理**:收集历史风速数据,包括随机风、基本风、阵风和渐变风的数据,进行异常值检测、缺失值填充以及数据标准化。 2. **特征工程**:提取风速变化的相关特征,如平均值、标准差、极值、频率分布等,这些特征可能对预测有重要影响。 3. **模型选择**:可以选择多种预测模型,如时间序列分析(ARIMA、状态空间模型等)、机器学习算法(线性回归、决策树、支持向量机、神经网络等)或深度学习模型(LSTM、GRU等)。 4. **模型训练**:利用历史数据训练选定的模型,调整模型参数以优化性能,例如通过交叉验证来避免过拟合。 5. **模型验证与评估**:使用独立的测试集验证模型预测效果,常见的评估指标有均方误差(MSE)、平均绝对误差(MAE)和决定系数(R²)。 6. **组合预测**:结合四种风速的不同模型预测结果,可以采用加权平均、集成学习(如bagging、boosting)等方式,以提升整体预测精度。 7. **实时更新与动态调整**:实际应用中,模型需要不断接收新的风速数据并进行在线更新,以适应风场环境的变化。 通过以上步骤,可以构建一个综合考虑各种风速特性的预测系统,这对于风电场的功率输出预测、风电设备的维护计划以及电网调度都具有重要价值。然而,需要注意的是,每个风场的地理环境、气候条件和设备状况都有所不同,因此模型的建立应根据实际情况进行定制和优
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值