Struts2工作原理
struts2工作原理圖

1 用戶端初始化一個指向Servlet容器(例如Tomcat)的請求
2 這個請求經過一系列的過濾器( Filter) (這些過濾器中有一個叫做 ActionContextCleanUp 的可選過濾器,這個過濾器對于Struts2和其他架構的內建很有幫助,例如:SiteMesh Plugin)
3 接着 FilterDispatche r 被調用,FilterDispatcher詢問 ActionMapper 來決定這個請是否需要調用某個Action
4 如果ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給 ActionProxy
5 ActionProxy通過 Configuration Manager 詢問架構的配置檔案,找到需要調用的Action類
6 ActionProxy建立一個 ActionInvocation 的執行個體。
7 ActionInvocation執行個體使用命名模式來調用,在調用 Action 的過程前後,涉及到相關攔截器( Intercepter )的調用。
8 一旦Action執行完畢,ActionInvocation負責根據 struts.xml 中的配置找到對應的傳回結果。傳回結果通常是(但不總是,也可 能是另外的一個Action鍊)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2 架構中繼承的标簽。在這個過程中需要涉及到ActionMapper
在上述過程中所有的對象( Action , Results , Interceptors ,等)都是通過 ObjectFactory 來建立的
Struts2 優缺點(即為什麼要用 struts2 )
Struts2 就會自動的進行驗證。還有很多,比如國際化資源檔案等。
Struts2 的開發中來,如果你重來沒有用過任何架構,你也可以通過快速的學習,加入到 Struts2 的應用開發中來,因為它足夠的簡單。
大量的攔截器:
Struts2 本身提供了大量的可重用的攔截器,比如類型轉換攔截器,很多時候我們從頁面取得參數,這個時候它是 String 類型的,我們需要手動。
基于插件的架構:
Struts2 是一個基于插件的架構,社群中提供了很多實用的插件,比如 jfreechat/json 等等,使用這些插件可以簡化我們的開發,加快開發進度。
struts2 最大的缺點莫過于在好多 web 伺服器上支援不好,例如在 websphere5.5,weblogic8.1 及以前版本支援非常查,需要用最新的。
多種視圖的支援:
多種視圖的支援: jsp , freemarker , Veloctiy ,隻要你願意,你甚至可以通過輕松的改造讓它支援 pdf ,同一個項目中你可以支援多種視圖。
更加的子產品化:
與 Struts1.X 相比, Struts2 更加的子產品化,可以輕松将配置資訊按功能界限拆分成多個檔案,便于管理和團隊協作開發。
與Spring的內建:
與 Struts1.x 相比, Struts2 不必再自己編寫 singleton ,進一步的降低了程式間的耦合性,就 Struts2 内部本身而言,降低了架構本身的偶合性。
基于pojo易于測試:
在 Struts1.x 中我需要 Mock 出這兩個 Http 對象,使我們很難編寫 Action 的單元測試,與 Struts1.x 相比, Struts2 的 Action 不再依賴于 HttpServletRequest 和 HttpServletResponse 對象,使我們能夠更友善的針對 Action 編寫單元測試。
Hibernate工作原理
1. 讀取并解析配置檔案
2. 讀取并解析映射資訊,建立 SessionFactory
3. 打開 Sesssion
4. 建立事務 Transation
5. 持久化操作
6. 送出事務
7. 關閉 Session
8. 關閉 SesstionFactory
Hibernate 優缺點
優點:
1: hibernate是基于ORMapping技術的開源的架構,對JDBC進行了輕量級的封裝,使用面向對象的思維來操縱資料庫。
2:hibernate提供了session緩存和二級緩存,對于不需要進行複雜查詢的系統,性能有提升。
3:低侵入式設計
缺點:
1:hibernate學習成本太高。
2:不适合有複雜的sql查詢(統計) 。
3:不适合大量的聚集操作,(存儲過程)
優缺點補充:
1 、 不需要編寫的SQL語句( 不需要編輯 JDBC) ,隻需要操作相應的對象就可以了,就可以能夠存儲、更新、删除、加載對象,可以提高生産效;
2 、因為使用 Hibernate 隻需要操作對象就可以了,是以我們的開發更對象化了;
3 、 使用Hibernate,移植性好( 隻要使用 Hibernate 标準開發,更換資料庫時,隻需要配置相應的配置檔案就可以了,不需要做其它任務的操作 ) ;
4 、 Hibernate 實作了透明持久化: 當儲存一個對象時,這個對象不需要繼承Hibernate中的任何類、實作任何接口,隻是個純粹的單純對象—稱為POJO對象( 最純粹的對象 — 這個對象沒有繼承第三方架構的任何類和實作它的任何接口 )
5 、 Hibernate是一個沒有侵入性的架構,沒有侵入性的架構我們一般稱為輕量級架構
6 、 Hibernate 代碼測試友善。
Spring工作原理
内部最核心的就是 IOC 了,
動态注入,讓一個對象的建立不用 new 了,可以自動的生産,這其實就是利用 java 裡的反射
反射其實就是在運作時動态的去建立、調用對象, Spring 就是在運作時,跟 xml Spring 的配置
檔案來動态的建立對象,和調用對象裡的方法的 。
Spring 還有一個核心就是 AOP 這個就是面向切面程式設計,可以為某一類對象 進行監督和控制(也就是
在調用這類對象的具體方法的前後去調用你指定的 子產品)進而達到對一個子產品擴充的功能。這些都是通過
配置類達到的。
Spring 目的:就是讓對象與對象(子產品與子產品)之間的關系沒有通過代碼來關聯,都是通過配置類說明
管理的( Spring 根據這些配置 内部通過反射去動态的組裝對象)
要記住: Spring 是一個容器,凡是在容器裡的對象才會有 Spring 所提供的這些服務和功能。
Spring 裡用的最經典的一個設計模式就是:模闆方法模式。(這裡我都不介紹了,是一個很常用的設計模式)
Spring 裡的配置是很多的,很難都記住,但是 Spring 裡的精華也無非就是以上的兩點,把以上兩點跟了解了 也就基本上掌握了 Spring.
Spring AOP 與 IOC
一、 IoC(Inversion of control): 控制反轉
1 、 IoC :
概念:控制權由對象本身轉向容器;由容器根據配置檔案去建立執行個體并建立各個執行個體之間的依賴關系
核心: bean 工廠;在 Spring 中, bean 工廠建立的各個執行個體稱作 bean
二、 AOP(Aspect-Oriented Programming): 面向方面程式設計
1 、 代理的兩種方式:
靜态代理:
l 針對每個具體類分别編寫代理類;
l 針對一個接口編寫一個代理類;
動态代理:
針對一個方面編寫一個 InvocationHandler ,然後借用 JDK 反射包中的 Proxy 類為各種接口動态生成相應的代理類
Spring 優缺點
它是一個開源的項目,而且目前非常活躍;它基于 IoC ( Inversion of Control ,反向控制)和 AOP 的構架多層 j2ee 系統的架構,但它不強迫你必須在每一層 中必須使用 Spring ,因為它子產品化的很好,允許你根據自己的需要選擇使用它的某一個子產品;它實作了很優雅的 MVC ,對不同的資料通路技術提供了統一的 接口,采用 IoC 使得可以很容易的實作 bean 的裝配,提供了簡潔的 AOP 并據此實作 Transcation Managment ,等等
優點
a. Spring 能有效地組織你的中間層對象,不管你是否選擇使用了 EJB 。如果你僅僅使用了 Struts 或其他為 J2EE 的 API 特制的 framework , Spring 緻力于解決剩下的問題。
b. Spring 能消除在許多工程中常見的對 Singleton 的過多使用。根據我的經驗,這是一個很大的問題,它降低了系統的可測試性和面向對象的程度。
c. 通過一種在不同應用程式和項目間一緻的方法來處理配置檔案, Spring 能消除各種各樣自定義格式的屬性檔案的需要。曾經對某個類要尋找的是哪個魔法般的屬性項或系統屬性感到不解,為此不得不去讀 Javadoc 甚至源編碼?有了 Spring ,你僅僅需要看看類的 JavaBean 屬性。 Inversion of Control 的使用(在下面讨論)幫助完成了這種簡化。
d. 通過把對接口程式設計而不是對類程式設計的代價幾乎減少到沒有, Spring 能夠促進養成好的程式設計習慣。
e. Spring 被設計為讓使用它建立的應用盡可能少的依賴于他的 APIs 。在 Spring 應用中的大多數業務對象沒有依賴于 Spring 。
f. 使用 Spring 建構的應用程式易于單元測試。
g. Spring 能使 EJB 的使用成為一個實作選擇 , 而不是應用架構的必然選擇。你能選擇用 POJOs 或 local EJBs 來實作業務接口,卻不會影響調用代碼。
h. Spring 幫助你解決許多問題而無需使用 EJB 。 Spring 能提供一種 EJB 的替換物,它們适用于許多 web 應用。例如, Spring 能使用 AOP 提供聲明性事務管理而不通過 EJB 容器,如果你僅僅需要與單個資料庫打交道,甚至不需要一個 JTA 實作。
i. Spring 為資料存取提供了一個一緻的架構 , 不論是使用的是 JDBC 還是 O/R mapping 産品(如 Hibernate )。
Spring 确實使你能通過最簡單可行的解決辦法來解決你的問題。而這是有有很大價值的。
缺點: jsp 中要寫很多代碼、控制器過于靈活,缺少一個公用控制器