SpringMVC 、Struts2之間的區別

1、Spring與SpringMVC的區別:  前端

spring是一個開源框架,是爲了解決企業應用程序開發,功能以下:  程序員

功能:使用基本的JavaBean代替EJB,並提供了更多的企業應用功能  web

範圍:任何Java應用   Spring是一個輕量級的控制反轉(IoC)和麪向切面(AOP)的容器框架。spring

   一、輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架能夠在一個大小隻有1MB多的JAR文件裏發佈。而且Spring所需的處理開銷也是微不足道的。此外, Spring是非侵入式的:典型地,Spring應用中的對象不依賴於Spring的特定類。  編程

  二、控制反轉——Spring經過一種稱做控制反轉(IoC)的技術促進了鬆耦合。當應用了IoC,一個對象依賴的其它對象會經過被動的方式傳遞進來,而不是這個對象本身建立或者查找依賴對象。你能夠認爲IoC與JNDI相反——不是對象從容器     中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。   json

三、面向切面——Spring提供了面向切面編程的豐富支持,容許經過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務(transaction)管理)進行內聚性的開發。應用對象只實現它們應該作的——完成業務邏輯——     僅此而已。它們並不負責(甚至是意識)其它的系統級關注點,例如日誌或事務支持。   後端

四、容器——Spring包含並管理應用對象的配置和生命週期,在這個意義上它是一種容器,你能夠配置你的每一個bean如何被建立——基於一個可配置原型(prototype),你的bean能夠建立一個單獨的實例或者每次須要時都生成一個新的實例     ——以及它們是如何相互關聯的。然而,Spring不該該被混同於傳統的重量級的EJB容器,它們常常是龐大與笨重的, 難以使用。   安全

五、框架——Spring能夠將簡單的組件配置、組合成爲複雜的應用。在Spring中,應用對象被聲明式地組合,典型地是在     一個XML文件裏。Spring也提供了不少基礎功能(事務管理、持久化框架集成等等),將應用邏輯的開發留給了你。全部Spring的這些特徵使你可以編寫更乾淨、更可管理、而且更易於測試的代碼。它們也爲Spring中的各類模塊提供了基礎支持。Spring的兩大核心AOP與IOC,能夠單獨用於任何應用,包括與Struts等MVC框架與Hibernate等ORM框架的集成,目前不少公司所謂的輕量級開發就是用Spring + Struts(2)+Hibernate。    服務器

Spring MVC就是一個MVC框架,我的以爲Spring MVC annotation式的開發比Struts2方便,能夠直接代替上面的Struts(固然Struts的作爲一個很是成熟的MVC,功能上感受仍是比Spring強一點,不過Spring MVC已經足夠用了)。固然spring mvc的執行效率比struts高,是由於struts的值棧影響效率。    restful

spring mvc相似於struts的一個MVC開框架,其實都是屬於spring,spring mvc須要有spring的架包做爲支撐才能跑起來。

   2、Spring與Struts2的區別:     

Struts2就是一個攔截器棧 也就是一系列的攔截器。處理用戶的請求,OGNL的使用,表單驗證 等都是默認的攔截器在起做用。     

spring的攔截器,主要體如今AOP的事務管理方面,還有好比一些錯誤或者異常的日誌的顯示也是經過配置spring的log攔截器來實現的。  

3、StringMVC與Struts2的區別:     

   一、Struts2是類級別的攔截, 一個類對應一個request上下文,SpringMVC是方法級別的攔截,   一個方法對應一個request上下文,而方法同時又跟一個url對應,因此說從架構自己上SpringMVC就容易實現   restful url,而struts2的架構實現起來要費勁,由於Struts2中Action的一個方法能夠對應一個url,   而其類屬性卻被全部方法共享,這也就沒法用註解或其餘方式標識其所屬方法了。

    二、SpringMVC的方法之間基本上獨立的,獨享request response數據,請求數據經過參數獲取,  處理結果經過ModelMap交回給框架,方法之間不共享變量,而Struts2搞的就比較亂,雖然方法之間也是獨立的,  但其全部Action變量是共享的,這不會影響程序運行,卻給咱們編碼 讀程序時帶來麻煩,  每次來了請求就建立一個Action,一個Action對象對應一個request上下文。

    三、Struts2須要針對每一個request進行封裝,把request,session等servlet生命週期的變量封裝成一個一個Map,  供給每一個Action使用,並保證線程安全,因此在原則上,是比較耗費內存的。

    四、攔截器實現機制上,Struts2有以本身的interceptor機制,SpringMVC用的是獨立的AOP方式,  這樣致使Struts2的配置文件量仍是比SpringMVC大。

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

    六、SpringMVC集成了Ajax,使用很是方便,只需一個註解@ResponseBody就能夠實現,而後直接返回響應文本便可,  而Struts2攔截器集成了Ajax,在Action中處理時通常必須安裝插件或者本身寫代碼集成進去,  使用起來也相對不方便。

    七、SpringMVC驗證支持JSR303,處理起來相對更加靈活方便,而Struts2驗證比較繁瑣,感受太煩亂。

    八、SpringMVC和Spring是無縫的。從這個項目的管理和安全上也比Struts2高(  固然Struts2也能夠經過不一樣的目錄結構和相關配置作到SpringMVC同樣的效果,可是須要xml配置的地方很多)。

    九、設計思想上,Struts2更加符合OOP的編程思想, SpringMVC就比較謹慎,在servlet上擴展。

    十、SpringMVC開發效率和性能高於Struts2。

    十一、SpringMVC能夠認爲已經100%零配置

一、從安全性角度分析spring mvc和struts2的區別:

spring mvc:controller

1.spring mvc 默認controller是單實例(經過註解@Scope(「prototype」)變了多實例); 
2.單實例時非線程安全,不要在controller中定義成員變量(實例變量); 
3.單實例時,web容器啓動時便開始實例化controller,全局惟此實例,每次訪問都使用此實例響應; 
4.多實例時,每一次訪問,基本&多數(發現偶爾也會重複使用實例)會產出新實例對應響應; 
5.單實例時,併發請求,訪問synchronized同步方法時,彼此阻塞影響(synchronized方法實例鎖); 
6.多實例時,併發請求,訪問synchronized同步方法時,彼此不影響(synchronized方法實例鎖);

 

struts2:action

1.struts2爲每一個線程提供一個action實例,多線程訪問時不會出現問題。當使用spring管理struts2的action實例對象時,scope必須配置爲prototype或者session;若配置爲singleton則多線程訪問時會出現問題,例如actionMessage,fieldError等信息會累加,多用戶訪問時有的用戶訪問到的是另外一個用戶的數據。 
2.scope=「prototype」是爲每一個請求提供一個action實例(與struts2的機制是同樣的)。 
scope=「session」是爲每一個會話提供一個action實例。 
3.一般使用prototype,即讓spring容器爲每一個請求提供一個action實例,好處是服務器端不用維護用戶狀態信息,不然使用session服務器端必須存儲狀態信息,用戶多時佔用服務器端內存過多。使用prototype時,必須本身在客戶端維護用戶的狀態,每次訪問服務端時將相應狀態信息提交給服務器。 
例如scope=「prototype」時,頁面通常< input name="id" type="hidden" value="${id}"/>用來存儲用戶的id信息,訪問action時提交到server端供action中函數使用。而使用scope=「session」時,頁面沒必要使用hidden的對象隱藏id信息,只要服務端獲取過用戶的id,action中的id屬性即會保存這個信息。

二、從總體上分析springmvc和struts2的區別 

一、springmvc基於方法開發的,struts2基於類開發的。
springmvc將url和controller方法映射。映射成功後springmvc生成一個Handler對象,對象中只包括了一個method。方法執行結束,形參數據銷燬。
struts2的action類中的全部方法用的都是action類中的成員變量,一旦方法變得不少的時候,咱們就會不知道action類中那麼多成員變量是給那個方法去使用的。十分混亂。
可是springmvc的全部參數都是定義爲方法的形參,這樣使用什麼方法就將參數注入至對應方法的形參,因此springmvc的controller開發相似service開發。
二、springmvc能夠進行單例開發,而且建議使用單例開發,struts2經過類的成員變量接收參數,沒法使用單例,只能使用多例。
三、通過實際測試,struts2速度慢,在於使用struts標籤,若是使用struts建議使用jstl。
  最後咱們沒法實際定義springmvc與struts到底誰好誰壞,只能說struts早期因爲用的比較多,它的漏洞就比較多。建議若是使用struts,就使用最新的包,由於之前的可能會有漏洞。但springmv目前幾乎沒有漏洞,這就是springmvc最近幾年開始流行起來的緣由,再有一個springmvc是基於方法開發的,更接近於service開發。


springmvc總結
springmvc框架:
DispatcherServlet前端控制器:接收request,進行response
HandlerMapping處理器映射器:根據url查找Handler。(能夠經過xml配置方式,註解方式)
HandlerAdapter處理器適配器:根據特定規則去執行Handler,編寫Handler時須要按照HandlerAdapter的要求去編寫。
Handler處理器(後端控制器):須要程序員去編寫,經常使用註解開發方式。
Handler處理器執行後結果 是ModelAndView,具體開發時Handler返回方法值類型包括 :ModelAndView、String(邏輯視圖名)、void(經過在Handler形參中添加request和response,相似原始 servlet開發方式,注意:能夠經過指定response響應的結果類型實現json數據輸出)
View resolver視圖解析器:根據邏輯視圖名生成真正的視圖(在springmvc中使用View對象表示)
View視圖:jsp頁面,僅是數據展現,沒有業務邏輯。

 

springmvc和struts2區別:
springmvc面向方法開發的(更接近service接口的開發方式),struts2面向類開發。

springmvc能夠單例開發,struts2只能是多例開發。

相關文章
相關標籤/搜索