5.2 管道任務(wù)
Container 的 invoke 方法的調(diào)用實(shí)際就是調(diào)用 Pipeline 的 invoke 方法,Pipeline 包含了容器要執(zhí)行的任務(wù),一個(gè) valve 代表一個(gè)任務(wù),BaseValve是容器的核心任務(wù)。閥類似過濾器,執(zhí)行完成后會調(diào)用下一個(gè)閥,基礎(chǔ)閥總是在最后執(zhí)行。下面是本章 Pipeline 的實(shí)現(xiàn)
public class SimplePipeline implements Pipeline {
// 構(gòu)造函數(shù)
public SimplePipeline(Container container) {
setContainer(container);
}
// Pipeline 屬性設(shè)置
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 調(diào)用 invoke 方法執(zhí)行處理邏輯
public void invoke(Request request, Response response) {
// 調(diào)用第一個(gè) Valve
(new SimplePipelineValveContext()).invokeNext(request, response);
}
// 本章的 ValveContext 實(shí)現(xiàn)
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 應(yīng)用
- ex05.pyrmont.core.SimpleLoader: SimpleLoader 負(fù)責(zé) Servlet 的類加載工作。
- ex05.pyrmont.core.SimplePipeline : 如前所述
- ex05.pyrmont.core.
4
4
4
4
4
4
4
4
4
4