Struts1工作原理
Struts1工作原理圖
1、初始化:struts框架的總控制器ActionServlet是一個(gè)Servlet,它在web.xml中配置成自動(dòng)啟動(dòng)的Servlet,在啟動(dòng)時(shí)總控制器會(huì)讀取配置文件(struts-config.xml)的配置信息,為struts中不同的模塊初始化相應(yīng)的對(duì)象。(面向?qū)ο笏枷?
?
2、發(fā)送請(qǐng)求:用戶提交表單或通過(guò)URL向WEB服務(wù)器提交請(qǐng)求,請(qǐng)求的數(shù)據(jù)用HTTP協(xié)議傳給web服務(wù)器。
?
3、form填充:struts的總控制器ActionServlet在用戶提交請(qǐng)求時(shí)將數(shù)據(jù)放到對(duì)應(yīng)的form對(duì)象中的成員變量中。
?
4、派發(fā)請(qǐng)求:控制器根據(jù)配置信息對(duì)象ActionConfig將請(qǐng)求派發(fā)到具體的Action,對(duì)應(yīng)的formBean一并傳給這個(gè)Action中的excute()方法。
?
5、處理業(yè)務(wù):Action一般只包含一個(gè)excute()方法,它負(fù)責(zé)執(zhí)行相應(yīng)的業(yè)務(wù)邏輯(調(diào)用其它的業(yè)務(wù)模塊)完畢后返回一個(gè)ActionForward對(duì)象。服務(wù)器通過(guò)ActionForward對(duì)象進(jìn)行轉(zhuǎn)發(fā)工作。
?
6、返回響應(yīng):Action將業(yè)務(wù)處理的不同結(jié)果返回一個(gè)目標(biāo)響應(yīng)對(duì)象給總控制器。
?
7、查找響應(yīng):總控制器根據(jù)Action處理業(yè)務(wù)返回的目標(biāo)響應(yīng)對(duì)象,找到對(duì)應(yīng)的資源對(duì)象,一般情況下為jsp頁(yè)面。
?
8、響應(yīng)用戶:目標(biāo)響應(yīng)對(duì)象將結(jié)果傳遞給資源對(duì)象,將結(jié)果展現(xiàn)給用戶。
Struts1優(yōu)缺點(diǎn)(為什么要用strust1)
1.優(yōu)點(diǎn):
? ①開(kāi)源的框架,結(jié)構(gòu)清晰
? ②是MVC的經(jīng)典實(shí)現(xiàn)(MVC是一種思想,而不是一種技術(shù))
? ③處理異常機(jī)制,實(shí)現(xiàn)國(guó)際化
? ④具有強(qiáng)大的標(biāo)簽庫(kù)
? ⑤解決了JSP頁(yè)面存在大量的JAVA代碼,維護(hù)起來(lái)方便
? ⑥在formBean中會(huì)自動(dòng)提交,不會(huì)去使用傳統(tǒng)的get、set方法得到值、取值
2.缺點(diǎn):
? ①配置復(fù)雜
? ②測(cè)試不方便
? ③依賴web容器
? ④action是一個(gè)單例模式,必須設(shè)置為線程安全
Struts2工作原理
1 客戶端初始化一個(gè)指向Servlet容器(例如Tomcat)的請(qǐng)求
2 這個(gè)請(qǐng)求經(jīng)過(guò)一系列的過(guò)濾器(Filter)(這些過(guò)濾器中有一個(gè)叫做ActionContextCleanUp的可選過(guò)濾器,這個(gè)過(guò)濾器對(duì)于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin)
3 接著FilterDispatcher被調(diào)用,FilterDispatcher詢問(wèn)ActionMapper來(lái)決定這個(gè)請(qǐng)是否需要調(diào)用某個(gè)Action
4 如果ActionMapper決定需要調(diào)用某個(gè)Action,FilterDispatcher把請(qǐng)求的處理交給ActionProxy
5 ActionProxy通過(guò)Configuration Manager詢問(wèn)框架的配置文件,找到需要調(diào)用的Action類
6 ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例。
7 ActionInvocation實(shí)例使用命名模式來(lái)調(diào)用,在調(diào)用Action的過(guò)程前后,涉及到相關(guān)攔截器(Intercepter)的調(diào)用。
8 一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果。返回結(jié)果通常是(但不總是,也可 能是另外的一個(gè)Action鏈)一個(gè)需要被表示的JSP或者FreeMarker的模版。在表示的過(guò)程中可以使用Struts2 框架中繼承的標(biāo)簽。在這個(gè)過(guò)程中需要涉及到ActionMapper
在上述過(guò)程中所有的對(duì)象(Action,Results,Interceptors,等)都是通過(guò)ObjectFactory來(lái)創(chuàng)建的
Struts2優(yōu)缺點(diǎn)(即為什么要用struts2)
Struts2就會(huì)自動(dòng)的進(jìn)行驗(yàn)證。還有很多,比如國(guó)際化資源文件等。
Struts2的開(kāi)發(fā)中來(lái),如果你重來(lái)沒(méi)有用過(guò)任何框架,你也可以通過(guò)快速的學(xué)習(xí),加入到Struts2的應(yīng)用開(kāi)發(fā)中來(lái),因?yàn)樗銐虻暮?jiǎn)單。
大量的攔截器:
Struts2本身提供了大量的可重用的攔截器,比如類型轉(zhuǎn)換攔截器,很多時(shí)候我們從頁(yè)面取得參數(shù),這個(gè)時(shí)候它是String類型的,我們需要手動(dòng)。
基于插件的框架:
Struts2是一個(gè)基于插件的框架,社區(qū)中提供了很多實(shí)用的插件,比如jfreechat/json等等,使用這些插件可以簡(jiǎn)化我們的開(kāi)發(fā),加快開(kāi)發(fā)進(jìn)度。
struts2最大的缺點(diǎn)莫過(guò)于在好多web服務(wù)器上支持不好,例如在websphere5.5,weblogic8.1及以前版本支持非常查,需要用最新的。
多種視圖的支持:
多種視圖的支持:jsp,freemarker,Veloctiy,只要你愿意,你甚至可以通過(guò)輕松的改造讓它支持pdf,同一個(gè)項(xiàng)目中你可以支持多種視圖。
更加的模塊化:
與Struts1.X 相比,Struts2更加的模塊化,可以輕松將配置信息按功能界限拆分成多個(gè)文件,便于管理和團(tuán)隊(duì)協(xié)作開(kāi)發(fā)。
與Spring的集成:
與Struts1.x相比,Struts2不必再自己編寫(xiě)singleton,進(jìn)一步的降低了程序間的耦合性,就Struts2內(nèi)部本身而言,降低了框架本身的偶合性。
基于pojo易于測(cè)試:
在Struts1.x中我需要Mock出這兩個(gè)Http對(duì)象,使我們很難編寫(xiě)Action的單元測(cè)試,與Struts1.x相比,Struts2的Action 不再依賴于HttpServletRequest和HttpServletResponse對(duì)象,使我們能夠更方便的針對(duì)Action編寫(xiě)單元測(cè)試。
?
Hibernate工作原理
1. 讀取并解析配置文件
2. 讀取并解析映射信息,創(chuàng)建SessionFactory
3. 打開(kāi)Sesssion
4. 創(chuàng)建事務(wù)Transation
5. 持久化操作
6. 提交事務(wù)
7. 關(guān)閉Session
8. 關(guān)閉SesstionFactory
Hibernate優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1: hibernate是基于ORMapping技術(shù)的開(kāi)源的框架,對(duì)JDBC進(jìn)行了輕量級(jí)的封裝,使用面向?qū)ο蟮乃季S來(lái)操縱數(shù)據(jù)庫(kù)。
2:hibernate提供了session緩存和二級(jí)緩存,對(duì)于不需要進(jìn)行復(fù)雜查詢的系統(tǒng),性能有提升。
3:低侵入式設(shè)計(jì)
缺點(diǎn):
1:hibernate學(xué)習(xí)成本太高。
2:不適合有復(fù)雜的sql查詢(統(tǒng)計(jì)) 。
3:不適合大量的聚集操作,(存儲(chǔ)過(guò)程)
優(yōu)缺點(diǎn)補(bǔ)充:
1、 不需要編寫(xiě)的SQL語(yǔ)句(不需要編輯JDBC),只需要操作相應(yīng)的對(duì)象就可以了,就可以能夠存儲(chǔ)、更新、刪除、加載對(duì)象,可以提高生產(chǎn)效;
2、因?yàn)槭褂肏ibernate只需要操作對(duì)象就可以了,所以我們的開(kāi)發(fā)更對(duì)象化了;
3、使用Hibernate,移植性好(只要使用Hibernate標(biāo)準(zhǔn)開(kāi)發(fā),更換數(shù)據(jù)庫(kù)時(shí),只需要配置相應(yīng)的配置文件就可以了,不需要做其它任務(wù)的操作);
4、Hibernate實(shí)現(xiàn)了透明持久化:當(dāng)保存一個(gè)對(duì)象時(shí),這個(gè)對(duì)象不需要繼承Hibernate中的任何類、實(shí)現(xiàn)任何接口,只是個(gè)純粹的單純對(duì)象—稱為POJO對(duì)象(最純粹的對(duì)象—這個(gè)對(duì)象沒(méi)有繼承第三方框架的任何類和實(shí)現(xiàn)它的任何接口)
5、Hibernate是一個(gè)沒(méi)有侵入性的框架,沒(méi)有侵入性的框架我們一般稱為輕量級(jí)框架
6、Hibernate代碼測(cè)試方便。
Spring工作原理
內(nèi)部最核心的就是IOC了,
動(dòng)態(tài)注入,讓一個(gè)對(duì)象的創(chuàng)建不用new了,可以自動(dòng)的生產(chǎn),這其實(shí)就是利用java里的反射,反射其實(shí)就是在運(yùn)行時(shí)動(dòng)態(tài)的去創(chuàng)建、調(diào)用對(duì)象,Spring就是在運(yùn)行時(shí),跟xml Spring的配置 文件來(lái)動(dòng)態(tài)的創(chuàng)建對(duì)象,和調(diào)用對(duì)象里的方法的 。
Spring還有一個(gè)核心就是AOP這個(gè)就是面向切面編程,可以為某一類對(duì)象 進(jìn)行監(jiān)督和控制(也就是 在調(diào)用這類對(duì)象的具體方法的前后去調(diào)用你指定的 模塊)從而達(dá)到對(duì)一個(gè)
模塊擴(kuò)充的功能。這些都是通過(guò) 配置類達(dá)到的。
Spring目的:就是讓對(duì)象與對(duì)象(模塊與模塊)之間的關(guān)系沒(méi)有通過(guò)代碼來(lái)關(guān)聯(lián),都是通過(guò)配置類說(shuō)明 管理的(Spring根據(jù)這些配置 內(nèi)部通過(guò)反射去動(dòng)態(tài)的組裝對(duì)象)
要記住:Spring是一個(gè)容器,凡是在容器里的對(duì)象才會(huì)有Spring所提供的這些服務(wù)和功能。
Spring里用的最經(jīng)典的一個(gè)設(shè)計(jì)模式就是:模板方法模式。(這里我都不介紹了,是一個(gè)很常用的設(shè)計(jì)模式)
Spring里的配置是很多的,很難都記住,但是Spring里的精華也無(wú)非就是以上的兩點(diǎn),把以上兩點(diǎn)跟理解了 也就基本上掌握了Spring.
Spring AOP與IOC
一、 IoC(Inversion of control): 控制反轉(zhuǎn)
1、IoC:
概念:控制權(quán)由對(duì)象本身轉(zhuǎn)向容器;由容器根據(jù)配置文件去創(chuàng)建實(shí)例并創(chuàng)建各個(gè)實(shí)例之間的依賴關(guān)系
核心:bean工廠;在Spring中,bean工廠創(chuàng)建的各個(gè)實(shí)例稱作bean
二、AOP(Aspect-Oriented Programming): 面向方面編程
1、 代理的兩種方式:
靜態(tài)代理:
??? 針對(duì)每個(gè)具體類分別編寫(xiě)代理類
??? 針對(duì)一個(gè)接口編寫(xiě)一個(gè)代理類
動(dòng)態(tài)代理:
針對(duì)一個(gè)方面編寫(xiě)一個(gè)InvocationHandler,然后借用JDK反射包中的Proxy類為各種接口動(dòng)態(tài)生成相應(yīng)的代理類
Spring 優(yōu)缺點(diǎn)
它是一個(gè)開(kāi)源的項(xiàng)目,而且目前非常活躍;它基于IoC(Inversion of Control,反向控制)和AOP的構(gòu)架多層j2ee系統(tǒng)的框架,但它不強(qiáng)迫你必須在每一層 中必須使用Spring,因?yàn)樗K化的很好,允許你根據(jù)自己的需要選擇使用它的某一個(gè)模塊;它實(shí)現(xiàn)了很優(yōu)雅的MVC,對(duì)不同的數(shù)據(jù)訪問(wèn)技術(shù)提供了統(tǒng)一的 接口,采用IoC使得可以很容易的實(shí)現(xiàn)bean的裝配,提供了簡(jiǎn)潔的AOP并據(jù)此實(shí)現(xiàn)Transcation Managment,等等
優(yōu)點(diǎn)
???? Spring能有效地組織你的中間層對(duì)象,不管你是否選擇使用了EJB。如果你僅僅使用了Struts或其他為J2EE的 API特制的framework,Spring致力于解決剩下的問(wèn)題。
??? Spring能消除在許多工程中常見(jiàn)的對(duì)Singleton的過(guò)多使用。根據(jù)我的經(jīng)驗(yàn),這是一個(gè)很大的問(wèn)題,它降低了系統(tǒng)的可測(cè)試性和面向?qū)ο蟮某潭取?br /> ??? 通過(guò)一種在不同應(yīng)用程序和項(xiàng)目間一致的方法來(lái)處理配置文件,Spring能消除各種各樣自定義格式的屬性文件的需要。曾經(jīng)對(duì)某個(gè)類要尋找的是哪個(gè)魔法般的屬性項(xiàng)或系統(tǒng)屬
??? 性感到不解,為此不得不去讀Javadoc甚至源編碼?有了Spring,你僅僅需要看看類的JavaBean屬性。Inversion of Control的使用(在下面討論)幫助完成了這種簡(jiǎn)化。
??? 通過(guò)把對(duì)接口編程而不是對(duì)類編程的代價(jià)幾乎減少到?jīng)]有,Spring能夠促進(jìn)養(yǎng)成好的編程習(xí)慣。
??? Spring被設(shè)計(jì)為讓使用它創(chuàng)建的應(yīng)用盡可能少的依賴于他的APIs。在Spring應(yīng)用中的大多數(shù)業(yè)務(wù)對(duì)象沒(méi)有依賴于Spring。
??? 使用Spring構(gòu)建的應(yīng)用程序易于單元測(cè)試。
??? Spring能使EJB的使用成為一個(gè)實(shí)現(xiàn)選擇,而不是應(yīng)用架構(gòu)的必然選擇。你能選擇用POJOs或local EJBs來(lái)實(shí)現(xiàn)業(yè)務(wù)接口,卻不會(huì)影響調(diào)用代碼。
??? Spring幫助你解決許多問(wèn)題而無(wú)需使用EJB。Spring能提供一種EJB的替換物,它們適用于許多web應(yīng)用。例如,Spring能使用AOP提供聲明性事務(wù)管理而不通過(guò)EJB容器,如果你僅僅需要與單個(gè)數(shù)據(jù)庫(kù)打交道,甚至不需要一個(gè)JTA實(shí)現(xiàn)。
??? Spring為數(shù)據(jù)存取提供了一個(gè)一致的框架,不論是使用的是JDBC還是O/R mapping產(chǎn)品(如Hibernate)。
Spring確實(shí)使你能通過(guò)最簡(jiǎn)單可行的解決辦法來(lái)解決你的問(wèn)題。而這是有有很大價(jià)值的。
--------------------- ?
作者:官小飛 ?
來(lái)源:CSDN ?
原文:https://blog.csdn.net/z742182637/article/details/50394189 ?
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!
總結(jié)
以上是生活随笔為你收集整理的Struts1工作原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一步步编写操作系统 24 编写内核加载器
- 下一篇: SharePoint Pages(1)之