Webx框架:Pipeline簡介

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負責控制請求的執行流程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章