一、Spring與SpringMVC的區(qū)別:
spring是一個開源框架,是為了解決企業(yè)應用程序開發(fā),功能如下:
功能:使用基本的JavaBean代替EJB,并提供了更多的企業(yè)應用功能
范圍:任何Java應用 Spring是一個輕量級的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架。
1、輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小只有1MB多的JAR文件里發(fā)布。并且Spring所需的處理開銷也是微不足道的。此外, Spring是非侵入式的:典型地,Spring應用中的對象不依賴于Spring的特定類。
2、控制反轉(zhuǎn)——Spring通過一種稱作控制反轉(zhuǎn)(IoC)的技術(shù)促進了松耦合。當應用了IoC,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己創(chuàng)建或者查找依賴對象。你可以認為IoC與JNDI相反——不是對象從容器 中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。
3、面向切面——Spring提供了面向切面編程的豐富支持,允許通過分離應用的業(yè)務邏輯與系統(tǒng)級服務(例如審計(auditing)和事務(transaction)管理)進行內(nèi)聚性的開發(fā)。應用對象只實現(xiàn)它們應該做的——完成業(yè)務邏輯—— 僅此而已。它們并不負責(甚至是意識)其它的系統(tǒng)級關(guān)注點,例如日志或事務支持。
4、容器——Spring包含并管理應用對象的配置和生命周期,在這個意義上它是一種容器,品牌網(wǎng)站建設(shè),你可以配置你的每個bean如何被創(chuàng)建——基于一個可配置原型(prototype),你的bean可以創(chuàng)建一個單獨的實例或者每次需要時都生成一個新的實例 ——以及它們是如何相互關(guān)聯(lián)的。然而,Spring不應該被混同于傳統(tǒng)的重量級的EJB容器,它們經(jīng)常是龐大與笨重的, 難以使用。
5、框架——Spring可以將簡單的組件配置、組合成為復雜的應用。在Spring中,應用對象被聲明式地組合,典型地是在 一個XML文件里。Spring也提供了很多基礎(chǔ)功能(事務管理、持久化框架集成等等),將應用邏輯的開發(fā)留給了你。所有Spring的這些特征使你能夠編寫更干凈、更可管理、并且更易于測試的代碼。它們也為Spring中的各種模塊提供了基礎(chǔ)支持。Spring的兩大核心AOP與IOC,可以單獨用于任何應用,包括與Struts等MVC框架與Hibernate等ORM框架的集成,目前很多公司所謂的輕量級開發(fā)就是用Spring + Struts(2)+Hibernate。
Spring MVC就是一個MVC框架,個人覺得Spring MVC annotation式的開發(fā)比Struts2方便,可以直接代替上面的Struts(當然Struts的做為一個非常成熟的MVC,功能上感覺還是比Spring強一點,不過Spring MVC已經(jīng)足夠用了)。當然spring mvc的執(zhí)行效率比struts高,是因為struts的值棧影響效率。
spring mvc類似于struts的一個MVC開框架,其實都是屬于spring,spring mvc需要有spring的架包作為支撐才能跑起來。
二、Spring與Struts2的區(qū)別:
Struts2就是一個攔截器棧 也就是一系列的攔截器。處理用戶的請求,OGNL的使用,表單驗證 等都是默認的攔截器在起作用。
spring的攔截器,主要體現(xiàn)在AOP的事務管理方面,還有比如一些錯誤或者異常的日志的顯示也是通過配置spring的log攔截器來實現(xiàn)的。
三、StringMVC與Struts2的區(qū)別:
1、Struts2是類級別的攔截, 一個類對應一個request上下文,SpringMVC是方法級別的攔截, 一個方法對應一個request上下文,而方法同時又跟一個url對應,所以說從架構(gòu)本身上SpringMVC就容易實現(xiàn) restful url,而struts2的架構(gòu)實現(xiàn)起來要費勁,因為Struts2中Action的一個方法可以對應一個url, 而其類屬性卻被所有方法共享,這也就無法用注解或其他方式標識其所屬方法了。
2、SpringMVC的方法之間基本上獨立的,獨享request response數(shù)據(jù),請求數(shù)據(jù)通過參數(shù)獲取, 處理結(jié)果通過ModelMap交回給框架,方法之間不共享變量,而Struts2搞的就比較亂,雖然方法之間也是獨立的, 但其所有Action變量是共享的,這不會影響程序運行,卻給我們編碼 讀程序時帶來麻煩, 每次來了請求就創(chuàng)建一個Action,一個Action對象對應一個request上下文。
3、Struts2需要針對每個request進行封裝,把request,session等servlet生命周期的變量封裝成一個一個Map, 供給每個Action使用,并保證線程安全,所以在原則上,是比較耗費內(nèi)存的。
4、攔截器實現(xiàn)機制上,Struts2有以自己的interceptor機制,SpringMVC用的是獨立的AOP方式, 這樣導致Struts2的配置文件量還是比SpringMVC大。
5、SpringMVC的入口是servlet,而Struts2是filter(這里要指出,filter和servlet是不同的。 以前認為filter是servlet的一種特殊),這就導致了二者的機制不同,這里就牽涉到servlet和filter的區(qū)別了。
6、SpringMVC集成了Ajax,使用非常方便,只需一個注解@ResponseBody就可以實現(xiàn),然后直接返回響應文本即可, 而Struts2攔截器集成了Ajax,在Action中處理時一般必須安裝插件或者自己寫代碼集成進去, 使用起來也相對不方便。
7、SpringMVC驗證支持JSR303,處理起來相對更加靈活方便,而Struts2驗證比較繁瑣,感覺太煩亂。
8、SpringMVC和Spring是無縫的。從這個項目的管理和安全上也比Struts2高( 當然Struts2也可以通過不同的目錄結(jié)構(gòu)和相關(guān)配置做到SpringMVC一樣的效果,但是需要xml配置的地方不少)。
9、設(shè)計思想上,Struts2更加符合OOP的編程思想, SpringMVC就比較謹慎,在servlet上擴展。
10、SpringMVC開發(fā)效率和性能高于Struts2。
11、SpringMVC可以認為已經(jīng)100%零配置
1、從安全性角度分析spring mvc和struts2的區(qū)別:
spring mvc:controller
1.spring mvc 默認controller是單實例(通過注解@Scope(“prototype”)變了多實例);
2.單實例時非線程安全,不要在controller中定義成員變量(實例變量);
3.單實例時,web容器啟動時便開始實例化controller,全局唯此實例,每次訪問都使用此實例響應;
4.多實例時,每一次訪問,基本&多數(shù)(發(fā)現(xiàn)偶爾也會重復使用實例)會產(chǎn)出新實例對應響應;
5.單實例時,并發(fā)請求,訪問synchronized同步方法時,彼此阻塞影響(synchronized方法實例鎖);
6.多實例時,并發(fā)請求,訪問synchronized同步方法時,彼此不影響(synchronized方法實例鎖);
struts2:action
1.struts2為每個線程提供一個action實例,多線程訪問時不會出現(xiàn)問題。當使用spring管理struts2的action實例對象時,scope必須配置為prototype或者session;若配置為singleton則多線程訪問時會出現(xiàn)問題,例如actionMessage,fieldError等信息會累加,多用戶訪問時有的用戶訪問到的是另一個用戶的數(shù)據(jù)。
2.scope=“prototype”是為每個請求提供一個action實例(與struts2的機制是一樣的)。
scope=“session”是為每個會話提供一個action實例。
3.通常使用prototype,即讓spring容器為每個請求提供一個action實例,好處是服務器端不用維護用戶狀態(tài)信息,否則使用session服務器端必須存儲狀態(tài)信息,用戶多時占用服務器端內(nèi)存過多。使用prototype時,必須自己在客戶端維護用戶的狀態(tài),每次訪問服務端時將相應狀態(tài)信息提交給服務器。
例如scope=“prototype”時,頁面一般< input name="id" type="hidden" value="${id}"/>用來存儲用戶的id信息,訪問action時提交到server端供action中函數(shù)使用。而使用scope=“session”時,頁面不必使用hidden的對象隱藏id信息,只要服務端獲取過用戶的id,action中的id屬性即會保存這個信息。
1、springmvc基于方法開發(fā)的,struts2基于類開發(fā)的。
springmvc將url和controller方法映射。映射成功后springmvc生成一個Handler對象,對象中只包括了一個method。方法執(zhí)行結(jié)束,形參數(shù)據(jù)銷毀。
struts2的action類中的所有方法用的都是action類中的成員變量,一旦方法變得很多的時候,我們就會不知道action類中那么多成員變量是給那個方法去使用的。十分混亂。
但是springmvc的所有參數(shù)都是定義為方法的形參,這樣使用什么方法就將參數(shù)注入至對應方法的形參,所以springmvc的controller開發(fā)類似service開發(fā)。
2、springmvc可以進行單例開發(fā),并且建議使用單例開發(fā),struts2通過類的成員變量接收參數(shù),無法使用單例,只能使用多例。
3、經(jīng)過實際測試,struts2速度慢,在于使用struts標簽,如果使用struts建議使用jstl。
最后我們無法實際定義springmvc與struts到底誰好誰壞,只能說struts早期由于用的比較多,它的漏洞就比較多。建議如果使用struts,就使用最新的包,因為以前的可能會有漏洞。但springmv目前幾乎沒有漏洞,這就是springmvc最近幾年開始流行起來的原因,再有一個springmvc是基于方法開發(fā)的,更接近于service開發(fā)。
springmvc總結(jié)
springmvc框架:
DispatcherServlet前端控制器:接收request,進行response
HandlerMapping處理器映射器:根據(jù)url查找Handler。(可以通過xml配置方式,注解方式)
HandlerAdapter處理器適配器:根據(jù)特定規(guī)則去執(zhí)行Handler,編寫Handler時需要按照HandlerAdapter的要求去編寫。
Handler處理器(后端控制器):需要程序員去編寫,常用注解開發(fā)方式。
Handler處理器執(zhí)行后結(jié)果 是ModelAndView,具體開發(fā)時Handler返回方法值類型包括 :ModelAndView、String(邏輯視圖名)、void(通過在Handler形參中添加request和response,類似原始 servlet開發(fā)方式,注意:可以通過指定response響應的結(jié)果類型實現(xiàn)json數(shù)據(jù)輸出)
View resolver視圖解析器:根據(jù)邏輯視圖名生成真正的視圖(在springmvc中使用View對象表示)
View視圖:jsp頁面,僅是數(shù)據(jù)展示,沒有業(yè)務邏輯。
springmvc和struts2區(qū)別:
springmvc面向方法開發(fā)的(更接近service接口的開發(fā)方式),struts2面向類開發(fā)。
springmvc可以單例開發(fā),struts2只能是多例開發(fā)。
廣州天河區(qū)珠江新城富力盈力大廈北塔2706
020-38013166(網(wǎng)站咨詢專線)
400-001-5281 (售后服務熱線)
深圳市坂田十二橡樹莊園F1-7棟
Site/ http://www.szciya.com
E-mail/ itciya@vip.163.com
品牌服務專線:400-001-5281
長沙市天心區(qū)芙蓉中路三段398號新時空大廈5樓
聯(lián)系電話/ (+86 0731)88282200
品牌服務專線/ 400-966-8830
旗下運營網(wǎng)站:
Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號