Struts2框架處理流程

n7w77 9年前發布 | 29K 次閱讀 Struts2 Web框架

原文  http://dxz.iteye.com/blog/2193768


這幾天因為在項目中曾經使用過Struts2這個神奇的框架,所以很有必要深入探究一下Struts2的處理的基本流程,如是有大一大二的在校大 學生看到這篇博客我像給你的建議是在大學只做一個項目就夠了,把整個項目的所有模塊都掌握清楚,把所用技術的內部實現原理都給琢磨透那么你的大學就很成功 了。做項目一定要做完之后停下來思考揣摩獲得提升不能只停留在框架的使用上面,當然一個框架流行也自有他的一些非常好的

實現原理。掌握這些才是在學習階段最重要的。

下面這幅圖在我第一次接觸Struts2的時候就已經深深的烙在我的腦海中,但是至于他的內部實現,具體的流出我只是粗略的學習并沒有深入研究,現在是時候開始認真總結一下了。

Struts2框架處理流程

一、Struts2的處理流程:

  •  客戶端產生一個HttpServletRequest的請求,該請求被提交到一系列的標準過濾器(Filter)組建鏈中 (如ActionContextCleanUp:它主要是清理當前線程的ActionContext、 Dispatcher,FilterDispatcher主要是通過ActionMapper來決定需要調用那個Action, FilterDispatcher是控制器的核心,也是MVC中控制層的核心組建 )。
  • 核心控制器組建FilterDispatcher根據ActionMapper中的設置獲得是否需要調用某個Action組建 來處理這個HttpServletRequest請求,如果ActionMapper決定調用某個Action組建,FilterDispatcher核 心控制器組建就會把請求的處理權委托給ActionProxy組建
  • ActionProxy組建通過Configuration Manager組建獲得Struts2框架的配置文件struts.xml,最后找到需要調用的目標Action組建類,然后ActionProxy組建 就創建出一個實現了命令模式的ActionInvocation類的對象實例類的對象實例(這個過程包括調用Anction組建本身之前調用多個的攔截器 組建的before()方法 ) 同時ActionInvocation組建通過代理模式調用目標Action組建。但是在調用之前ActionInvocation組建會根據配置文件中的設置項目加載與目標Action組建相關的所有攔截器組建(Interceptor)。
  • 一旦Action組建執行完畢,ActionInvocation組建將根據開發人員在Struts2.xml配置文件中定義的各個配置項目 獲得對象的返回結果--為這個Action組建的結果碼(一個像SUCCESS,INPUT)然后根據該返回的結果調用目標JSP頁面以實現顯示輸出。
  • 最后各個攔截器組建會被再次執行(但是順序和開始時相反,并調用after()方法),然后請求最終被返回給系統的部署文件中配置的其他過濾 器,如果已經設置了ActionContextCleanUp過濾器,那么FilterDispatcher就不會清理在ThreadLocal對象中保 存的ActionContext信息。如果沒有設置ActionContextCleanUp過濾器,FilterDispatcher就會清除掉所有的 ThreadLocal對象。

更加清晰的來說就是:

1.客戶端初始化一個指向servlet容器的請求。

2.請求經過一系列的過濾器( ActionContextCleanUp、SiteMesh

3.FilterDispatcher被調用,并詢問ActionMapper來決定這個請求是否需要調用某個Action

4.ActionMapper決定要調用那一個Action,FilterDispatcher把請求交給ActionProxy。

        5. ActionProxy通過Configurate Manager詢問Struts配置文件,找到要調用的Action類
    </p>
    <p>
        6. ActionProxy創建一個ActionInvocation實例
    </p>
    <p>
        7. ActionInvocation實例使用命令模式來調用,回調Action的exeute方法
    </p>
    <p>
        8. 一旦Action執行完畢,ActionInvocation負責根據Struts.xml的配置返回結果。
    </p>
    <p>
        二、比較重要的類的介紹:
    </p>
    <p>
        <span>ActionMapper其實是HttpServletRequest和Action調用請求的一個映射</span> ,他屏蔽了Action對于Request等Java servlet類的依賴。Struts2中它的默認實現類是DefaultAtionMapper,ActionMapper很大的用處可以根據自己的需要來設計url格式,它自己也有Restful的具體實現。
    </p>
    <p>
        ActionProxy和ActionInvocation:
    </p>
    <p>
        Action的一個代理,由ActionProxyFactory創建,它本身不包括Action實例,默認實現DefaultActionProxy是由ActionInvocation持有Action實例。 <span>ActionProxy作用是如何取得Action,無論是本地還是遠程</span> 。而 <span>ActionInvocation的作用是如何執行Action</span> ,攔截器的功能就是咱ActionInvocation中實現的。
    </p>
    <p>
        ConfigurateProvider和Configuration
    </p>
    <p>
        ConfigurationProvider就是Struts2中配置文件的解析器,Struts2中的配置文件主要是實現XmlConfigurationProvider及其子類StrutsXmlConfigurationProvider來解析。
    </p>
    <p>
        結合上圖Struts2的處理流程就已經能夠非常清晰了
    </p>
</div>

</div>

 本文由用戶 n7w77 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!