Struts2工作原理詳解,從Struts2的角度來理解MVC模型

        1、前言

        先簡單說一下Struts1.x,Struts1是真正意義上的MVC模式,發佈後受到廣大程序開發人員的認可。性能高效、鬆耦合、低侵入永遠是開發人員追求的理想狀態,而Struts1在這些方面又恰恰存在着不足之處。在這種情況下,全新的Struts2框架應運而生,它彌補了Struts1框架中存在的不足和缺陷,並且還提供了更加靈活與強大的功能。

        需要注意的是,Struts2框架並不是Struts1的升級版,而是一個全新的框架,在體系結構上與Struts1也存在着較大的差距。它將Struts技術與WebWork技術完美的結合起來,擁有非常廣泛的使用前景。WebWork是在2002年發佈的一個開源Web框架,與Struts1相比,其功能更加靈活。

        2、Struts2工作流程

       Struts2是一個全新的開發框架,它對JavaWeb開發的影響可以說是無比深遠的。下圖是Struts2的體系結構圖:

       

        具體來說,Struts2框架處理一個用戶請求的大致步驟可以分爲以下幾步:

  1. 用戶發出一個HttpServletRequest請求。
  2. 這個請求經過一系列的過濾器Filter來傳送。如果Struts2與Site Mesh插件以及其他框架進行了集成,則請求首先要可選的ActionContextCleanUp過濾器。
  3. 調用FilterDispatcher。FilterDispatcher時控制器的核心,他通過詢問ActionMapper來確定該請求是否需要調用某個Action。如果需要調用某個Action,FilterDispatcher就把該請求轉交給ActionProxy處理。
  4. ActionProxy通過配置管理器Configuration Manager詢問框架的配置文件struts.xml,從而找到需要調用的Action類。
  5. ActionProxy創建一個ActionInvocation的實例,該實例使用命名模式來調用。在Action執行的前後,ActionInvocation實例根據配置文件加載與Action相關的所有攔截器Interceptor。
  6. 一旦Action執行完畢,ActionInvocation實例根據struts.xml文件中的配置找到相應的返回結果。返回結果通常是一個JSP或者FreeMarker的模板。
  7. 最後,HttpServletResponse響應通過web.xml文件中配置的過濾器返回。

        3、從Struts2的角度理解MVC

        在Struts2,模型層對應業務邏輯組件,它通常用於實現業務邏輯及與底層數據庫的交互等。視圖層對應試圖組件,通常是值指JSP頁面。但也適用於其他視圖技術。如Velocity或者Excel文檔。控制層對應系統核心控制器和業務邏輯控制器。系統核心控制器爲Struts2框架提供的FilterDispatcher,它是一個起過濾器作用的類,能根據請求自動調用相應的Action。而業務邏輯控制器是指開發人員自行定義的一系列Action,在Action中負責調用相應的業務邏輯組件來完成處理。

        從MVC的角度出發看,可以對Struts2的工作流程作出如下描述:

  1. 瀏覽器發出請求。
  2. 控制層中的核心控制器FilterDispatcher根據請求調用相應的Action。
  3. Struts2的攔截器鏈(即一系列攔截器)自動對應請求調用一些通用的控制邏輯,如數據校驗、對數據的封裝和文件上傳等功能。
  4. 回調Action中的execute()方法(Action對象的默認方法),並在方法體中調用業務邏輯組件,即自定義的JavaBean等來處理請求,如數據的查詢處理等。
  5. execute()方法返回後會產生一個輸出。
  6. 該輸出經過攔截器鏈自動處理,這和開始的攔截器鏈處理是相反的過程。
  7. 控制層最後將數據返還並更新視圖層。

        由此,可以看到Struts2和MVC是相對應的,Struts2中的FilterDispatcher對應着MVC中的控制層,Action對應着模型層,產生的結果Result對應視圖層。

  • FilterDispatcher--------控制層

        用戶請求首先到達Struts2中的FilterDispatcher。FilterDispatcher負責根據用戶提交的URL和struts.xml中的配置,來選擇合適的動作(Action),讓這個Action來處理用戶的請求。

        FilterDispatcher其實是一個過濾器Filter(Servlet規範中的一種Web組件),它是Struts2核心包裏已經做好的類,不需要程序員去開發,是需要在項目的web.xml文件中配置一下即可。FilterDispatcher體現了J2EE核心設計模式中的前端控制器模式。

  • Action--------模型層

        Action負責把用戶請求中的參數組裝成合適的參數模型,並調用相應的業務邏輯進行真正的功能處理,然後產生下一個視圖展示所需要的數據。最後得到下一個視圖所需要的信息,並傳遞給控制層中的攔截器鏈。

  • Result--------視圖層

        視圖層主要用來與用戶交互,它將從控制層得到的數據通過適合的展示方式展現給用戶,讓用戶與之交互更加簡潔簡單。在Struts2中,除了大衆熟知的JSP方式,還有freemarker、velocity等各種優秀的展示方式。

        總之,Struts2框架實現了MVC的設計思想,使得系統各組件之間的偶和降低,提高了程序的高度擴展性和可維護性。


        4、Struts2的開發優勢

        Struts2是對MVC思想的具體實現,具有非常好的開發優勢,它較低的軟件開發週期以及高可維護性,都深深地吸引了衆多的程序開發人員。隨着時代的發展,各種開發工具層出不窮,程序開發人員對開發工具的需求也越來越靈活多變。Struts2融合了許多優秀的Web框架的優點,並對缺點進行了改進,使得Struts2在開發過程中具有更大的優勢,下面是使用Struts2進行Java Web開發的一些優點,僅供參考:

  1. 通過簡單、集中的配置來調度動作類,使得配置和修改都非常容易。
  2. 提供簡單、統一的表達式語言來訪問所有可訪問的數據。
  3. 提供內存方式的數據中心,所有可訪問的數據都集中在存放在內存中,所以在調用中不需要將數據傳來傳去,只需要去內存數據中心訪問即可。
  4. Struts2提供標準的、強大的驗證框架和國際化框架,而且與Struts2的其他特性緊密結合。
  5. 強大的標籤庫,使用標籤庫可以有效的減少頁面代碼。
  6. 良好的Ajax支持。增加了有效的、靈活的Ajax標籤,就像普通的標準Struts2標籤一樣。
  7. 簡單的插件。只需要簡單的放入一個jar包 ,任何人都可以擴展Struts2框架,而不需要什麼特殊的配置。這使得Struts2不是再是一個封閉的框架,任何人都可以爲其添磚加瓦,可以通過實現Struts2的某些特殊的可擴展點,比如自定義攔截器、自定義結果類型、自定義標籤等,來爲Sturts2定製需要的功能,而且還可以快速的發佈給別人使用,就像Eclipse的插件機制一樣,簡單易用。
  8. 明確的錯誤報告,Struts2的異常簡單而明瞭,直接指出錯誤的地方。
  9. 智能的默認設置,不需要程序員另外進行繁瑣的設置。很多框架對象都有一個默認的值,不用再進行設置,使用其默認設置就可以完成大多數程序開發所需要的功能。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章