第五章 Servlet容器

5.2 管道任務

Container 的 invoke 方法的調用實際就是調用 Pipeline 的 invoke 方法,Pipeline 包含了容器要執行的任務,一個 valve 代表一個任務,BaseValve是容器的核心任務。閥類似過濾器,執行完成后會調用下一個閥,基礎閥總是在最后執行。下面是本章 Pipeline 的實現

public class SimplePipeline implements Pipeline {
  // 構造函數
  public SimplePipeline(Container container) {
    setContainer(container);
  }
  // Pipeline 屬性設置
  protected Valve basic = null;
  protected Container container = null;
  protected Valve valves[] = new Valve[0];
  // 成員變量的 getter 和 setter 方法
  ...
  public void setBasic(Valve valve) {
    this.basic = valve;
    ((Contained) valve).setContainer(container);
  }
  // 添加 Valve
  public void addValve(Valve valve) {
    if (valve instanceof Contained)
      ((Contained) valve).setContainer(this.container);
    synchronized (valves) {
      Valve results[] = new Valve[valves.length +1];
      System.arraycopy(valves, 0, results, 0, valves.length);
      results[valves.length] = valve;
      valves = results;
    }
  }
  // Container 調用 invoke 方法執行處理邏輯
  public void invoke(Request request, Response response) {
    // 調用第一個 Valve
    (new SimplePipelineValveContext()).invokeNext(request, response);
  }

  // 本章的 ValveContext 實現
  protected class SimplePipelineValveContext implements ValveContext {
    protected int stage = 0;
    // 遍歷 Pipeline 的所有 Valve
    public void invokeNext(Request request, Response response) {
      int subscript = stage;
      stage = stage + 1;
      if (subscript < valves.length) {
        valves[subscript].invoke(request, response, this);
      }  else if ((subscript == valves.length) && (basic != null)) {
        basic.invoke(request, response, this);
      }  else { throw new ServletException("No valve");  }
    }
  } 
}

5.5 Wrapper 應用

  • ex05.pyrmont.core.SimpleLoader: SimpleLoader 負責 Servlet 的類加載工作。
  • ex05.pyrmont.core.SimplePipeline : 如前所述
  • ex05.pyrmont.core.

4
4
4
4
4
4
4
4

4
4

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容