Spring、Spring MVC、Struts二、、優缺點整理

Spring 及其優勢

大部分項目都少不了Spring的身影,爲何你們對他如此青睞,並且對他的追捧絲毫沒有減退之勢呢html

Spring是什麼:git

Spring是一個輕量級的DI和AOP容器框架。面試

說它輕量級有一大部分緣由是相對與EJB的(雖然本人從沒有接觸過EJB的應用),重要的是,Spring是非侵入式的,基於spring開發的應用通常不依賴於spring的類。ajax


DI: 稱做依賴注入(Dependency Injection),和控制反轉一個概念,具體的講,當一個角色須要另一個角色協助的時候,在傳統的程序設計中,一般有調用者來建立被調用者的實例。可是在spring中建立被調用者將再也不有調用者完成,所以叫控制反轉。建立被調用對象有Spring來完成,在容器實例化對象的時候主動的將被調用者(或者說它的依賴對象)注入給調用對象,所以又叫依賴注入。
AOP: Spring對面向切面編程提供了強有力的支持,經過它讓咱們將業務邏輯從應用服務(如事務管理)中分離出來,實現了高內聚開發,應用對象只關注業務邏輯,再也不負責其它系統問題(如日誌、事務等)。Spring支持用戶自定義切面。
面向切面編程是面向對象編程的有力補充。面向對象編程將程序分紅各個層次的對象,面向切面的程序將運行過程分解成各個切面。AOP是從運行程序的角度去考慮程序的結構,提取業務處理過程的切面,OOP是靜態的抽象,AOP是動態的抽象,是對應用執行過程的步驟進行抽象,從而得到步驟之間的邏輯劃分。
容器: Spring是個容器,由於它包含而且管理應用對象的生命週期和配置。如對象的建立、銷燬、回調等。

框架:Spring做爲一個框架,提供了一些基礎功能,(如事務管理,持久層集成等),使開發人員更專一於開發應用邏輯。spring

看完了Spring是什麼,再來看看Spring有哪些優勢數據庫

1.使用Spring的IOC容器,將對象之間的依賴關係交給Spring,下降組件之間的耦合性,讓咱們更專一於應用邏輯apache

2.能夠提供衆多服務,事務管理,WS等。編程

3.AOP的很好支持,方便麪向切面編程。bash

4.對主流的框架提供了很好的集成支持,如Hibernate,Struts2,JPA等服務器

5.Spring DI機制下降了業務對象替換的複雜性。

6.Spring屬於低侵入,代碼污染極低。

7.Spring的高度可開放性,並不強制依賴於Spring,開發者能夠自由選擇Spring部分或所有

Struts2的優勢

Struts2 是一個至關強大的Java Web開源框架,是一個基於POJO的Action的MVC Web框架。它基於當年的Webwork和XWork框架,繼承其優勢,同時作了至關的改進。Struts2如今在Java Web開發界的地位能夠說是大紅大紫,從開發人員的角度來分析,Struts2之因此可以如此的深刻開發人員之心,與其優良的設計是分不開的。

一、Struts2基於MVC架構,框架結構清晰,開發流程一目瞭然,開發人員能夠很好的掌控開發的過程。

我在項目開發過程當中,一個具體的功能的開發流程是:拿到一個具體的功能需求文檔和設計好的前臺界面(在開發中我不負責設計頁面),分析須要從前臺傳遞哪些參數,肯定參數的變量名稱,在Action中設置相應的變量,這些參數在前臺如何顯示,並將頁面上的一些控件適當使用Struts2提供的服務器端控件來代替,編寫Action對應的方法來完成業務邏輯,最後,作一些與配置文件相關的設置。固然實際的開發比這個過程要複雜,涉及到數據庫,驗證,異常等處理。可是使用Struts2進行開發,你的關注點絕大部分是在如何實現業務邏輯上,開發過程十分清晰明瞭。

二、使用OGNL進行參數傳遞。

OGNL提供了在Struts2裏訪問各類做用域中的數據的簡單方式,你能夠方便的獲取Request,Attribute,Application,Session,Parameters中的數據。大大簡化了開發人員在獲取這些數據時的代碼量。

三、強大的攔截器

Struts2 的攔截器是一個Action級別的AOP,Struts2中的許多特性都是經過攔截器來實現的,例如異常處理,文件上傳,驗證等。攔截器是可配置與重用的,能夠將一些通用的功能如:登陸驗證,權限驗證等置於攔截器中以完成一些Java Web項目中比較通用的功能。在我實現的的一Web項目中,就是使用Struts2的攔截器來完成了系統中的權限驗證功能。

四、易於測試

Struts2的Action都是簡單的POJO,這樣能夠方便的對Struts2的Action編寫測試用例,大大方便了Java Web項目的測試。


五、易於擴展的插件機制

在Struts2添加擴展是一件愉快而輕鬆的事情,只須要將所須要的Jar包放到WEB-INF/lib文件夾中,在struts.xml中做一些簡單的設置就能夠實現擴展。經常使用的Struts2的擴展能夠經過這個連接找到:
http://cwiki.apache.org/S2PLUGINS/home.html

六、模塊化

Struts2已經把模塊化做爲了體系架構中的基本思想,能夠經過三種方法來將應用程序模塊化:
將配置信息拆分紅多個文件

把自包含的應用模塊建立爲插件

建立新的框架特性,即將與特定應用無關的新功能組織成插件,以添加到多個應用中去。

七、全局結果與聲明式異常

爲應用程序添加全局的Result,和在配置文件中對異常進行處理,這樣當處理過程當中出現指定異常時,能夠跳轉到特定頁面,這一功能十分實用。

Spring MVC和Struts2的比較的優勢

咱們用struts2時採用的傳統的配置文件的方式,並無使用傳說中的0配置。spring3 mvc能夠認爲已經100%零配置了(除了配置spring mvc-servlet.xml外)。


Spring MVC和Struts2的區別:

  1. 機制:spring mvc的入口是servlet,而struts2是filter(這裏要指出,filter和servlet是不一樣的。之前認爲filter是 servlet的一種特殊),這樣就致使了兩者的機制不一樣,這裏就牽涉到servlet和filter的區別了。

  2. 性能:spring會稍微比struts快。spring mvc是基於方法的設計,而sturts是基於類,每次發一次請求都會實例一個action,每一個action都會被注入屬性,而spring基於方法,粒度更細,但要當心把握像在servlet控制數據同樣。spring3 mvc是方法級別的攔截,攔截到方法後根據參數上的註解,把request數據注入進去,在spring3 mvc中,一個方法對應一個request上下文。而struts2框架是類級別的攔截,每次來了請求就建立一個Action,而後調用setter getter方法把request中的數據注入;struts2其實是經過setter getter方法與request打交道的;struts2中,一個Action對象對應一個request上下文。

  3. 參數傳遞:struts是在接受參數的時候,能夠用屬性來接受參數,這就說明參數是讓多個方法共享的。

  4. 設計思想上:struts更加符合oop的編程思想, spring就比較謹慎,在servlet上擴展。

  5. intercepter的實現機制:struts有以本身的interceptor機制,spring mvc用的是獨立的AOP方式。這樣致使struts的配置文件量仍是比spring mvc大,雖然struts的配置能繼承,因此我以爲論使用上來說,spring mvc使用更加簡潔,開發效率Spring MVC確實比struts2高。spring mvc是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,因此說從架構自己上spring3 mvc就容易實現restful url。struts2是類級別的攔截,一個類對應一個request上下文;實現restful url要費勁,由於struts2 action的一個方法能夠對應一個url;而其類屬性卻被全部方法共享,這也就沒法用註解或其餘方式標識其所屬方法了。spring3 mvc的方法之間基本上獨立的,獨享request response數據,請求數據經過參數獲取,處理結果經過ModelMap交回給框架方法之間不共享變量,而struts2搞的就比較亂,雖然方法之間也是獨立的,但其全部Action變量是共享的,這不會影響程序運行,卻給咱們編碼,讀程序時帶來麻煩。

  6. 另外,spring3 mvc的驗證也是一個亮點,支持JSR303,處理ajax的請求更是方便,只需一個註解@ResponseBody ,而後直接返回響應文本便可。送上一段代碼:

    @RequestMapping(value=「/whitelists」)public String index(ModelMap map) {Account account = accountManager.getByDigitId(SecurityContextHolder.get().getDigitId());List groupList = groupManager.findAllGroup(account.getId());map.put(「account」, account);map.put(「groupList」, groupList);return 「/group/group-index」;}// @ResponseBody ajax響應,處理Ajax請求也很方便@RequestMapping(value=「/whitelist/{whiteListId}/del」)@ResponseBodypublic String delete(@PathVariable Integer whiteListId) {whiteListManager.deleteWhiteList(whiteListId);return 「success」;}
    複製代碼

以爲不錯請關注支持,歡迎看我主頁進個人我的羣領取【架構資料專題視頻】歡迎看我主頁進個人我的羣【點擊進入個人主頁】本羣專用於學習交流技術、分享面試機會,拒絕廣告,我也會在羣內不按期答題、探討。 

相關文章
相關標籤/搜索