Struts2基礎入門

sufeizi發表於2014-01-13

1.2    Struts2 基礎

1.2.1  Struts1時代

隨著時間的推移,Servlet+JSP+JavaBean模型暴露出了它的缺點:

  • 流程凌亂:Servlet在完成對使用者請求的處理後,下一個頁面是誰?如何跳轉過去?這些都是在Servlet裡面直接寫程式碼來完成的。導致Servlet既要處理請求,還要負責頁面的流程,使得Servlet功能不夠單一,更要命的是很難整體把握整個系統的頁面流程,因為流程被分散到各個Servlet裡面了。
  • 資料傳遞無序:在Model2模型裡面,通常情況下,資料都是使用JavaBean傳來傳去的,使用上比較麻煩,而且在面臨複雜資料巢狀的時候使用JavaBean,常常感覺力不從心。
  • 缺乏輔助功能:幾乎所有的東西都要程式設計師從頭做起,沒有統一的分發排程、驗證框架、國際化、本地化、例外訊息處理等等。

正當大家感覺痛苦的時候,Struts1勇敢地站出來解決這些問題。

Struts1是一個按照MVC模式開發的輕量級web應用框架,一經推出就很快風靡全球。對於那些一直在用Servlet+JSP+JavaBean的web開發者來說,Struts1可以幫助他們解決很多問題。比如:合理的程式碼結構劃分,各種各樣的實用工具框架(如驗證框架、國際化框架)等等。

因此,在Struts1普及之後,大多數面試官進行面試的時候,每面必問到Struts1。那個時候Struts1真可謂一統江湖,在簡歷上如果沒寫能熟練使用Struts的話,就好像給自己判了死緩一樣。

但是,隨著時間的推移,Struts1的各種缺點也體現出來了,比如:

  • Action實現類必須繼承Struts1中的Action,降低了靈活性。
  • 在一個應用中,只能使用一個單一的ActionServlet,可能會導致配置衝突
  • Action的API同HttpServletRequest和HttpServeletResponse是耦合的,這使得單元測試變得很困難,雖然最後推出了一個StrutsTestCase,但是使用也比較麻煩。
  • 頁面傳值的JavaBean必須繼承Struts1中的FormBean,而其本質就是個JavaBean,使用起來照樣比較麻煩。
  • 相比Struts2,Struts1沒有獨立的攔截器模型,使得所有類似面向切面(AOP)的操作都要寫成Filter,而Filter在使用和配置上都較弱。

       當上面這些問題在Struts1上出現後,逐漸出現了一些在Struts1基礎上的改進型web框架。具有代表性的有Struts2(WebWork)、Tapestry、SpringMVC等等。其中,最優秀的當然就是我們即將學習的Struts2了。

1.2.2  Struts2出世

由於前面提到的Struts1的缺點,使得它越來越無法滿足開發人員靈活、多變的開發需求,同時開發效率低下也暴露無遺,很多開發人員開始選擇其他更優秀的Web框架。Struts1的開發團隊注意到了這個問題,他們也決定要大力改進,或是合併其他優秀的框架。

這個時候WebWork進入了Struts1開發團隊的視野,WebWork設計思想先進,功能強大,但是市場佔有率並不理想,因此,兩個框架決定合併,就得到了現在的Struts2。事實上Struts2是在WebWork2的基礎上進行開發的,Struts2.0實際就是WebWork2.3,它並沒有Struts1的血統。

       Struts2既擁有WebWork優良的設計和功能,又擁有Struts1的強大品牌號召力,所以在面世之初就引起了web開發者廣泛的興趣。經過幾年的普及,越來越多的新專案都採用了Struts2,而Struts1基本上就是用來維護歷史專案了。作為web開發人員,Struts2幾乎是一個必備的框架,其重要性不言而喻了。

 

那麼Struts2到底是什麼呢?

Struts2是一種基於MVC的輕量級的web應用框架。

  • 所謂框架:就是能完成一定功能的半成品軟體。在沒有框架的時候,所有的工作都要乖乖的從零做起;但是,有了框架,它為我們提供了一定的功能,就可以在框架的基礎上做起了,大大提高開發的效率和質量。
  • web應用框架,這說明Struts2的應用範圍是Web應用而不是其它地方。換句話說Struts2更注重將Web應用領域的日常工作和常見問題抽象化,為我們提供一個平臺,讓我們能基於這個平臺快速的完成Web應用開發。
  • 輕量級:是相對於重量級而言,指的是Struts2在執行的時候,對Web伺服器的資源消耗較少,比如CPU、記憶體等,但是執行速度相對較快。
  • 基於MVC,說明基於Struts2開發的Web應用自然就能實現MVC,同時也說明Struts2著力於在MVC的各個部分為我們的開發提供相應幫助。

所以稱Struts2為一種基於MVC的輕量級的web應用框架。

1.2.3  Struts2基本組成

WebWork與Struts合併之後,根據功能的細分和設計,拆分出一個叫xwork的部分,用來處理與Web無關的部分,也就是與Servlet無關的部分,比如:使用者資料的型別轉換、動作呼叫之前的資料驗證、動作的呼叫等等。

其餘與Web相關的部分,也就是與servlet相關的部分,被稱為struts2部分。因此請注意,此處的“Struts2”可以理解為一個模組,是Struts2框架的一部分,如:如何接收使用者請求的資料,如何跳轉到下一個頁面等等。

其中struts2部分呼叫了xwork部分,但是xwork部分是不依賴於Struts2部分的,xwork是完全獨立的、純Java的應用。因此,可以用下圖來表示struts2部分和xwork部分的關係。

1.2.4  Struts2能幹什麼

在瞭解了Struts2是什麼和基本有什麼過後,一起來看看Struts2究竟可以做什麼。看看Struts2到底有些什麼魔法 功能,能讓我們的Web開發變得更加輕鬆愉快呢?

  • Struts2通過簡單、集中的配置來排程動作類,使得我們配置和修改都非常容易。
  • Struts2提供簡單、統一的表示式語言來訪問所有可供訪問的資料。
  • Struts2提供記憶體式的資料中心,所有可供訪問的資料都集中存放在記憶體中,所以在呼叫中不需要將資料傳來傳去,大家都去這個記憶體資料中心訪問即可。
  • Struts2提供在動作類執行的前或後附加執行一定功能的能力,能實現AOP。
  • Struts2提供標準的、強大的驗證框架和國際化框架,而且與Struts2的其他特性緊密結合。

類似這樣的功能很多,不勝列舉。

       在Struts2官方文件的首頁上,Struts2開發團佇列出了Struts2的一些優勢,一起來看看:

  • 簡單的建立 - 直接拷入自帶的空專案(struts-blank.war)的各種配置即可。
  • 改進的設計 - 程式碼不直接依賴各種HTTP(如HttpServletRequest)的API。這樣可以使得單元測試簡單、高效。
  • 強大的標籤 - 使用標籤可以有效的減少頁面程式碼。
  • 良好的ajax支援 - 增加了有效的、靈活的ajax標籤,就像普通的標準struts標籤一樣。
  • 簡單的spring整合 - 使用spring注入Action依賴的其他bean,而不需要額外的程式碼。
  • 強大的結果 - 除了簡單的JSP或Freemarker等標籤,還支援JasperReports, JFreeChart和檔案下載等,使得這些技術就像在Struts2中內建一樣,而不需要其他結合程式碼。
  • POJO(不實現特殊介面或繼承特殊父類的普通物件)的forms - 不再有struts1的ActionForm。任何JavaBean都可以用來向Action傳入或傳出request的引數,甚至二進位制的OutputStream等也可以。
  • POJO的Actions - Action也不用實現特定的介面或繼承特殊的類了。甚至可以使我們的Action不經過修改,就可以被其他框架重用。
  • 簡單的外掛 - 簡單的放入一個jar包,任何人都可以擴充套件struts2框架,而不需要什麼特殊的配置。Struts2不再是一個封閉的框架,任何人都可以為其添磚加瓦,我們可以通過實現Struts2的某些特殊的可擴充套件點,比如自定義攔截器、自定義結果型別、自定義標籤等等,就可以為Struts2定製我們需要的功能,而且還可以快速的釋出給別人使用,就像Eclipse的外掛機制一樣,超酷。
  • 明確的錯誤報告 - Struts2的異常簡單而明瞭,直接指出錯誤的地方。
  • 簡單的Action測試 - 不需要模擬HTTP物件就可以直接測試struts2的action。這使得我們的單元測試非常方便。
  • 智慧的預設 - 跳過了冗餘的設定。很多框架級物件都有一個預設的值,可以根本不用去關心它們,使用其預設設定就可以完成95%的日常工作。
  •  

    私塾線上網站原創《研磨struts2》系列

    轉自請註明出處:【http://sishuok.com/forum/blogPost/list/0/3988.html

    歡迎訪問http://sishuok.com獲取更多內容

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29361362/viewspace-1069898/,如需轉載,請註明出處,否則將追究法律責任。