1. 程式人生 > >Struts 2 Spring Hibernate三大框架的執行流程以及原理

Struts 2 Spring Hibernate三大框架的執行流程以及原理

freemark 步驟 二維 ring logs spa att spring 添加

轉:http://www.cnblogs.com/System-out-println/p/5974113.html

Struts2框架

一、簡介

Struts2是一個相當強大的Java Web開源框架,是一個基於POJO的Action的MVC Web框架。它基於當年的WebWork和XWork框架,繼承其優點,同時做了相當的改進。

1、Struts2基於MVC架構,框架結構清晰,開發流程一目了然,開發人員可以很好的掌控開發的過程。

2、使用OGNL進行參數傳遞。OGNL提供了在Struts2裏訪問各種作用域的數據的簡單方式,你可以方便的獲取Request、Attribute、Application、Session、Parameters中的數據。大大簡化了開發人員在獲取這些數據是的代碼量。

3、強大的攔截器。Struts2的攔截器是一個Action級別的AOP,Struts2中的許多特性都是通過攔截器來實現的,例如異常處理、文件上傳、驗證等。 攔截器是可配置與重用的,可以將一些通用的功能如:登錄驗證、權限驗證等置於攔截器中以完成了系統中的權限驗證功能。

4、易於測試。Struts2的Action都是簡單的POJO,這樣可以方便的對Struts2的Action編寫測試用例,大大方便了Java Web項目的測試。

5、易於擴展的插件機制。在Struts2添加擴展是一件愉快而輕松的事情,只需要將所需要的Jar包放到WEB-INF/lib文件中,在Struts.xml中做一些簡單的設置就可以實現擴展。

6、模塊化管理。Struts2已經把模塊化作為了體系架構中的基本思想,可以通過三種方法來將應用程序模塊化:將配置信息拆分成多個文件把自包含的應用模塊創建為插件創建的框架特性,即將於特定應用無關的新功能組織成插件,以添加到多個應用中去。

7、全局結果與聲明式異常。為應用程序添加全局的Result,和在配置文件中對異常進行處理,這樣當處理過程中出現指定異常時,可以跳轉到特定頁面。

二、Struts2的工作機制

在Struts2框架中的處理大概分為:

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

2、這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其他框架的集成很有幫組,例如:SiteMeshPlugin);

3、接著FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請求是否需要調用某個Action;

4、如果ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy;

5、ActionProcy通過Configuration Manager詢問框架的配置文件,找到需要調用的Action類;

6、ActionProxy創建一個ActionInvocation實例。

7、ActionInvocation實例使用命令模式來調用,在調用Action的過程前後,

涉及到相關攔截器(Interceptor)的調用。

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

Spring框架講解

一、簡介

Spring為企業應用的開發提供了一個輕量級的解決方案,包括基於依賴註入的核心機制,基於AOP的聲明式事務管理,與多種持久層技術的整合,以及優秀的Web MVC框架等。Spring支持對POJO(Plain Object Java Object,指最傳統的Java對象,和任何模式都無關)的管理。Spring的目標是實現一個全方位的整合框架,在Spring框架下實現多個子框架的組合,這些子框架之間彼此可以獨立,也可以使用其它的框架方案加以代替。

Spring是一個開源的項目;它基於IOC和AOP的架構多層J2ee系統的框架,

但它不強迫你必須在每一層中必須使用Spring,因為它模塊化的很好,允許你根據自己的需要選擇使用它的某一個模塊;它實現了很優雅的MVC,對不同的數據訪問技術提供了統一的接口,采用IOC使得可以很容易的實現bean的裝配,提供了簡潔的AOP並據此實現Transaction Manager等等。

優點:

1、Spring能有效地組織你的中間層對象,不管你是否選擇使用了EJB。

2、Spring能消除在許多工程中常見的對Singleton的過多使用;降低了系統的可測試性和面向對象的程度。

3、通過一種在不同應用程序和項目間一致的方法來處理配置文件,Spring能消除各種各樣自定義格式的屬性文件的需要。

4、通過把對接口編程而不是對類編程的代價幾乎減少到沒有,Spring能夠促進養成好的編程習慣。

5、Spring被設計為讓使用者它創建的應用盡可能少的依賴於他的API。

6、使用Spring構建的應用程序易於單元測試。

7、Spring能使EJB的使用成為一個實現選擇,而不是應用架構的必然選擇。

8、Spring幫助你解決許多問題而無需使用EJB。

9、Spring為數據存取提供了一個一致的框架,不論使用的是JDBC還是O/R Mapping產品(如Hibernate)。

缺點:

Jsp中要寫很多代碼、控制器過於靈活,缺少一個公用控制器。

二、Spring的工作機制

1、用戶向服務器發送請求,請求被Spring前端控制DispatcherServlet捕獲;

2.、DispatcherServlet對請求URL進行解析,得到請求資源標示符(URI)。然後根據該URI,調用Handler Mapping獲得該Handler配置的所有相關的對象(包括Handler對象以及Handler對象對應的攔截器),最後以HandlerExecutionChain對象的形式返回;

3、DispatcherServlet根據獲得的Handler,選擇一個合適的HandlerAdapter。(如果成功獲得後,此時將開始執行攔截器的preHandler(…)方法)。

4、提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller)。在填充Handler的入參過程中,根據你的配置,Spring將幫助你做一些額外的工作(如:HttpMessageConveter、數據裝換、數據格式化、數據驗證),驗證結果存儲到BindingResult或Error中。

5、Handler執行完成後,向DispatcherServlet返回一個ModelAndView對對象;

6、根據返回的ModelAndView,選擇一個合適的ViewResolver(必須是已經註冊到Spring容器中的ViewResolver)返回給DispatcherServlet;

7、ViewResolver結合Model和View,來渲染試圖。

8、將渲染結果返回給客戶端。

註解:

1.spring mvc將所有的請求都提交給DispatcherServlet,它會委托應用系統的其他模塊負責負責對請求進行真正的處理工作。

2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.

3.DispatcherServlet將請求提交到目標Controller

4.Controller進行業務邏輯處理後,會返回一個ModelAndView

5.Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象

6.視圖對象負責渲染返回給客戶端。

Hibernate框架講解

一、簡介

Hibernate是開源的、用於封裝數據訪問層的組件,我們稱之為數據訪問層框架(或持久層框架)。

之前我們通過JDBC/SQL語句從數據庫中訪問/操作數據,而Hibernate就是封裝了這些操作,用於數據訪問層的組件技術。

出現Hibernate框架之前在企業項目開發過程中,如下幾點造成了程序員們的痛苦:

1、SQL語句過於繁雜和數據庫的耦合度高。

2、指有些SQL會涉及到多表操作,或者有些表會非常龐大,這時候寫在Dao中的SQL就會非常復雜,同時導致Dao和數據庫的耦合度較高。

3、不同數據庫之間SQL的不同,導致移植困難。

4、不同數據庫雖然SQL語句大致相同,但是還有一些細節上的差別,比如Oracle中的分頁方式和MySQL中的分頁是不同的,所以會有代碼移植困難的因素。

5、二維關系表和對象之間數據結構的不匹配。

6、我們從數據庫中取出的數據時結果集(一張表),而我們開發時需要將查詢到的結果集封裝為對象,然而數據庫中二維表的數據結構和內存中Java對象的數據結構是不匹配的(表中的數據需要經過處理才能變為Java對象)。

基於如上幾點,痛苦促進了技術的革新和進步,Hibernate應用而生。

二、Hibernate的工作原理-ORM

對象-關系映射(Object-Relationship Mapping)

在我們的應用程序(App)中數據用對象類體現,而在數據庫中,數據使用表的形式保存。

Hibernate用於應用程序中的對象(Object)與表中的數據關系(Relationship)之間的映射(Mapping),即把對象保存到關系表中或者把關系表中數據取出映射為對象。

可以這樣理解,當我們使用Hibernate框架技術,就可以直接從數據庫中取出Java對象,或者把Java對象直接保存於數據庫中,中間寫SQL語句等繁瑣的步驟被Hibernate封裝,對我們是透明的。

Hibernate是自動化程度很高的組件,因此比較難以駕馭,在對Hibernate理解不夠透徹的情況下使用,稍不留神可能就會影響性能。

業界還有一些自動化程序度稍低的數據訪問層組件,比如Ibatis,相當於半自動化的儀器,可控性較Hibernate強一些,目前也比較流行。

處理步驟:

1、通過Configuration().configure(); //讀取並解析hibernate.cfg.xml配置文件

2、由hibernate.cfg.xml中的<mapping resource=”**/**/User.hbm.xml”>讀取並解析映射信息.

3、通過config.buildSessionFactory(); //創建SessionFactory;

4、sessionFactory.openSession(); //打開Session

5、session.beginTransaction(); //創建事務Transaction

6、persistent operate 持久化操作.

7、Session.getTransaction().commit(); //提交事務

8、關閉Session

9、關閉SessionFactory

Struts 2 Spring Hibernate三大框架的執行流程以及原理