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