深入理解Struts2

Roberta16E 8年前發布 | 12K 次閱讀 Struts2 Web框架

來自: http://blog.csdn.net/u010926964/article/details/50605188


簡介

  Struts 2是Struts的下一代產品,是在 struts 1和WebWork的技術基礎上進行了合并的全新的Struts 2框架。其全新的Struts 2的體系結構與Struts 1的體系結構差別巨大。Struts 2以WebWork為核心,采用攔截器的機制來處理用戶的請求,這樣的設計也使得業務邏輯控制器能夠與ServletAPI完全脫離開,所以Struts 2可以理解為WebWork的更新產品。雖然從Struts 1到Struts 2有著太大的變化,但是相對于WebWork,Struts 2的變化很小。

  無論從struts2的設計角度看,還是從struts2在實際項目中的易用性來看,struts2都是一個非常優秀的mvc框架。與struts1相比,struts2允許使用使用普通的Java對象作為action,給予aop思想的爛機器機制,提供了幾號的可擴展性。

mvc思想及其優勢

  mvc并不是Java語言所特有的設計思想,也并不是web應用所特有的思想,他是所有面向對象程序設計語言都應遵循的規范。mvc是一種設計模式,將應用分為三層:model、view、controller。這三層以最少的耦合協同工作,從而提高應用的可擴展及可維護性。

  從設計模式角度來看,mvc非常類似于觀察者模式,但與觀察者模式存在少許的差別:觀察者模式下的觀察者和被觀察者可以是兩個互相對等的對象,但對于mvc思想而言,被觀察者往往只是單純的數據體,而觀察者則是單純的視圖頁面。

mvc的特點

  多格式圖對應一個模型。

  模型返回的數據與現實邏輯分離。

  應用被分割為三層,降低了隔層之間的耦合性。

  控制層吧不同的模型和不同的視圖組合在一起,完成不同的請求。

  符合軟件工程化管理的精神。

struts2的工作流程

配置步驟

  1.web.xml文件中定義核心filter來攔截用戶請求。

  2.如果需要以post方式提交請求,則定義包含表單數據的JSP頁面。如果僅僅只是以get方式發送請求,則無需經過這一步。

  3.定義處理用戶請求的action類。

  4.配置action。

  5.配置處理結果和物理視圖資源之間的對應關系。

  6.編寫資源視圖

工作流程

 

優缺點

優點:

  1. 實現MVC模式,結構清晰,使開發者只關注業務邏輯的實現.

  2. 有豐富的tag可以用 ,Struts的標記庫(Taglib),如能靈活動用,則能大大提高開發效率。另外,就目前國內的JSP開發者而言,除了使用JSP自帶的常用標記外,很少開發自己的標記,或許Struts是一個很好的起點。

  3. 頁面導航.頁面導航將是今后的一個發展方向,事實上,這樣做,使系統的脈絡更加清晰。通過一個配置文件,即可把握整個系統各部分之間的聯系,這對于后期的維護有著莫大的好處。尤其是當另一批開發者接手這個項目時,這種優勢體現得更加明顯。

  4. 提供Exception處理機制 .

  5. 數據庫鏈接池管理
  6. 支持I18N

缺點: 

  1. 轉到展示層時,需要配置forward,每一次轉到展示層,相信大多數都是直接轉到jsp,而涉及到轉向,需要配置forward,如果有十個展示層的jsp,需要配置十次struts,而且還不包括有時候目錄、文件變更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整個項目,而tomcate這樣的服務器,還必須重新啟動服務器,如果業務變更復雜頻繁的系統,這樣的操作簡單不可想象。現在就是這樣,幾十上百個人同時在線使用我們的系統,大家可以想象一下,我的煩惱有多大。

  2.Struts 的Action必需是thread-safe方式,它僅僅允許一個實例去處理所有的請求。所以action用到的所有的資源都必需統一同步,這個就引起了線程安全的問題。
  3. 測試不方便. Struts的每個Action都同Web層耦合在一起,這樣它的測試依賴于Web容器,單元測試也很難實現。不過有一個Junit的擴展工具Struts TestCase可以實現它的單元測試。
  4.類型的轉換. Struts的FormBean把所有的數據都作為String類型,它可以使用工具Commons-Beanutils進行類型轉化。但它的轉化都是在Class級別,而且轉化的類型是不可配置的。類型轉化時的錯誤信息返回給用戶也是非常困難的。
  5.對Servlet的依賴性過強. Struts處理Action時必需要依賴ServletRequest 和ServletResponse,所有它擺脫不了Servlet容器。
  6.前端表達式語言方面.Struts集成了JSTL,所以它主要使用JSTL的表達式語言來獲取數據。可是JSTL的表達式語言在Collection和索引屬性方面處理顯得很弱。
  7. 對Action執行的控制困難. Struts創建一個Action,如果想控制它的執行順序將會非常困難。甚至你要重新去寫Servlet來實現你的這個功能需求。
  8.對Action 執行前和后的處理. Struts處理Action的時候是基于class的hierarchies,很難在action處理前和后進行操作。
  9.對事件支持不夠. 在struts中,實際是一個表單Form對應一個Action類(或DispatchAction),換一句話說:在Struts中實際是一個表單只能對應一個事件,struts這種事件方式稱為application event,application event和component event相比是一種粗粒度的事件。 

  任何一種技術的誕生都有其優缺點,在項目中根據實際情況選擇性使用,文章中有不足之處,請大家批評指正。

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