Spring
一說到Spring,大家都應(yīng)該聽說過這個框架,這是JavaEE最重要的一個框架。Spring框架主要包括以下七個模塊:
Core(容器):核心容器提供Spring框架的基本功能。核心容器的主要組件是BeanFactory,它是工廠模式的實現(xiàn)。BeanFactory使用控制反轉(zhuǎn) (IOC)模式將應(yīng)用程序的配置和依賴性規(guī)范與實際的應(yīng)用程序代碼分開。
AOP:通過配置管理特性,Spring AOP模塊直接將面向方面的編程功能集成到了Spring框架中。所以,可以很容易地使Spring框架管理的任何對象支持AOP。Spring AOP模塊為基于Spring的應(yīng)用程序中的對象提供了事務(wù)管理服務(wù)。通過使用Spring AOP,不用依賴EJB組件,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。
Context(上下文):Spring上下文是一個配置文件,向Spring框架提供上下文信息。Spring上下文包括企業(yè)服務(wù),例如JNDI、EJB、電子郵件、國際化、校驗和調(diào)度功能。
DAO:JDBC DAO抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來管理異常處理和不同數(shù)據(jù)庫供應(yīng)商拋出的錯誤消息。異常層次結(jié)構(gòu)簡化了錯誤處理,并且極大地降低了需要編寫的異常代碼數(shù)量(例如打開和關(guān)閉連接)。Spring DAO的面向JDBC的異常遵從通用的DAO異常層次結(jié)構(gòu)。
ORM:Spring框架插入了若干個ORM框架,從而提供了ORM的對象關(guān)系工具,其中包括JDO、Hibernate和iBatis SQL Map。所有這些都遵從Spring的通用事務(wù)和DAO異常層次結(jié)構(gòu)。
WEB:Web上下文模塊建立在應(yīng)用程序上下文模塊之上,為基于Web的應(yīng)用程序提供了上下文。所以,Spring框架支持與Jakarta Struts的集成。Web模塊還簡化了處理多部分請求以及將請求參數(shù)綁定到域?qū)ο蟮墓ぷ鳌?/p>
WEB MVC:MVC框架是一個全功能的構(gòu)建Web應(yīng)用程序的MVC實現(xiàn)。通過策略接口,MVC框架變成為高度可配置的,MVC容納了大量視圖技術(shù),其中包括JSP、Velocity、Tiles、iText和POI。
Spring中最核心的東西應(yīng)該就是IOC和AOP了,IOC讓一個對象的創(chuàng)建不用new了,可以自動的生產(chǎn),這其實就是利用java里的反射,反射其實就是在運行時動態(tài)的去創(chuàng)建、調(diào)用對象,Spring就是在運行時,跟xml Spring的配置文件來動態(tài)的創(chuàng)建對象,和調(diào)用對象里的方法的 。AOP讓開發(fā)人員可以創(chuàng)建非行為性的關(guān)注點,稱為橫切關(guān)注點,并將它們插入到應(yīng)用程序代碼中。使用AOP后,公共服務(wù) (比如日志、持久性、事務(wù)等)就可以分解成方面并應(yīng)用到域?qū)ο笊希瑫r不會增加域?qū)ο蟮膶ο竽P偷膹?fù)雜性。
整個spring流程大體是這樣:
1.Spring Mvc請所有的請求都提交給DispatcherServlet,它會委托應(yīng)用系統(tǒng)的其他模塊負責負責對請求進行真正的處理工作。
2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller。
3.DispatcherServlet請請求提交到目標Controller。
4.Controller進行業(yè)務(wù)邏輯處理后,會返回一個ModelAndView。
5.Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象。
6.視圖對象負責渲染返回給客戶端。
總結(jié)Spring的優(yōu)點大概有如下幾點:
1.低侵入式設(shè)計,代碼污染極低。
2.獨立于各種應(yīng)用服務(wù)器,基于Spring框架的應(yīng)用,可以真正實現(xiàn)Write Once,Run Anywhere的承諾。
3.Spring的DI機制降低了業(yè)務(wù)對象替換的復(fù)雜性,提高了組件之間的解耦。
4.Spring的AOP支持允許將一些通用任務(wù)如安全、事務(wù)、日志等進行集中式管理,從而提供了更好的復(fù)用。
5.Spring的ORM和DAO提供了與第三方持久層框架的良好整合,并簡化了底層的數(shù)據(jù)庫訪問。
6.Spring并不強制應(yīng)用完全依賴于Spring,開發(fā)者可自由選用Spring框架的部分或全部。
Struts
Struts是Apache軟件基金會(ASF)贊助的一個開源項目。它最初是jakarta項目中的一個子項目,并在2004年3月成為ASF的頂級項目。它通過采用JavaServlet/JSP技術(shù),實現(xiàn)了基于JavaEEWeb應(yīng)用的MVC設(shè)計模式的應(yīng)用框架,是MVC經(jīng)典設(shè)計模式中的一個經(jīng)典產(chǎn)品。
Struts的含義是”支柱,枝干”,它的目的是為了減少程序開發(fā)的時間,項目的創(chuàng)建者認為JSP,servlet的存在雖然可以幫助用戶解決大部分問題,但是由于它們的編碼對項目的開發(fā)帶來了許多的不方便,可重用性也差,所以struts應(yīng)運而生,幫助用戶在最短的時間內(nèi)解決這些問題。
Struts框架提供如下服務(wù):
(1)作為控制器的Servlet。
(2)提供大量的標簽庫。
(3)提供了用于國際化的框架,利用不同的配置文件,可以幫助用戶選擇合適自己的語言。
(4)提供了JDBC的實現(xiàn),來定義數(shù)據(jù)源和數(shù)據(jù)庫連接池。
(5)XML語法分析工具。
(6)文件下載機制。
ActionServlet是struts中核心的控制器,所有的用戶請求都必須通過ActionServlet的處理,而struts-config.xml是struts中核心的配置文件,在這個文件中配置了用戶請求URL和控制器Action的映射關(guān)系,ActionServlet通過這個配置文件把用戶的請求發(fā)送到對應(yīng)的控制器中。
在struts web應(yīng)用程序中,當web應(yīng)用程序啟動的時候,就會初始化ActionServlet在初始化ActionServlet的時候會加載struts-config.xml配置文件,在加載成功后會把這些URL和控制器映射關(guān)系存放在ActionMapping對象或者其他對象中。當ActionServlet接收到用戶請求的時候,就會按照下面的流程對用戶請求進行處理。
(1)ActionServlet接收到用戶的請求后,會根據(jù)請求URL尋找匹配的ActionMapping對象,如果匹配失敗,說明用戶請求的URL路徑信息有誤,所以返回請求路徑無效的信息,當找到匹配的ActionMapping的時候,進入到下一步。
(2)當ActionServlet找到匹配的ActionMapping對象的時候,會根據(jù)ActionMapping中的映射信息判斷對應(yīng)的ActionForm對象是否存在,如果不存在對應(yīng)的ActionForm對象就創(chuàng)建一個新的ActionForm對應(yīng),并把用戶提交的表單信息保存到這個ActionForm對象中。
(3)在struts-config.xml中這個配置文件,可以配置表單是否需要驗證,如果需要驗證,就調(diào)用ActionForm中的validate方法對用戶輸入的表單進行驗證。
(4)如果ActionForm的validate方法返回了ActionErrors對象,則表明驗證失敗,ActionServlet把這個頁面返回到用戶輸入的界面,提示用戶重新輸入。如果方法的返回值為null,就表明驗證已經(jīng)通過,可以進入下一步處理。
(5)ActionServlet可以根據(jù)ActionMapping對象查找用戶請求轉(zhuǎn)發(fā)給哪個控制器Action,如果對應(yīng)的Action對象不存在,就創(chuàng)建這個對象,并調(diào)用這個Action的excute方法。
(6)業(yè)務(wù)邏輯控制器Action的execute()方法就會返回一個ActionForward對象,ActionServlet把控制器處理的結(jié)果轉(zhuǎn)發(fā)到ActionForward對象指定的JSP頁面。
(7)ActionForward對象指定的JSP頁面根據(jù)返回的處理結(jié)果,用合適形式把服務(wù)器處理的結(jié)果展示給用戶,到這里為止,一個客戶請求的整個過程完畢。
Hibernate
Hibernate是一個開放源代碼的對象關(guān)系映射框架,它對JDBC進行了非常輕量級的對象封裝,它將POJO與數(shù)據(jù)庫表建立映射關(guān)系,是一個全自動的orm框架,hibernate可以自動生成SQL語句,自動執(zhí)行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數(shù)據(jù)庫。Hibernate可以應(yīng)用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應(yīng)用中使用,最具革命意義的是,Hibernate可以在應(yīng)用EJB的J2EE架構(gòu)中取代CMP,完成數(shù)據(jù)持久化的重任。
Hibernate的API一共有6個,分別為:Session、SessionFactory、Transaction、Query、Criteria和Configuration。通過這些接口,可以對持久化對象進行存取、事務(wù)控制。
Session接口負責執(zhí)行被持久化對象的CRUD操作(CRUD的任務(wù)是完成與數(shù)據(jù)庫的交流,包含了很多常見的SQL語句)。但需要注意的是Session對象是非線程安全的。同時,Hibernate的session不同于JSP應(yīng)用中的HttpSession。這里當使用session這個術(shù)語時,其實指的是Hibernate中的session,而以后會將HttpSession對象稱為用戶session。
SessionFactory接口負責初始化Hibernate。它充當數(shù)據(jù)存儲源的代理,并負責創(chuàng)建Session對象。這里用到了工廠模式。需要注意的是SessionFactory并不是輕量級的,因為一般情況下,一個項目通常只需要一個SessionFactory就夠,當需要操作多個數(shù)據(jù)庫時,可以為每個數(shù)據(jù)庫指定一個SessionFactory。
Transaction接口是一個可選的API,可以選擇不使用這個接口,取而代之的是Hibernate的設(shè)計者自己寫的底層事務(wù)處理代碼。Transaction接口是對實際事務(wù)實現(xiàn)的一個抽象,這些實現(xiàn)包括JDBC的事務(wù)、JTA中的UserTransaction、甚至可以是CORBA事務(wù)。之所以這樣設(shè)計是能讓開發(fā)者能夠使用一個統(tǒng)一事務(wù)的操作界面,使得自己的項目可以在不同的環(huán)境和容器之間方便地移植。
Query接口讓你方便地對數(shù)據(jù)庫及持久對象進行查詢,它可以有兩種表達方式:HQL語言或本地數(shù)據(jù)庫的SQL語句。Query經(jīng)常被用來綁定查詢參數(shù)、限制查詢記錄數(shù)量,并最終執(zhí)行查詢操作。
Criteria接口與Query接口非常類似,允許創(chuàng)建并執(zhí)行面向?qū)ο蟮臉藴驶樵儭V档米⒁獾氖荂riteria接口也是輕量級的,它不能在Session之外使用。
Configuration類的作用是對Hibernate進行配置,以及對它進行啟動。在Hibernate的啟動過程中,Configuration類的實例首先定位映射文檔的位置,讀取這些配置,然后創(chuàng)建一個SessionFactory對象。雖然Configuration類在整個Hibernate項目中只扮演著一個很小的角色,但它是啟動hibernate時所遇到的第一個對象。
對于Hibernate主要以下幾個優(yōu)點:
1、更加對象化。以對象化的思維操作數(shù)據(jù)庫,我們只需要操作對象就可以了,開發(fā)更加對象化。
2、移植性。因為Hibernate做了持久層的封裝,你就不知道數(shù)據(jù)庫,你寫的所有的代碼都具有可復(fù)用性。
3、Hibernate是一個沒有侵入性的框架,沒有侵入性的框架我們稱為輕量級框架。對比Struts的Action和ActionForm,都需要繼承,離不開Struts。Hibernate不需要繼承任何類,不需要實現(xiàn)任何接口。這樣的對象叫POJO對象。
4、Hibernate代碼測試方便。
5、提高效率,提高生產(chǎn)力。
其缺點就是:
1、使用數(shù)據(jù)庫特性的語句,將很難調(diào)優(yōu)
2、對大批量數(shù)據(jù)更新存在問題
3、系統(tǒng)中存在大量的攻擊查詢功能