答:html
1.struts是一個按MVC模式設計的Web層框架,其實它就是一個大大的servlet,這個Servlet名爲ActionServlet,或是ActionServlet的子類。咱們能夠在web.xml文件中將符合某種特徵的全部請求交給這個Servlet處理,這個Servlet再參照一個配置文件(一般爲/WEB-INF/struts-config.xml)將各個請求分別分配給不一樣的action去處理。前端
一個擴展知識點:struts的配置文件能夠有多個,能夠按模塊配置各自的配置文件,這樣能夠防止配置文件的過分膨脹;java
2.ActionServlet把請求交給action去處理以前,會將請求參數封裝成一個formbean對象(就是一個Java類,這個類中的每一個屬性對應一個請求參數),封裝成一個什麼樣的formbean對象呢?看配置文件。mysql
3.要說明的是, ActionServlet把formbean對象傳遞給action的execute方法以前,可能會調用formbean的validate方法進行校驗,只有校驗經過後纔將這個formbean對象傳遞給action的execute方法,不然,它將返回一個錯誤頁面,這個錯誤頁面由input屬性指定,(看配置文件)做者爲何將這裏命名爲input屬性,而不是error屬性,咱們後面結合實際的運行效果進行分析。web
4.action執行完後要返回顯示的結果視圖,這個結果視圖是用一個ActionForward對象來表示的,actionforward對象經過struts-config.xml配置文件中的配置關聯到某個jsp頁面,由於程序中使用的是在struts-config.xml配置文件爲jsp頁面設置的邏輯名,這樣能夠實現action程序代碼與返回的jsp頁面名稱的解耦。正則表達式
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||算法
Struts 2的工做流程與WebWork框架基本相同,因此說Struts2是WebWork的升級版本。spring
基本簡要流程以下:一、客戶端瀏覽器發出HTTP請求。二、根據web.xml配置,該請求被FilterDispatcher接收。三、根據struts.xml配置,找到須要調用的Action類和方法,並經過IoC方式,將值注入給Aciton。四、Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。五、Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,並跳轉到相應頁面。六、返回HTTP響應到客戶端瀏覽器。sql
****************************************************************************************************數據庫
一個請求在Struts2框架中的處理大概分爲如下幾個步驟:
一、客戶端初始化一個指向Servlet容器(例如Tomcat)的請求;
二、這個請求通過一系列的過濾器(Filter)(這些過濾器中有一個叫作ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其餘框架的集成頗有幫助,例如:SiteMesh Plugin);
三、接着FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請求是否須要調用某個Action;
四、若是ActionMapper決定須要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy;
五、ActionProxy經過ConfigurationManager詢問框架的配置文件,找到須要調用的Action類;
六、ActionProxy建立一個ActionInvocation的實例。
七、ActionInvocation實例使用命名模式來調用,在調用Action的過程先後,涉及到相關攔截器(Intercepter)的調用。
八、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果一般是(但不老是,也多是另外的一個Action鏈)一個須要被表示的JSP或者FreeMarker的模版。在表示的過程當中可使用Struts2框架中繼承的標籤。在這個過程當中須要涉及到ActionMapper。
****************************************************************************************************
Struts 2框架自己大體能夠分爲3個部分:核心控制器FilterDispatcher、業務控制器Action和用戶實現的企業業務邏輯組件。核心控制器 FilterDispatcher是Struts 2框架的基礎,包含了框架內部的控制流程和處理機制。業務控制器Action和業務邏輯組件是須要用戶來本身實現的。用戶在開發Action和業務邏輯組件的同時,還須要編寫相關的配置文件,供核心控制器FilterDispatcher來使用。
Struts2的體系與Struts1體系的差異很是大,由於Struts2使用了WebWork的設計核心,而不是Struts1的設計核心。Struts2中大量使用攔截器來處理用戶的請求,從而容許用戶的業務邏輯控制器與Servlet API分離。
Struts2框架的大概處理流程以下:
一、加載類(FilterDispatcher)
二、讀取配置(struts配置文件中的Action)
三、派發請求(客戶端發送請求)
四、調用Action(FilterDispatcher從struts配置文件中讀取與之相對應的Action)
五、啓用攔截器(WebWork攔截器鏈自動對請求應用通用功能,如驗證)
六、處理業務(回調Action的execute()方法)
七、返回響應(經過execute方法將信息返回到FilterDispatcher)
八、查找響應(FilterDispatcher根據配置查找響應的是什麼信息如:SUCCESS、ERROR,將跳轉到哪一個jsp頁面)
九、響應用戶(jsp--->客戶瀏覽器端顯示)
十、struts2標籤庫(相比struts1的標籤庫,struts2是大大增強了,對數據的操做功能很強大)
****************************************************************************************************
答:在struts.xml中就只須要配置一個action,在一個Action類中分發Action請求調用不一樣的方法。
****************************************************************************************************
ActionServlet繼承自javax.servlet.http.HttpServlet類,其在Strutsframework中扮演的角色是中心控制器。它提供一箇中心位置來處理所有的終端請求。控制器ActionServlet主要負責將HTTP的客戶請求信息組裝後,根據配置文件的指定描述,轉發到適當的處理器。
按照Servelt的標準,全部得Servlet必須在web配置文件(web.xml)聲明。一樣,ActoinServlet必須在WebApplication配置文件(web.xml)中描述,有關配置信息以下。
< servlet>
< servlet-name>action</servlet-name>
< servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
< /servlet>
所有的請求URI以*.do的模式存在並映射到這個servlet,其配置以下:
< servlet-mapping>
< servlet-name>action</servlet-name>
< url-pattern>*.do</url-pattern>
< /servlet-mapping>
一個該模式的請求URI符合以下格式:http://www.my_site_name.com/mycontext/actionName.do
當用戶向服務器端提交請求的時候,實際上信息是首先發送到控制器ActionServlet,一旦控制器得到了請求,其就會將請求信息傳交給一些輔助類(help classes)處理。這些輔助類知道如何去處理與請求信息所對應的業務操做。在Struts中,這個輔助類就是org.apache.struts.action.Action。一般開發者須要本身繼承Aciton類,從而實現本身的Action實例。
答:上傳,重複提交,數字轉換,表單認證,國際化,等等
****************************************************************************************************
答:1.首先要實現Interceptor(攔截器)接口 2.在配置文件中定義本身的攔截器。 3.最後還要把系統提供的默認攔截器加上,不然系統默認攔截器不起做用
****************************************************************************************************
答:實現TypeCoverter接口,或者繼承DefaultTypeConverter實現類(該類實現了TypeCoverter接口),經過繼承該實現類來實現本身的類型轉換器。重寫convertValue方法便可。
1.都是MVC的WEB框架,
2struts1的老牌框架,應用很普遍,有很好的羣衆基礎,使用它開發風險很小,成本更低!struts2雖然基於這個框架,可是應用羣衆並多,相對不成熟,未知的風險和變化不少,開發人員相對很差招,使用它開發項目的風險係數更大,用人成本更高!
3.struts2畢竟是站在前輩的基礎設計出來,它會改善和完善struts1中的一些缺陷,struts1中一些懸而未決問題在struts2獲得瞭解決。
4.struts1的前端控制器是一個Servlet,名稱爲ActionServlet,struts2的前端控制器是一個filter,在struts2.0中叫FilterDispatcher,在struts2.1中叫StrutsPrepareAndExecuteFilter。
5.struts1的action須要繼承Action類,struts2的action能夠不繼承任何類;struts1對同一個路徑的全部請求共享一個Action實例,struts2對同一個路徑的每一個請求分別使用一個獨立Action實例對象,全部對於struts2的Action不用考慮線程安全問題。
6.在struts1中使用formbean封裝請求參數,在struts2中直接使用action的屬性來封裝請求參數。
7.struts1中的多個業務方法放在一個Action中時(即繼承DispatchAction時),要麼都校驗,要麼都不校驗;對於struts2,能夠指定只對某個方法進行校驗,當一個Action繼承了ActionSupport且在這個類中只編寫了validateXxx()方法,那麼則只對Xxx()方法進行校驗。
(一個請求來了的執行流程進行分析,struts2是自動支持分模塊開發,並能夠不一樣模塊設置不一樣的url前綴,這是經過package的namespace來實現的;struts2是支持多種類型的視圖;struts2的視圖地址能夠是動態的,即視圖的名稱是支持變量方式的,舉例,論壇發帖失敗後回來還要傳遞boardid。視圖內容顯示方面:它的標籤用ognl,要el強大不少,在國際化方面支持分模塊管理,兩個模塊用到一樣的key,對應不一樣的消息;)
與Struts1不一樣,Struts2對用戶的每一次請求都會建立一個Action,因此Struts2中的Action是線程安全的。
給我印象最深入的是:struts配置文件中的redirect視圖的url不能接受參數,而struts2配置文件中的redirect視圖能夠接受參數。
答:1.使用嚮導添加struts2的組件;
2.使用嚮導添加spring2.5的組件;
struts.properties --指定有Struts2的action由spring容器管理
web.xml --指定spring容器配置文件
globalMessages.properties --非必須有
struts.xml --class屬性配置改爲spring容器內bean的ID
applicationContext.xml --action的做用域須要是原型
****************************************************************************************************
****************************************************************************************************
spring是一個集成了許多第三方框架的大雜燴,其核心技術是IOC(控制反轉,也稱依賴注入)和AOP(面向切面編程)
****************************************************************************************************
1.Spring實現了工廠模式的工廠類(在這裏有必要解釋清楚什麼是工廠模式),這個類名爲BeanFactory(其實是一個接口),在程序中一般BeanFactory的子類ApplicationContext。Spring至關於一個大的工廠類,在其配置文件中經過<bean>元素配置用於建立實例對象的類名和實例對象的屬性。
2.Spring提供了對IOC(控制反轉)良好支持,IOC是一種編程思想,是一種架構藝術,利用這種思想能夠很好地實現模塊之間的解耦。IOC也稱爲DI(Depency Injection),什麼叫依賴注入呢?
譬如,Class Programmer
{
Computercomputer = null;
publicvoid code()
{
//Computercomputer = new IBMComputer();
//Computercomputer = beanfacotry.getComputer();
computer.write();
}
publicvoid setComputer(Computer computer)
{
this.computer= computer;
}
}
另外兩種方式都由依賴,第一個直接依賴於目標類,第二個把依賴轉移到工廠上,第三個完全與目標和工廠解耦了。在spring的配置文件中配置片斷以下:
<beanid=」computer」 class=」cn.itcast.interview.Computer」>
</bean>
<beanid=」programmer」 class=」cn.itcast.interview.Programmer」>
<propertyname=」computer」 ref=」computer」></property>
</bean>
3. Spring提供了對AOP技術的良好封裝, AOP稱爲面向切面編程,就是系統中有不少各不相干的類的方法,在這些衆多方法中要加入某種系統功能的代碼,例如,加入日誌,加入權限判斷,加入異常處理,這種應用稱爲AOP。實現AOP功能採用的是代理技術,客戶端程序再也不調用目標,而調用代理類,代理類與目標類對外具備相同的方法聲明,有兩種方式能夠實現相同的方法聲明,一是實現相同的接口,二是做爲目標的子類在,JDK中採用Proxy類產生動態代理的方式爲某個接口生成實現類,若是要爲某個類生成子類,則能夠用CGLI B。在生成的代理類的方法中加入系統功能和調用目標類的相應方法,系統功能的代理以Advice對象進行提供,顯然要建立出代理對象,至少須要目標類和Advice類。spring提供了這種支持,只須要在spring配置文件中配置這兩個元素便可實現代理和aop功能
請求的分發
請求首先到達DispatcherServlet,應用服務器會根據Web應用中web.xml文件定義的url映射將相應的請求分發到DispatcherServlet中
請求的處理
DispatcherServlet會查找相應的HandlerMapping接口的實現類,調用其中的方法:HandlerExecutionChaingetHandler(HttpServletRequest request) throws Exception,該方法會返回一個HandlerExecutionChain。返回的HandlerExecutionChain中包含了零個或者是多個Interceptor和一個處理請求的Handler。DispatcherServlet會調用Interceptor中的preHandle() 方法。而後處理Handler,這個Handler至關於Struts中Action,在SpringMVC中默認的實現是Controller接口,是具體處理請求的代碼所駐留的地方。事實上HandlerExecutionChain中的getHandler()返回的是一個Object類型。DispatcherServlet不會直接調用getHandler()返回對象中的方法,DispatcherServlet會查找相應的HandlerAdapter,而後具體經過HandlerAdapter來調用getHandler()返回的handler對象中的方法。就是說咱們能夠實現本身的HandlerAdapter而後經過IoC注入到DispatcherServlet中,從而能夠實現一套自定義的控制器。隨後DispatcherServlet會調用Interceptor中的postHandle()方法。
答:beanfactory(容器),applicationContext(應用上下文)
答:AOP是面向方面,至關於攔截器,能夠在須要的地方插入邏輯,所謂的面向方面就是把相同的功能抽象出來,
****************************************************************************************************
1.通知(Advice):
通知定義了切面是什麼以及什麼時候使用。描述了切面要完成的工做和什麼時候須要執行這個工做。
2.鏈接點(Joinpoint):
程序可以應用通知的一個「時機」,這些「時機」就是鏈接點,例如方法被調用時、異常被拋出時等等。
3.切入點(Pointcut)
通知定義了切面要發生的「故事」和時間,那麼切入點就定義了「故事」發生的地點,例如某個類或方法的名稱,Spring中容許咱們方便的用正則表達式來指定
4.切面(Aspect)
通知和切入點共同組成了切面:時間、地點和要發生的「故事」
5.引入(Introduction)
引入容許咱們向現有的類添加新的方法和屬性(Spring提供了一個方法注入的功能)
6.目標(Target)
即被通知的對象,若是沒有AOP,那麼它的邏輯將要交叉別的事務邏輯,有了AOP以後它能夠只關注本身要作的事(AOP讓他作愛作的事)
7.代理(proxy)
應用通知的對象,詳細內容參見設計模式裏面的代理模式
8.織入(Weaving)
把切面應用到目標對象來建立新的代理對象的過程,織入通常發生在以下幾個時機:
(1)編譯時:當一個類文件被編譯時進行織入,這須要特殊的編譯器才能夠作的到,例如AspectJ的織入編譯器
(2)類加載時:使用特殊的ClassLoader在目標類被加載到程序以前加強類的字節代碼
(3)運行時:切面在運行的某個時刻被織入,SpringAOP就是以這種方式織入切面的,原理應該是使用了JDK的動態代理技術
****************************************************************************************************
答:有setter注入(即類中設置一個全局屬性,並對屬性有setter方法,以供容器注入),接口注入和 構造器注入
依賴注入是Spring IOC的主要做用,依賴就是指屬性,意思就是說將屬性利用Spring注入到程序中,而非new。
< bean id="message" class="message所在類的路徑名">
<property name="message" value="Hello"$amp;>amp;$lt;/property>
< /bean>
答: 有兩種方式:基於XML配置文件的方式;另外一個是在業務方法上進行@Transactional註解,將事務規則應用到業務邏輯中。
****************************************************************************************************
答:singleton(單例) ,prototype(原型) ,request,session,globalsession
****************************************************************************************************
原理: 1.讀取並解析配置文件 2.讀取並解析映射信息,建立SessionFactory 3.打開Session 4.建立事務Transation 5.持久化操做 6.提交事務 7.關閉Session 8.關閉SesstionFactory
爲何要用: 1. 對JDBC訪問數據庫的代碼作了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。 2. hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM(對象關係映射)實現。他很大程度的簡化DAO層的編碼工做 3. hibernate使用Java反射機制,而不是字節碼加強程序來實現透明性。 4. hibernate的性能很是好,由於它是個輕量級框架。映射的靈活性很出色。它支持各類關係數據庫,從一對一到多對多的各類複雜關係。
.使用Hibernate時,先要配置hibernate.cfg.xml文件,其中配置數據庫鏈接信息和方言等,還要爲每一個實體配置相應的hbm.xml文件,hibernate.cfg.xml文件中須要登記每一個hbm.xml文件。
配置Configuration對象、產生SessionFactory、建立session對象,啓動事務,完成CRUD操做,提交事務,關閉session。
答:sql是關係數據庫查詢語言,面對的數據庫;而hql是Hibernate這樣的數據庫持久化框架提供的內置查詢語言,雖然他們的目的都是爲了從數據庫查詢須要的數據,但sql操做的是數據庫表和字段,而做爲面向對象的hql操做的則是持久化類及其屬性,
****************************************************************************************************
答:Hibernate三種狀態的區分,以及save,update,saveOrUpdHibernate的對象有3種狀態,
分別爲:瞬時態(Transient)、持久態(Persistent)、脫管態(Detached)。
1.瞬時對象在內存孤立存在,它是攜帶信息的載體,不和數據庫的數據有任何關聯關係,在Hibernate中,可經過session的save()或saveOrUpdate()方法將瞬時對象與數據庫相關聯,並將數據對應的插入數據庫中,此時該瞬時對象轉變成持久化對象。
2.持久對象具備以下特色: 1. 和session實例關聯; 2. 在數據庫中有與之關聯的記錄。 3. 比瞬時對象多了一個數據庫記錄標識值。
3.託管態,也叫遊離態等,持久化對象脫離了Session的對象。如Session緩存被清空的對象。特色:已經持久化,但不在Session緩存中。處於此狀態的對象叫遊離對象。
****************************************************************************************************
答:延遲加載機制是爲了不一些無謂的性能開銷而提出來的,所謂延遲加載就是當在真正須要數據的時候,才真正執行數據加載操做。在Hibernate中提供了對實體對象的延遲加載以及對集合的延遲加載,另外在Hibernate3中還提供了對屬性的延遲加載。
解決方案一,按照Object[]數據取出數據,而後本身組bean
解決方案二,對每一個表的bean寫構造函數,好比表一要查出field1,field2兩個字段,那麼有一個構造函數就是Bean(type1filed1,type2
field2),而後在hql裏面就能夠直接生成這個bean了。
第一個:查詢出來的list 轉換爲一個數組
也就是說 Object[] objects=(Object[]) list -- 你查詢出來的list 集合
for(object item :objects ){}進行自行封裝處理
第二個說白了就是寫個構造函數讓他本身封裝省了本身處理過程了
可是若是是查詢出來的多張表數據 仍是得按第一種方式本身處理的。。。
(1)緩存就是把之前從數據庫中查詢出來和使用過的對象保存在內存中(一個數據結構中),這個數據結構一般是或相似Hashmap,當之後要使用某個對象時,先查詢緩存中是否有這個對象,若是有則使用緩存中的對象,若是沒有則去查詢數據庫,並將查詢出來的對象保存在緩存中,以便下次使用。
(2)Hibernate的Session就是一種緩存,咱們一般將之稱爲Hibernate的一級緩存,當想使用session從數據庫中查詢出一個對象時,Session也是先從本身內部查看是否存在這個對象,存在則直接返回,不存在纔去訪問數據庫,並將查詢的結果保存在本身內部。因爲Session表明一次會話過程,一個Session與一個數據庫鏈接相關連,因此Session最好不要長時間保持打開,一般僅用於一個事務當中,在事務結束時就應關閉。而且Session是線程不安全的,被多個線程共享時容易出現問題。一般只有那種全局意義上的緩存纔是真正的緩存應用,纔有較大的緩存價值,所以,Hibernate的Session這一級緩存的緩存做用並不明顯,應用價值不大。Hibernate的二級緩存就是要爲Hibernate配置一種全局緩存,讓多個線程和多個事務均可以共享這個緩存。咱們但願的是一我的使用過,其餘人也可使用,session沒有這種效果。
(3)二級緩存是獨立於Hibernate的軟件部件,屬於第三方的產品,多個廠商和組織都提供有緩存產品,例如,EHCache和OSCache等等。在Hibernate中使用二級緩存,首先就要在hibernate.cfg.xml配置文件中配置使用哪一個廠家的緩存產品,接着須要配置該緩存產品本身的配置文件,最後要配置Hibernate中的哪些實體對象要歸入到二級緩存的管理中。明白了二級緩存原理和有了這個思路後,很容易配置起Hibernate的二級緩存。擴展知識:一個SessionFactory能夠關聯一個二級緩存,也即一個二級緩存只能負責緩存一個數據庫中的數據,當使用Hibernate的二級緩存後,注意不要有其餘的應用或SessionFactory來更改當前數據庫中的數據,這樣緩存的數據就會與數據庫中的實際數據不一致。
Hibernate就是封裝了JDBC,他能夠寫一條hql語句,能夠再不一樣數據庫中使用,不用修改hql語句,可是關聯查詢效率低。 JDBC是基礎的連接數據庫的框架,效率高,可是mysql、oracle、sql service等不一樣的數據庫要寫不一樣的sql語句。 one to many好比Class和Student吧就是一個班級對應多個學生 在Class類中追加集合屬性 Set<Student> students; 在Class的配置文件中追加(Class.hbm.xml) <!-- 追加集合屬性的配置 --> <!-- 設置集合屬性 --> <set name="students" lazy="false" fetch="join" cascade="all" inverse="true"> <!-- 設置關聯字段 --> <key column="classId" /> <!-- 設置關聯關係 --> <one-to-many class="Studnet" /> </set> 將Studnet中的classId屬性去掉換成 Class class; 在Student的配置文件中(Student.hbm.xml) <many-to-one name="class" column="classId" lazy="false" fetch="join" class="Class"> </many-to-one>
struts 在 SSH 框架中起控制的做用 , 其核心是 (控制器)Controller, 即ActionServlet, 而 ActionServlet 的核心就是 Struts-config.xml. 主要控制邏輯關係的處理 . hibernate 是數據持久化層 , 是一種新的對象、關係的映射工具 , 提供了從 Java 類到數據表的映射,也提供了數據查詢和恢復等機制 , 大大減小數據訪問的複雜度。把對數據庫的直接操做 , 轉換爲對持久對象的操做 .
spring 是一個輕量級的控制反轉 (IoC) 和麪向切面 (AOP) 的容器框架 , 面向接口的編程 , 由容器控制程序之間的(依賴)關係,而非傳統實現中,由程序代碼直接操控。這也就是所謂「 控制反轉 」 的概念所在:(依賴)控制權由應用代碼中轉到了外部容器,控制權的轉移,是所謂反轉。依賴注入,即組件之間的依賴關係由容器在運行期決定,形象的來講,即由容器動態的將某種依賴關係注入到組件之中 起到的主要做用是解耦
****************************************************************************************************
把hibernate的配置寫到spring的配置中,用spring管理和調用hibernate的工廠和session等。
struts的話,一般有2中。一種是用spring中的一個工廠類代替struts的工廠類去生成action,而且用spring管理。 另外一種是,struts 用本身的工廠生成action,可是由spring管理。這樣耦合低一些。
大概就是這樣,hibernate負責它最擅長的數據庫管理。 struts頁面的請求處理調用相應的底層數據庫等。spring負責管理他們兩個。
****************************************************************************************************
整合SSH的三種方法
方法一:直接得到ApplicationContext對象
這種方法經過spring獲取與Hibernate相關聯的對象。
關鍵是在Action類中得到ApplicationContext對象,而後經過getBean方法得到JavaBean對象。
(1)在hibernate.cfg.xml文件中配置session-factory
<session-factory>
<property name="connection.url">
jdbc:MySQL://localhost/test?characterEncoding=UTF8
</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<propertyname="connection.username">root</property>
<propertyname="connection.password">123</property>
<property name="show_sql">true</property>
<propertyname="hibernate.hbm2ddl.auto">update</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!—數據庫的實體類映射文件-->
<mapping resource="User.hbm.xml" />
</session-factory>
(2)在applicationContext.xml文件中對hibernate相關聯的對象使用依賴注入,使用Spring的HibernateTemplate類來對Hibernate的Session進行操做
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation"value="classpath:hibernate.cfg.xml">
</property>
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory"ref="sessionFactory" />
</bean>
<!-- 事務攔截器bean須要依賴注入一個事務管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<!-- 設置事務傳播特性,對應於AOP中的 <tx:advice /> -->
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<propkey="get*">PROPAGATION_REQUIRED, readOnly
</prop>
<propkey="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- 定義BeanNameAutoProxyCreator,配置哪些類和哪些方法使用事務對應於AOP中的 <aop:pointcut/> -->
<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!-- 指定對知足哪些bean name的bean自動生成業務代理 -->
<property name="beanNames">
<!-- 下面是全部須要自動建立事務代理的bean-->
<list>
<value>userDAO</value>
</list>
<!-- 此處可增長其餘須要自動建立事務代理的bean-->
</property>
<property name="interceptorNames">
<!-- 下面定義BeanNameAutoProxyCreator所需的事務攔截器-->
<list>
<value>transactionInterceptor</value>
<!-- 此處可增長其餘新的Interceptor-->
</list>
</property>
</bean>
<!--配置數據訪問層對象-->
<bean id="userDAO"class="com.dao.UserDAOImpl">
<constructor-arg>
<ref bean="hibernateTemplate" />
</constructor-arg>
</bean>
<!--配置業務邏輯層對象-->
<bean id="userService"class="com.service.UserServiceImpl">
<constructor-arg>
<ref bean="userDAO" />
</constructor-arg>
</bean>
(3)配置struts.xml文件
<action name="loginAction"class="com.test.LoginAction">
<result name="result">/WEB-INF/result.jsp
</result>
</action>
(4)在Action中獲取userService並使用
ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
UserService userService = (UserServiceImpl) applicationContext.getBean("userService");
userService.addUser(user);
第一種方法的缺點:將Action類魚Spring的裝配JavaBean綁定的過緊,增長了其耦合度,不適合裝配文件有變化的狀況。
方法二:由Spring建立Action類的對象
在方法一的基礎之上須要作以下幾步修改
(1)在Action方法中增長setUserService的方法,把UserService交給spring處理
private UserService userService;
public void setUserService(UserServiceuserService) {
this.userService = userService;
}
(2)在application.xml文件中對action進行配置
<bean id=」loginAction」class=」com.test.LoginAction」 scope=」prototype」>
<property name=」 userService」>
<ref bean=」 userService」>
</property>
</bean>
(3)在struts.xml文件中配置action
<action name=」LoginAction」class=」loginAction」/>
<!—注意這裏class指向的是上面配置的bean對象-->
第二種方法的缺點:雖然使用了Spring的IOC特性,對Action和ApplicationContext對象進行了解耦,但配置一個Action須要同時維護兩份文件:struts.xml和application.xml,比較難維護。
方法三:直接使用Spring的自動裝配JavaBean的特性進行整合
在方法一的配置基礎上進行以下修改
(1)編寫UserAction類,在UserAction中添加setUserService方法,讓spring自動裝配
private UserService userService;
public void setUserService(UserServiceuserService) {
this.userService = userService;
}
(2)直接在Struts中配置LoginAction
<action name=」LoginAction」class=」com.test.LoginAction」/>
因爲已經在application.xml文件中裝配了userService屬性,這樣spring就能夠自動裝配LoginAction中的UserService了。
*****************************************************************************************************************************
總共23種,分爲三大類:建立型,結構型,行爲型
我只記得其中經常使用的六、7種,分別是:
建立型(工廠、工廠方法、抽象工廠、單例)
結構型(包裝、適配器,組合,代理)
行爲(觀察者,模版,策略)
而後再針對你熟悉的模式談談你的理解便可。
工廠模式是一種常常被使用到的模式,根據工廠模式實現的類能夠根據提供的數據生成一組類中某一個類的實例,一般這一組類有一個公共的抽象父類而且實現了相同的方法,可是這些方法針對不一樣的數據進行了不一樣的操做。首先須要定義一個基類,該類的子類經過不一樣的方法實現了基類中的方法。而後須要定義一個工廠類,工廠類能夠根據條件生成不一樣的子類實例。當獲得子類的實例後,開發人員能夠調用基類中的方法而沒必要考慮到底返回的是哪個子類的實例。
在它的核心結構中只包含一個被稱爲單例類的特殊類。經過單例模式能夠保證系統中一個類只有一個實例並且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。若是但願在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。