Pipeline。它的含義就是管道,一個管道可以安裝很多的閥門,可以有很多分支。它用于控制頁面的處理流程。它需要定義在pipeline.xml檔案中,該檔案中的每個标簽都是一個閥門。該檔案中可以放一些簡單的控制語句。在項目中,下面這樣的管道配置就已經夠用了。
<services:pipeline xmlns="http://www.alibaba.com/schema/services/pipeline/valves">
<!-- 初始化 turbine rundata,并在 pipelineContext 中設定可能會用到的對象(如rundata、utils),以便 valve 取得。 -->
<prepareForTurbine />
<!-- 設定日志系統的上下文,支援把目前請求的詳情列印在日志中。 -->
<setLoggingContext />
<!-- 分析URL,取得target。 -->
<analyzeURL homepage="homepage" />
<!-- 檢查 csrf token,防止 csrf 攻擊和重複送出。假如 request 和 session 中的 token 不比對,則出錯,或顯示 expired 頁面。 -->
<checkCsrfToken />
<!-- 這裡為什麼要用循環呢? -->
<loop>
<choose>
<when>
<!-- 執行帶模闆的screen,預設有layout。 -->
<pl-conditions:target-extension-condition extension="null, vm, jsp" />
<performAction />
<performTemplateScreen />
<renderTemplate />
</when>
<when>
<!-- 執行不帶模闆的screen,預設無layout。 -->
<pl-conditions:target-extension-condition extension="do" />
<performAction />
<performScreen />
</when>
<otherwise>
<!-- 将控制交還給 servlet engine。 -->
<exit />
</otherwise>
</choose>
<!-- 假如 rundata.setRedirectTarget() 被設定,則循環,否則退出循環。 -->
<breakUnlessTargetRedirected />
</loop>
</services:pipeline>
為什麼要引入Pipeline?這是因為傳統的Filter受到限制,隻能通路或者修改HttpServletRequest、HttpServletResponse、ServletContext三個對象,不能通路應用程式中的狀态。流程控制過于簡單,隻能繼續執行或者終止執行,沒有循環、分支等機制。還有Filter無法通路其他Filter的狀态,在性能優化的時候比較困難。
為了克服Filter的缺點,Webx引入了RequestContext和Pipeline。其中RequestContext負責通路和修改request和response對象,而Pipeline負責控制請求的執行流程。