Note15:SSh三大框架工作原理介紹 [轉(zhuǎn)載]

原文來自:http://blog.csdn.net/z742182637/article/details/50394189


Struts1工作原理

Struts1工作原理圖

1、初始化:struts框架的總控制器ActionServlet是一個Servlet,它在web.xml中配置成自動啟動的Servlet,在啟動時總控制器會讀取配置文件(struts-config.xml)的配置信息,為struts中不同的模塊初始化相應的對象。(面向?qū)ο笏枷?

2、發(fā)送請求:用戶提交表單或通過URL向WEB服務器提交請求,請求的數(shù)據(jù)用HTTP協(xié)議傳給web服務器。

3、form填充:struts的總控制器ActionServlet在用戶提交請求時將數(shù)據(jù)放到對應的form對象中的成員變量中。

4、派發(fā)請求:控制器根據(jù)配置信息對象ActionConfig將請求派發(fā)到具體的Action,對應的formBean一并傳給這個Action中的excute()方法。

5、處理業(yè)務:Action一般只包含一個excute()方法,它負責執(zhí)行相應的業(yè)務邏輯(調(diào)用其它的業(yè)務模塊)完畢后返回一個ActionForward對象。服務器通過ActionForward對象進行轉(zhuǎn)發(fā)工作。

6、返回響應:Action將業(yè)務處理的不同結果返回一個目標響應對象給總控制器。

7、查找響應:總控制器根據(jù)Action處理業(yè)務返回的目標響應對象,找到對應的資源對象,一般情況下為jsp頁面。

8、響應用戶:目標響應對象將結果傳遞給資源對象,將結果展現(xiàn)給用戶。

Struts1優(yōu)缺點(為什么要用strust1)

1.優(yōu)點:

①開源的框架,結構清晰

②是MVC的經(jīng)典實現(xiàn)(MVC是一種思想,而不是一種技術)

③處理異常機制,實現(xiàn)國際化

④具有強大的標簽庫

⑤解決了JSP頁面存在大量的JAVA代碼,維護起來方便

⑥在formBean中會自動提交,不會去使用傳統(tǒng)的get、set方法得到值、取值

2.缺點:

①配置復雜

②測試不方便

③依賴web容器

④action是一個單例模式,必須設置為線程安全


Struts2工作原理

struts2工作原理圖


1客戶端初始化一個指向Servlet容器(例如Tomcat)的請求

2這個請求經(jīng)過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對于Struts2和其他框架的集成很有幫助,例如:SiteMesh?Plugin)

3接著FilterDispatcher被調(diào)用,F(xiàn)ilterDispatcher詢問ActionMapper來決定這個請是否需要調(diào)用某個Action

4如果ActionMapper決定需要調(diào)用某個Action,F(xiàn)ilterDispatcher把請求的處理交給ActionProxy

5?ActionProxy通過Configuration?Manager詢問框架的配置文件,找到需要調(diào)用的Action類

6?ActionProxy創(chuàng)建一個ActionInvocation的實例。

7?ActionInvocation實例使用命名模式來調(diào)用,在調(diào)用Action的過程前后,涉及到相關攔截器(Intercepter)的調(diào)用。

8一旦Action執(zhí)行完畢,ActionInvocation負責根據(jù)struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可?能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2框架中繼承的標簽。在這個過程中需要涉及到ActionMapper

在上述過程中所有的對象(Action,Results,Interceptors,等)都是通過ObjectFactory來創(chuàng)建的

Struts2優(yōu)缺點(即為什么要用struts2)

Struts2就會自動的進行驗證。還有很多,比如國際化資源文件等。

Struts2的開發(fā)中來,如果你重來沒有用過任何框架,你也可以通過快速的學習,加入到Struts2的應用開發(fā)中來,因為它足夠的簡單。

大量的攔截器:

Struts2本身提供了大量的可重用的攔截器,比如類型轉(zhuǎn)換攔截器,很多時候我們從頁面取得參數(shù),這個時候它是String類型的,我們需要手動。

?基于插件的框架:

Struts2是一個基于插件的框架,社區(qū)中提供了很多實用的插件,比如jfreechat/json等等,使用這些插件可以簡化我們的開發(fā),加快開發(fā)進度。

struts2最大的缺點莫過于在好多web服務器上支持不好,例如在websphere5.5,weblogic8.1及以前版本支持非常查,需要用最新的。

多種視圖的支持:

多種視圖的支持:jsp,freemarker,Veloctiy,只要你愿意,你甚至可以通過輕松的改造讓它支持pdf,同一個項目中你可以支持多種視圖。

更加的模塊化:

與Struts1.X相比,Struts2更加的模塊化,可以輕松將配置信息按功能界限拆分成多個文件,便于管理和團隊協(xié)作開發(fā)。

與Spring的集成:

與Struts1.x相比,Struts2不必再自己編寫singleton,進一步的降低了程序間的耦合性,就Struts2內(nèi)部本身而言,降低了框架本身的偶合性。

基于pojo易于測試:

在Struts1.x中我需要Mock出這兩個Http對象,使我們很難編寫Action的單元測試,與Struts1.x相比,Struts2的Action不再依賴于HttpServletRequest和HttpServletResponse對象,使我們能夠更方便的針對Action編寫單元測試。


Hibernate工作原理

1.讀取并解析配置文件

2.讀取并解析映射信息,創(chuàng)建SessionFactory

3.打開Sesssion

4.創(chuàng)建事務Transation

5.持久化操作

6.提交事務

7.關閉Session

8.關閉SesstionFactory

Hibernate優(yōu)缺點

優(yōu)點:

1:hibernate是基于ORMapping技術的開源的框架,對JDBC進行了輕量級的封裝,使用面向?qū)ο蟮乃季S來操縱數(shù)據(jù)庫。

2:hibernate提供了session緩存和二級緩存,對于不需要進行復雜查詢的系統(tǒng),性能有提升。

3:低侵入式設計

缺點:

1:hibernate學習成本太高。

2:不適合有復雜的sql查詢(統(tǒng)計)?。

3:不適合大量的聚集操作,(存儲過程)

優(yōu)缺點補充:

1、不需要編寫的SQL語句(不需要編輯JDBC),只需要操作相應的對象就可以了,就可以能夠存儲、更新、刪除、加載對象,可以提高生產(chǎn)效;

2、因為使用Hibernate只需要操作對象就可以了,所以我們的開發(fā)更對象化了;

3、使用Hibernate,移植性好(只要使用Hibernate標準開發(fā),更換數(shù)據(jù)庫時,只需要配置相應的配置文件就可以了,不需要做其它任務的操作);

4、Hibernate實現(xiàn)了透明持久化:當保存一個對象時,這個對象不需要繼承Hibernate中的任何類、實現(xiàn)任何接口,只是個純粹的單純對象—稱為POJO對象(最純粹的對象—這個對象沒有繼承第三方框架的任何類和實現(xiàn)它的任何接口)

5、Hibernate是一個沒有侵入性的框架,沒有侵入性的框架我們一般稱為輕量級框架

6、Hibernate代碼測試方便。

Spring工作原理

內(nèi)部最核心的就是IOC了,

動態(tài)注入,讓一個對象的創(chuàng)建不用new了,可以自動的生產(chǎn),這其實就是利用Java里的反射,反射其實就是在運行時動態(tài)的去創(chuàng)建、調(diào)用對象,spring就是在運行時,跟xml?Spring

的配置文件來動態(tài)的創(chuàng)建對象,和調(diào)用對象里的方法的?。

Spring還有一個核心就是AOP這個就是面向切面編程,可以為某一類對象?進行監(jiān)督和控制(也就是在調(diào)用這類對象的具體方法的前后去調(diào)用你指定的?模塊)從而達到對一個

模塊擴充的功能。這些都是通過?配置類達到的。

Spring目的:就是讓對象與對象(模塊與模塊)之間的關系沒有通過代碼來關聯(lián),都是通過配置類說明管理的(Spring根據(jù)這些配置?內(nèi)部通過反射去動態(tài)的組裝對象)

要記?。篠pring是一個容器,凡是在容器里的對象才會有Spring所提供的這些服務和功能。

Spring里用的最經(jīng)典的一個設計模式就是:模板方法模式。(這里我都不介紹了,是一個很常用的設計模式)

Spring里的配置是很多的,很難都記住,但是Spring里的精華也無非就是以上的兩點,把以上兩點跟理解了?也就基本上掌握了Spring.

Spring?AOP與IOC

一、IoC(Inversion?of?control):控制反轉(zhuǎn)

1、IoC:

概念:控制權由對象本身轉(zhuǎn)向容器;由容器根據(jù)配置文件去創(chuàng)建實例并創(chuàng)建各個實例之間的依賴關系

核心:bean工廠;在Spring中,bean工廠創(chuàng)建的各個實例稱作bean

二、AOP(Aspect-Oriented?Programming):面向方面編程

1、?代理的兩種方式:

靜態(tài)代理:

針對每個具體類分別編寫代理類

針對一個接口編寫一個代理類

動態(tài)代理:

針對一個方面編寫一個InvocationHandler,然后借用JDK反射包中的Proxy類為各種接口動態(tài)生成相應的代理類

Spring優(yōu)缺點

它是一個開源的項目,而且目前非?;钴S;它基于IoC(Inversion?of?Control,反向控制)和AOP的構架多層j2ee系統(tǒng)的框架,但它不強迫你必須在每一層?中必須使用Spring,因為它模塊化的很好,允許你根據(jù)自己的需要選擇使用它的某一個模塊;它實現(xiàn)了很優(yōu)雅的MVC,對不同的數(shù)據(jù)訪問技術提供了統(tǒng)一的?接口,采用IoC使得可以很容易的實現(xiàn)bean的裝配,提供了簡潔的AOP并據(jù)此實現(xiàn)Transcation?Managment,等等

優(yōu)點

Spring能有效地組織你的中間層對象,不管你是否選擇使用了EJB。如果你僅僅使用了Struts或其他為J2EE的API特制的framework,Spring致力于解決剩下的問題。

Spring能消除在許多工程中常見的對Singleton的過多使用。根據(jù)我的經(jīng)驗,這是一個很大的問題,它降低了系統(tǒng)的可測試性和面向?qū)ο蟮某潭取?/p>

通過一種在不同應用程序和項目間一致的方法來處理配置文件,Spring能消除各種各樣自定義格式的屬性文件的需要。曾經(jīng)對某個類要尋找的是哪個魔法般的屬性項或系統(tǒng)屬

性感到不解,為此不得不去讀Javadoc甚至源編碼?有了Spring,你僅僅需要看看類的JavaBean屬性。Inversion?of?Control的使用(在下面討論)幫助完成了這種簡化。

通過把對接口編程而不是對類編程的代價幾乎減少到?jīng)]有,Spring能夠促進養(yǎng)成好的編程習慣。

Spring被設計為讓使用它創(chuàng)建的應用盡可能少的依賴于他的APIs。在Spring應用中的大多數(shù)業(yè)務對象沒有依賴于Spring。

使用Spring構建的應用程序易于單元測試。

Spring能使EJB的使用成為一個實現(xiàn)選擇,而不是應用架構的必然選擇。你能選擇用POJOs或local?EJBs來實現(xiàn)業(yè)務接口,卻不會影響調(diào)用代碼。

Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適用于許多web應用。例如,Spring能使用AOP提供聲明性事務管理而不通過EJB容器,如果你僅僅需要與單個數(shù)據(jù)庫打交道,甚至不需要一個JTA實現(xiàn)。

Spring為數(shù)據(jù)存取提供了一個一致的框架,不論是使用的是JDBC還是O/R?mapping產(chǎn)品(如Hibernate)。

Spring確實使你能通過最簡單可行的解決辦法來解決你的問題。而這是有有很大價值的。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容