Struts1工作原理圖:
1、初始化:struts框架的總控制器ActionServlet是一個Servlet,它在web.xml中配置成自動啓動的Servlet,在啓動時總控制器會讀取配置文件(struts-config.xml)的配置信息,爲struts中不同的模塊初始化相應的對象。(面向對象思想)
2、發送請求:用戶提交表單或通過URL向WEB服務器提交請求,請求的數據用HTTP協議傳給web服務器。
3、form填充:struts的總控制器ActionServlet在用戶提交請求時將數據放到對應的form對象中的成員變量中。
4、派發請求:控制器根據配置信息對象ActionConfig將請求派發到具體的Action,對應的formBean一併傳給這個Action中的excute()方法。
5、處理業務:Action一般只包含一個excute()方法,它負責執行相應的業務邏輯(調用其它的業務模塊)完畢後返回一個ActionForward對象。服務器通過ActionForward對象進行轉發工作。
6、返回響應:Action將業務處理的不同結果返回一個目標響應對象給總控制器。
7、查找響應:總控制器根據Action處理業務返回的目標響應對象,找到對應的資源對象,一般情況下爲jsp頁面。
8、響應用戶:目標響應對象將結果傳遞給資源對象,將結果展現給用戶。
ssh框架啓動流程
系統從職責上分爲四層:表示層、業務邏輯層、數據持久層和域模塊層。其中使用Struts作爲系統的整體基礎架構,負責MVC的分離,在Struts框架的模型部分,利用Hibernate框架對持久層提供支持,業務層用Spring支持。具體做法是:用面向對象的分析方法根據需求提出一些模型,將這些模型實現爲基本的Java對象,然後編寫基本的DAO接口,並給出Hibernate的DAO實現,採用 Hibernate架構實現的DAO類來實現Java類與數據庫之間的轉換和訪問,最後由Spring完成業務邏輯。
系統的基本業務流程是:在表示層中,首先通過JSP頁面實現交互界面,負責傳送請求(Request)和接收響應(Response),然後Struts根據配置文件(struts-config.xml)將ActionServlet接收到的Request委派給相應的Action處理。在業務層中,管理服務組件的 Spring IoC容器負責向Action提供業務模型(Model)組件和該組件的協作對象數據處理(DAO)組件完成業務邏輯,並提供事務處理、緩衝池等容器組件以提升系統性能和保證數據的完整性。而在持久層中,則依賴於Hibernate的對象化映射和數據庫交互,處理DAO組件請求的數據,並返回處理結果。
採用上述開發模型,不僅實現了視圖、控制器與模型的徹底分離,而且還實現了業務邏輯層與持久層的分離。這樣無論前端如何變化,模型層只需很少的改動,並且數據庫的變化也不會對前端有所影響,大大提高了系統的可複用性。而且由於不同層之間耦合度小,有利於團隊成員並行工作,大大提高了開發效率。
Struts1與struts2有什麼不同
1.Action類
Stuts1要求Action類繼承一個抽象基類。Struts1的一個普通問題是使用抽象類編程而不是接口。Struts2 Action類可以實現一個Action接口,也可以實現其它接口,使可選和定製的服務成爲可能。Struts2提供一個ActionSupport基類去實現常用的接口。Action 接口不是必須的,任何有execute標識的POJO對象都可以用作Struts2的Action對象。
2. 線程模式:Struts1 Action是單例模式並且必須是線程安全的,因爲僅有Action的一個實例來處理所有的請求。單例策略限制了Struts1 Action能作的事,並且要在開發時特別小心。Action資源必須是線程安全的或同步的。 Struts 2 Action對象爲每一個請求產生一個實例,因此沒有線程安全問題。
3.Servlet依賴:Struts1 Action依賴於Servlet API,因爲當一個Action被調用時,HttpServletResquest和HttpServletResponse被傳遞給execute方法,即Action依賴了容器,測試變得非常麻煩。Struts2 Action不依賴於容器,允許Action脫離容器單獨被測試。如果需要,Struts2 Action仍然可以訪問初始的request和response。但是,其它的元素減少或者消除了直接訪問HttpServletRequset和HttpServletResponse的必要性。 4.捕獲輸入:Struts1使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承一個基類。因爲其它JavaBean不能用作ActionForm,開發者經常創建多餘的類捕獲輸入。動態Bean可以作爲創建傳統ActionForm的選擇,但是,開發者可能是在重新描述已經存在的JavaBean,仍然會導致有冗餘的javabean。Struts2直接使用Action屬性作爲輸入屬性,消除了對第二輸入對象的需求。Action屬性能夠通過web頁面上的taglibs訪問。Struts2也支持ActionForm模式。(Struts2用普通的POJO來接收數據)
5.表達式語言:Struts1整合了JSTL,但對集合和索引屬性的支持很弱。Struts2可以是使用JSTL,但是也支持一個更加強大和靈活的表達式語言“Object Graph Notation Language”(OGNL).
6. 綁定值到頁面(view): Struts1使用標準JSP機制把對象綁定到頁面中來訪問,Struts1要傳遞值的時候必須往request裏放、往session裏放,然後再傳遞到jsp裏面,銅鼓el表達式得到。Struts2使用“ValueStack”技術,使taglib能夠訪問值而不需要把你的頁面和對象綁定起來。ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面。值棧技術非常著名。不需要request、不需要session,直接從Action中取值。
7.類型轉換: Struts1 ActionForm屬性通常都是String類型。Struts1使用Commons-Beanutils進行類型轉換。每個類一個轉換器,對每一個實例來說是不可配置的。Struts2 使用OGNL進行類型轉換。提供基本和常用對象的轉換器。
8.校驗:Struts1支持在ActionForm的validate方法中手動校驗,或者通過Commons Validator的擴展來校驗。同一個類可以有不同的校驗內容,但不能校驗子對象。Struts2支持通過validate方法和Xwork校驗框架來進行校驗。Xwork校驗框架使用爲屬性類類型定義的校驗和內容校驗,來支持chain校驗子屬性。
9.Action執行的控制:Struts1支持每一個模塊有單獨的RequestProcessors(生命週期),但是模塊中的所有Action必須共享相同的生命週期。(服務器重啓時,Action生命週期結束,即生命週期無法控制)。Struts2支持通過攔截器堆棧(Interceptor Stacks)爲每一個Action創建不同的生命週期。堆棧能夠根據需要和不同的Action一起使用。(可以控制Action的生命週期)
簡單的說:
struts1 和struts2的核心原理不同:
struts1.X是基於servlet的
struts2是xwork的變體:他的核心是filter
struts1是單例模式開發,
struts2是多例模式。
struts1的單例模式好處是節省內存,缺點是併發性查,非同步。
struts2好處是線程安全是同步的每次使用開闢新的內存空間,缺點是佔用資源多。
Model1的原理:
Struts1的工作原理:
圖2
它引入了”控制器”這個概念,控制器一般由servlet來擔任,客戶端的請求不再直接送給一個處理業務邏輯的JSP頁面,而是送給這個控制器,再由控制器根據具體的請求調用不同的事務邏輯,並將處理結果返回到合適的頁面。因此,這個servlet控制器爲應用程序提供了一個進行前-後端處理的中樞。一方面爲輸入數據的驗證、身份認證、日誌及實現國際化編程提供了一個合適的切入點;另一方面也提供了將業務邏輯從JSP文件剝離的可能。業務邏輯從JSP頁面分離後,JSP文件蛻變成一個單純完成顯示任務的東西,這就是常說的View。而獨立出來的事務邏輯變成人們常說的Model,再加上控制器Control本身,就構成了MVC模式。實踐證明,MVC模式爲大型程序的開發及維護提供了巨大的便利。
其實,MVC開始並不是爲Web應用程序提出的模式,傳統的MVC要求M將其狀態變化通報給V,但由於Web瀏覽器工作在典型的拉模式而非推模式,很難做到這一點。因此有些人又將用於Web應用的MVC稱之爲MVC2。正如上面所提到的MVC是一種模式,當然可以有各種不同的具體實現,包括您自己就可以實現一個體現MVC思想的程序框架,Struts就是一種具體實現MVC2的程序框架。它的大致結構如圖三所示:
圖三
圖三基本勾勒出了一個基於Struts的應用程序的結構,從左到右,分別是其表示層(view)、控制層(controller)、和模型層(Model)。其表示層使用Struts標籤庫構建。來自客戶的所有需要通過框架的請求統一由叫ActionServlet的servlet接收(ActionServlet Struts已經爲我們寫好了,只要您應用沒有什麼特別的要求,它基本上都能滿足您的要求),根據接收的請求參數和Struts配置(struts-config.xml)中ActionMapping,將請求送給合適的Action去處理,解決由誰做的問題,它們共同構成Struts的控制器。Action則是Struts應用中真正幹活的組件,開發人員一般都要在這裏耗費大量的時間,它解決的是做什麼的問題,它通過調用需要的業務組件(模型)來完成應用的業務,業務組件解決的是如何做的問題,並將執行的結果返回一個代表所需的描繪響應的JSP(或Action)的ActionForward對象給ActionServlet以將響應呈現給客戶。
過程如圖四所示:
圖四
這裏要特別說明一下的是:就是Action這個類,上面已經說到了它是Struts中真正幹活的地方,也是值得我們高度關注的地方。可是,關於它到底是屬於控制層還是屬於模型層,存在兩種不同的意見,一種認爲它屬於模型層,如:《JSP Web編程指南》;另一些則認爲它屬於控制層如:《ProgrammingJakarta Struts》、《Mastering Jakarta Struts》和《Struts Kick Start》等認爲它是控制器的一部分,還有其他一些書如《Strutsin Action》也建議要避免將業務邏輯放在Action類中,也就是說,圖3中Action後的括號中的內容應該從中移出,但實際中確有一些系統將比較簡單的且不打算重用的業務邏輯放在Action中,所以在圖中還是這樣表示。顯然,將業務對象從Action分離出來後有利於它的重用,同時也增強了應用程序的健壯性和設計的靈活性。因此,它實際上可以看作是Controller與Model的適配器,如果硬要把它歸於那一部分,筆者更傾向於後一種看法,即它是Controller的一部分,換句話說,它不應該包含過多的業務邏輯,而應該只是簡單地收集業務方法所需要的數據並傳遞給業務對象。實際上,它的主要職責是:
· 校驗前提條件或者聲明
· 調用需要的業務邏輯方法
· 檢測或處理其他錯誤
· 路由控制到相關視圖
上面這樣簡單的描述,初學者可能會感到有些難以接受,下面舉個比較具體的例子來進一步幫助我們理解。如:假設,我們做的是個電子商務程序,現在程序要完成的操作任務是提交定單並返回定單號給客戶,這就是關於做什麼的問題,應該由Action類完成,但具體怎麼獲得數據庫連接,插入定單數據到數據庫表中,又怎麼從數據庫表中取得這個定單號(一般是自增數據列的數據),這一系列複雜的問題,這都是解決怎麼做的問題,則應該由一個(假設名爲orderBo)業務對象即Model來完成。orderBo可能用一個返回整型值的名爲submitOrder的方法來做這件事,Action則是先校驗定單數據是否正確,以免常說的垃圾進垃圾出;如果正確則簡單地調用orderBo的submitOrder方法來得到定單號;它還要處理在調用過程中可能出現任何錯誤;最後根據不同的情況返回不同的結果給客戶。
二、爲什麼要使用Struts框架
既然本文的開始就說了,自己可以建這種框架,爲什麼要使用Struts呢?我想下面列舉的這些理由是顯而易見的:首先,它是建立在MVC這種公認的好的模式上的,Struts在M、V和C上都有涉及,但它主要是提供一個好的控制器和一套定製的標籤庫上,也就是說它的着力點在C和V上,因此,它天生就有MVC所帶來的一系列優點,如:結構層次分明,高可重用性,增加了程序的健壯性和可伸縮性,便於開發與設計分工,提供集中統一的權限控制、校驗、國際化、日誌等等;其次,它是個開源項目得到了包括它的發明者Craig R.McClanahan在內的一些程序大師和高手持續而細心的呵護,並且經受了實戰的檢驗,使其功能越來越強大,體系也日臻完善;最後,是它對其他技術和框架顯示出很好的融合性。如,現在,它已經與tiles融爲一體,可以展望,它很快就會與JSF等融會在一起。當然,和其他任何技術一樣,它也不是十全十美的,如:它對類和一些屬性、參數的命名顯得有些隨意,給使用帶來一些不便;還有如Action類execute方法的只能接收一個ActionForm參數等。但瑕不掩瑜,這些沒有影響它被廣泛使用
爲什麼使用Struts2 ?
新版本的Struts2.0是struts 的action架構和webwork的融合體.依照Struts2.0.1的發佈公告,一些關鍵特性如下 :
l 設計簡單: 使用抽象類而不是接口是Struts1的一個設計上的問題,這已經在Struts2中得到了解決.在Struts2中絕大多數類都是基於接口的,並且它的絕大多數核心接口都是獨立於HTTP的.Struts2的Action類是獨立於框架的,可視爲單純的POJO.框架的組件都設法保持鬆耦合
l 單純的Action : Action都是單純的POJO.任何含有execute()方法的java類都可以當作Action類來使用.甚至我們始終都不需要實現接口.反轉控制會在開發Action類的時候得到介紹過,這能讓Action中立於底層框架.
l 不再使用ActionForm : ActionForm特性不再在Structs2中出現.簡單的JavaBean即可對Action直接傳遞參數.不再需要全部使用String類型的參數.
l 簡單的測試 : Struts2的Action是獨立於HTTP並且中立於框架的.這使得Struts2的程序可以很容易的在沒有模擬對象的情況下測試.
l 巧妙的默認值 : 大多數配置元素都設有一個根據需要設定的默認值.甚至根據需要基於XML的默認配置文件都可以進行重寫.
l 改良的結果集 : 不像Struts1中的ActionForward,Struts2的結果集靈活的提供了多種類型的輸出,事實上這促進了響應的準備工作.
l 更好的標籤特性 : Struts2可以添加樣式表驅動標記,這使我們創建相同的頁面僅用更少的代碼.Struts2的標籤更有效而且是面向結果的.Struts2的標籤標記可以通過修改基礎樣式表來修改.個別的標籤標記可以通過編輯FreeMarker的模板來修改.JSP和FreeMarker都完全得到了支持.
l 引入註釋 : 在Struts2程序中,除了XML和Javaproperties 配置文件外,Java 5的註釋也可以作爲一種選擇.註釋使得XML的使用降至最低.
l 有狀態的Checkbox : Struts2中的checkbox不需要對false值進行特殊處理.
l 快速開始 : 很多改變無需重啓web容器即可實現.
l 自定義控制器 : Struts1可以自定義每一個模塊的請求處理器,如果需要,Struts2可以自定義每一個Action的請求處理.
l 易與Spring整合 : Struts2的Action與Spring是友好的,只需添加Spring的bean
l 輕巧的插件 : Struts2可以通過添加一個Jar文件來進行擴展,不再需要手動配置!
l 支持AJAX : AJAX主題對提升程序交互有着重要的意義.Struts2框架提供了一套標籤來AJAX化你的程序甚至DOJO.AJAX特性包括:
1. AJAX客戶端驗證.
2. 支持遠程表單提交.(同樣適用於submit標籤)
3. 先進的div模板提供動態重載部份HTML
4. 先進的模板提供遠程加載和計算Javascript的能力.
5. AJAX-only選項卡面板的實現
6. 豐富的發佈/訂閱事件模型
7. 自動交互完善標籤
一、 Struts概述
Struts是一個用來開發 Model2應用程序的框架。這個框架可以提高開發工作的速度,因爲它提供的下面這些功能解決了 Web應用程序開發過程中的一些常見問題:
對頁面導航活動進行管理; 對來自用戶的輸入數據進行合法性驗證; 統一的佈局; 可擴展性; 國際化和本地化; 支持 Ajax技術。因爲 Struts是一個 Model 2框架,所以在使用 Struts時還應該遵守以下幾條不成文的規定。
不要在 JSP頁面裏嵌入 Java代碼,應該把所有的業務邏輯包含在一些被稱爲“動作類”( action class)的 Java類裏。 在 JSP頁面裏使用 Expression Language( OGNL)去訪問有關的模型對象。 儘量避免編寫自定義標籤(因爲自定義標籤的代碼比較難以編寫)。二、升級到 Struts 2
你也許用過 Struts 1編程,這裏提供了一個關於 Struts2 新功能的簡要介紹。
在 Struts 1裏需要使用一個像 ActionServlet 類這樣的東西作爲 servlet控制器; Struct 2使用了一個過濾器來完成同樣的任務。 在 Struts 2裏沒有任何動作表單。在 Struts 1裏,每個 HTML表單都對應着一個 ActionForm 實例,你可以從動作類訪問這個動作表單,並用它來填充數據傳輸對象。在 Struts 2 裏, HTML表單將被直接映射爲一個 POJO,而不再需要你創建一個數據傳輸對象,因爲沒有動作表單,維護工作變得簡單容易了,你不再需要與那麼多的類打交道。 問題來了:沒有了動作表單,怎樣才能在 Struts 2裏通過編程對用戶輸入進行合法性驗證呢?答案是把驗證邏輯編寫在動作類裏。 Struts 1通過幾個標籤庫提供了一批定製標籤供程序員在 JSP頁面裏使用,其中最重要的是 HTML標籤庫、 Bean標籤庫和 Logic標籤庫。 Servlet 2.4裏的 JSTL和 EL( Expression Language ,表達式語言)經常被用來代替 Bean和 Logic標籤庫。 Struts 2爲程序員準備了一個應有盡有的標籤庫,你不再需要 JSTL,但在某些場合你可能仍需要 EL。 在 Struts 1裏,你還需要用到一些 Struts配置文件,其中最主要的是存放在各 Web應用程序裏的 WEB-INF子目錄裏的 struts-config.xml(默認文件名)。在 Struts 2裏,你仍需要用到多個配置文件,但必須把它們存放在 WEB-INF/classes子目錄或它的某個下級子目錄裏。 要想使用 Struts 2 ,你的系統裏必須有 Java 5 和 Servlet 2.4 (或更高版本)。之所以需要有 Java 5,是因爲 Java 5裏新增加的註解在 Struts 2裏扮演着重要角色。我們撰寫本書時, Java 6已經發布, Java 7也指日可待,你很可能已經在使用 Java 5或 Java 6了。 在 Struts 1 裏,動作類必須擴展自org.apache.struts.action.Action 類。在 Struts 2 裏,任何一個 POJO 都可以是一個動作類。不過,我們將在本書第 3 章說明,在 Struts 2 裏最好對 ActionSupport 類進行擴展。在此基礎上,可用一個動作類來完成相關的動作。 Struts 2在 JSP頁面裏使用 OGNL來顯示各種對象模型,而不再是 JSP EL和 JSTL。原本是 Struts 1組件之一的 Tiles現在已經發展爲一個獨立的 Apache
HTTP沒有“類型”的概念,在HTTP請求裏發送的值都是字符串。在把表單字段映射到非 String 類型的動作屬性時, Struts會自動對這些值進行必要的轉換。這一章將解釋 Struts如何完成這類轉換,你還將學到如何爲更加複雜的情
spring工作機制及爲什麼要用?
1.springmvc請所有的請求都提交給DispatcherServlet,它會委託應用系統的其他模塊負責對請求進行真正的處理工作。
2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.
3.DispatcherServlet請求提交到目標Controller
4.Controller進行業務邏輯處理後,會返回一個ModelAndView
5.Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象
6.視圖對象負責渲染返回給客戶端。
爲什麼用:
AOP 讓開發人員可以創建非行爲性的關注點,稱爲橫切關注點,並將它們插入到應用程序代碼中。使用 AOP後,公共服務(比如日誌、持久性、事務等)就可以分解成方面並應用到域對象上,同時不會增加域對象的對象模型的複雜性。
IOC 允許創建一個可以構造對象的應用環境,然後向這些對象傳遞它們的協作對象。正如單詞 倒置所表明的,IOC 就像反過來的JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straightconstruction),每一個對象都是用其協作對象構造的。因此是由容器管理協作對象(collaborator)。
Spring即使一個AOP框架,也是一IOC容器。 Spring 最好的地方是它有助於您替換對象。有了Spring,只要用JavaBean屬性和配置文件加入依賴性(協作對象)。然後可以很容易地在需要時替換具有類似接口的協作對象。
Spring 框架是一個分層架構,由 7 個定義良好的模塊組成。Spring模塊構建在覈心容器之上,核心容器定義了創建、配置和管理bean 的方式,如圖 1 所示。
組成 Spring 框架的每個模塊(或組件)都可以單獨存在,或者與其他一個或多個模塊聯合實現。每個模塊的功能如下:
核心容器:核心容器提供 Spring框架的基本功能。核心容器的主要組件是BeanFactory,它是工廠模式的實現。BeanFactory使用控制反轉(IOC)模式將應用程序的配置和依賴性規範與實際的應用程序代碼分開。
Spring 上下文:Spring 上下文是一個配置文件,向 Spring框架提供上下文信息。Spring上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調度功能。
Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了Spring框架中。所以,可以很容易地使 Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊爲基於Spring的應用程序中的對象提供了事務管理服務。通過使用 Spring AOP,不用依賴EJB組件,就可以將聲明性事務管理集成到應用程序中。
Spring DAO:JDBC DAO抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同數據庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,並且極大地降低了需要編寫的異常代碼數量(例如打開和關閉連接)。SpringDAO的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。
Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM的對象關係工具,其中包括JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務和DAO異常層次結構。
Spring Web 模塊:Web 上下文模塊建立在應用程序上下文模塊之上,爲基於Web的應用程序提供了上下文。所以,Spring 框架支持與 Jakarta Struts的集成。Web模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作。
Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程序的 MVC實現。通過策略接口,MVC框架變成爲高度可配置的,MVC 容納了大量視圖技術,其中包括JSP、Velocity、Tiles、iText 和 POI。
Spring 框架的功能可以用在任何 J2EE服務器中,大多數功能也適用於不受管理的環境。Spring的核心要點是:支持不綁定到特定 J2EE服務的可重用業務和數據訪問對象。毫無疑問,這樣的對象可以在不同 J2EE 環境 (Web或EJB)、獨立應用程序、測試環境之間重用。
共2頁: 1 [2]
內容導航
第 1 頁:Hibernate工作原理及用的理由(1) 第 2 頁:Hibernate工作原理及用的理由(2)
IOC 和 AOP
控制反轉模式(也稱作依賴性介入)的基本概念是:不創建對象,但是描述創建它們的方式。在代碼中不直接與對象和服務連接,但在配置文件中描述哪一個組件需要哪一項服務。容器(在Spring框架中是 IOC 容器) 負責將這些聯繫在一起。
在典型的 IOC 場景中,容器創建了所有對象,並設置必要的屬性將它們連接在一起,決定什麼時間調用方法。下表列出了IOC的一個實現模式。
Spring 框架的 IOC 容器採用類型 2 和類型3 實現。
面向方面的編程
即AOP,是一種編程技術,它允許程序員對橫切關注點或橫切典型的職責分界線的行爲(例如日誌和事務管理)進行模塊化。
AOP的核心構造是方面,它將那些影響多個類的行爲封裝到可重用的模塊中。
AOP 和IOC是補充性的技術,它們都運用模塊化方式解決企業應用程序開發中的複雜問題。在典型的面向對象開發方式中,可能要將日誌記錄語句放在所有方法和Java類中才能實現日誌功能。在 AOP方式中,可以反過來將日誌服務模塊化,並以聲明的方式將它們應用到需要日誌的組件上。當然,優勢就是Java類不需要知道日誌服務的存在,也不需要考慮相關的代碼。所以,用 Spring AOP 編寫的應用程序代碼是鬆散耦合的。
AOP 的功能完全集成到了 Spring 事務管理、日誌和其他各種特性的上下文中。
IOC 容器
Spring 設計的核心是 org.springframework.beans 包,它的設計目標是與JavaBean組件一起使用。這個包通常不是由用戶直接使用,而是由服務器將其用作其他多數功能的底層中介。下一個最高級抽象是BeanFactory接口,它是工廠設計模式的實現,允許通過名稱創建和檢索對象。BeanFactory也可以管理對象之間的關係。
BeanFactory 支持兩個對象模型。
單態模型提供了具有特定名稱的對象的共享實例,可以在查詢時對其進行檢索。Singleton是默認的也是最常用的對象模型。對於無狀態服務對象很理想。
原型模型確保每次檢索都會創建單獨的對象。在每個用戶都需要自己的對象時,原型模型最適合。
bean 工廠的概念是 Spring 作爲 IOC容器的基礎。IOC將處理事情的責任從應用程序代碼轉移到框架。正如我將在下一個示例中演示的那樣,Spring 框架使用JavaBean屬性和配置數據來指出必須設置的依賴關係。
BeanFactory 接口
因爲org.springframework.beans.factory.BeanFactory是一個簡單接口,所以可以針對各種底層存儲方法實現。最常用的BeanFactory 定義是 XmlBeanFactory,它根據XML 文件中的定義裝入 bean,如清單 1 所示。
清單 1. XmlBeanFactory
BeanFactory factory = new XMLBeanFactory(newFileInputSteam(“mybean.xml”));
在 XML 文件中定義的 Bean 是被消極加載的,這意味在需要 bean 之前,bean本身不會被初始化。要從BeanFactory 檢索 bean,只需調用 getBean() 方法,傳入將要檢索的 bean的名稱即可,如清單 2所示。
清單 2. getBean()
MyBean mybean = (MyBean) factory.getBean(“mybean”);
每個 bean 的定義都可以是 POJO (用類名和 JavaBean 初始化屬性定義)或FactoryBean。FactoryBean 接口爲使用 Spring 框架構建的應用程序添加了一個間接的級別。
IOC 示例
理解控制反轉最簡單的方式就是看它的實際應用。在對由三部分組成的 Spring 系列 的第1部分進行總結時,我使用了一個示例,演示瞭如何通過 Spring IOC 容器注入應用程序的依賴關係(而不是將它們構建進來)。
我用開啓在線信用帳戶的用例作爲起點。對於該實現,開啓信用帳戶要求用戶與以下服務進行交互:
信用級別評定服務,查詢用戶的信用歷史信息。
遠程信息鏈接服務,插入客戶信息,將客戶信息與信用卡和銀行信息連接起來,以進行自動借記(如果需要的話)。
電子郵件服務,向用戶發送有關信用卡狀態的電子郵件。
三個接口
對於這個示例,我假設服務已經存在,理想的情況是用鬆散耦合的方式把它們集成在一起。以下清單顯示了三個服務的應用程序接口。
清單 3. CreditRatingInterface
Public interface CreditRatingInterface
Public Boolean getUserCreditHistoryInformation(ICustomer iCustomer);
清單 3 所示的信用級別評定接口提供了信用歷史信息。它需要一個包含客戶信息的 Customer對象。該接口的實現是由CreditRating 類提供的。
清單 4. CreditLinkingInterface
public interface CreditLinkingInterface
public String getUrl(); public void setUrl(String url);publicvoid linkCreditBankAccount() throws Exception ;
信用鏈接接口將信用歷史信息與銀行信息(如果需要的話)連接在一起,並插入用戶的信用卡信息。信用鏈接接口是一個遠程服務,它的查詢是通過getUrl()方法進行的。URL 由 Spring 框架的 bean 配置機制設置,我稍後會討論它。該接口的實現是由CreditLinking類提供的。
清單 5. EmailInterface
public interface EmailInterface
public void sendEmail(ICustomer iCustomer); publicStringgetFromEmail(); public void setFromEmail(String fromEmail) ;publicString getPassword(); public void setPassword(Stringpassword) ;public String getSmtpHost() ; public voidsetSmtpHost(StringsmtpHost); public String getUserId() ; publicvoid setUserId(StringuserId);
原理:
1. 讀取並解析配置文件
2. 讀取並解析映射信息,創建SessionFactory
3. 打開Sesssion
4. 創建事務Transation
5. 持久化操作
6. 提交事務
7. 關閉Session
8. 關閉SesstionFactory
爲什麼要用:
1. 對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。
2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作
3. hibernate使用Java反射機制,而不是字節碼增強程序來實現透明性。
4. hibernate的性能非常好,因爲它是個輕量級框架。映射的靈活性很出色。它支持各種關係數據庫,從一對一到多對多的各種複雜關係。
2. Hibernate是如何延遲加載?
1. Hibernate2延遲加載實現:a)實體對象 b)集合(Collection)
2. Hibernate3提供了屬性的延遲加載功能
當Hibernate在查詢數據的時候,數據並沒有存在與內存中,當程序真正對數據的操作時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提高了服務器的性能。
3. Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係)
類與類之間的關係主要體現在表與表之間的關係進行操作,它們都市對對象進行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many、
4. 說下Hibernate的緩存機制
1. 內部緩存存在Hibernate中又叫一級緩存,屬於應用事物級緩存
2. 二級緩存:
a) 應用及緩存
b) 分佈式緩存
條件:數據不會被第三方修改、數據大小在可接受範圍、數據更新頻率低、同一數據被系統頻繁使用、非關鍵數據
c) 第三方緩存的實現
5. Hibernate的查詢方式
Sql、Criteria,object comptosition
Hql:
1、 屬性查詢
2、 參數查詢、命名參數查詢
3、 關聯查詢
4、 分頁查詢
5、 統計函數
6. 如何優化Hibernate?
1. 使用雙向一對多關聯,不使用單向一對多
2. 靈活使用單向一對多關聯
3. 不用一對一,用多對一取代
4. 配置對象緩存,不使用集合緩存
5. 一對多集合使用Bag,多對多集合使用Set
6. 繼承類使用顯式多態
7. 表字段要少,表關聯不要怕多,有二級緩存撐腰
7. Struts工作機制?爲什麼要使用Struts?
工作機制:
Struts的工作流程:
在web應用啓動時就會加載初始化ActionServlet,ActionServlet從
struts-config.xml文件中讀取配置信息,把它們存放到各種配置對象
當ActionServlet接收到一個客戶請求時,將執行如下流程.
-(1)檢索和用戶請求匹配的ActionMapping實例,如果不存在,就返回請求路徑無效信息;
-(2)如果ActionForm實例不存在,就創建一個ActionForm對象,把客戶提交的表單數據保存到ActionForm對象中;
-(3)根據配置信息決定是否需要表單驗證.如果需要驗證,就調用ActionForm的validate()方法;
-(4)如果ActionForm的validate()方法返回null或返回一個不包含ActionMessage的ActionErrors對象,就表示表單驗證成功;
-(5)ActionServlet根據ActionMapping所包含的映射信息決定將請求轉發給哪個Action,如果相應的Action實例不存在,就先創建這個實例,然後調用Action的execute()方法;
-(6)Action的execute()方法返回一個ActionForward對象,ActionServlet在把客戶請求轉發給ActionForward對象指向的JSP組件;
-(7)ActionForward對象指向JSP組件生成動態網頁,返回給客戶;
爲什麼要用:
JSP、Servlet、JavaBean技術的出現給我們構建了強大的企業應用系統提供可能。但用這些技術構建的系統非常的繁亂,所以在此之上,我們需要一個規則、一個把這些技術組織起來的規則,這就是框架,Struts便應運而生。
基於Struts開發的應用由3類組件構成:C控制器組件、M模型組件、V視圖組件
8. Struts的validate框架是如何驗證的?
在struts配置文件中配置具體的錯誤提示,再在FormBean中的validate()方法具體調用。
9. 說下Struts的設計模式
MVC模式: web應用程序啓動時就會加載並初始化ActionServler。用戶提交表單時,一個配置好的ActionForm對象被創建,並被填入表單相應的數據,ActionServler根據Struts-config.xml文件配置好的設置決定是否需要表單驗證,如果需要就調用ActionForm的Validate()驗證後選擇將請求發送到哪個Action,如果Action不存在,ActionServlet會先創建這個對象,然後調用Action的execute()方法。Execute()從ActionForm對象中獲取數據,完成業務邏輯,返回一個ActionForward對象,ActionServlet再把客戶請求轉發給ActionForward對象指定的jsp組件,ActionForward對象指定的jsp生成動態的網頁,返回給客戶。
單例模式
Factory(工廠模式):
定義一個基類===》實現基類方法(子類通過不同的方法)===》定義一個工廠類(生成子類實例)
===》開發人員調用基類方法
Proxy(代理模式)
10. spring工作機制及爲什麼要用?
1.spring mvc將所有的請求都提交給DispatcherServlet,它會委託應用系統的其他模塊負責對請求進行真正的處理工作。
2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.
3.DispatcherServlet請求提交到目標Controller
4.Controller進行業務邏輯處理後,會返回一個ModelAndView
5. dispatcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象
6.視圖對象負責渲染返回給客戶端。
爲什麼用:
{AOP 讓開發人員可以創建非行爲性的關注點,稱爲橫切關注點,並將它們插入到應用程序代碼中。使用 AOP 後,公共服務 (比 如日誌、持久性、事務等)就可以分解成方面並應用到域對象上,同時不會增加域對象的對象模型的複雜性。
IOC 允許創建一個可以構造對象的應用環境,然後向這些對象傳遞它們的協作對象。正如單詞 倒置 所表明的,IOC 就像反過來的 JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straight construction),每一個對象都是用其協作對象構造的。因此是由容器管理協作對象(collaborator)。
Spring即使一個AOP框架,也是一IOC容器。 Spring 最好的地方是它有助於您替換對象。有了 Spring,只要用 JavaBean 屬性和配置文件加入依賴性(協作對象)。然後可以很容易地在需要時替換具有類似接口的協作對象。}
Spring的工作原理
一、 IoC(Inversion of control): 控制反轉
1、IOC:
概念:控制權由對象本身轉向容器;由容器根據配置文件去創建實例並創建各個實例之間的依賴關係
核心:bean工廠;在Spring中,bean工廠創建的各個實例稱作bean
二、AOP(Aspect-Oriented Programming): 面向方面編程
1、 代理的兩種方式:
靜態代理:
針對每個具體類分別編寫代理類;
針對一個接口編寫一個代理類;
動態代理:
針對一個方面編寫一個InvocationHandler,然後借用JDK反射包中的Proxy類爲各種接口動態生成相應的代理類
2、 AOP的主要原理:動態代理
Spring工作原理
Spring 已經用過一段時間了,感覺Spring是個很不錯的框架。內部最核心的就是IOC了,
動態注入,讓一個對象的創建不用new了,可以自動的生產,這其實就是利用java裏的反射
反射其實就是在運行時動態的去創建、調用對象,Spring就是在運行時,跟xml Spring的配置
文件來動態的創建對象,和調用對象裏的方法的 。
Spring還有一個核心就是AOP這個就是面向切面編程,可以爲某一類對象 進行監督和控制(也就是
在調用這類對象的具體方法的前後去調用你指定的 模塊)從而達到對一個模塊擴充的功能。這些都是通過
配置類達到的。
Spring目的:就是讓對象與對象(模塊與模塊)之間的關係沒有通過代碼來關聯,都是通過配置類說明
管理的(Spring根據這些配置 內部通過反射去動態的組裝對象)
要記住:Spring是一個容器,凡是在容器裏的對象纔會有Spring所提供的這些服務和功能。
Spring裏用的最經典的一個設計模式就是:模板方法模式。(這裏我都不介紹了,是一個很常用的設計模式)
Spring裏的配置是很多的,很難都記住,但是Spring裏的精華也無非就是以上的兩點,把以上兩點跟理解了
也就基本上掌握了Spring.