SSH三大框架的知识题
Struts
談談你對Struts的理解。
答:
1.struts是一個按MVC模式設計的Web層框架,其實它就是一個大大的servlet,這個Servlet名為ActionServlet,或是ActionServlet的子類。我們可以在web.xml文件中將符合某種特征的所有請求交給這個Servlet處理,這個Servlet再參照一個配置文件(通常為/WEB-INF/struts-config.xml)將各個請求分別分配給不同的action去處理。
一個擴展知識點:struts的配置文件可以有多個,可以按模塊配置各自的配置文件,這樣可以防止配置文件的過度膨脹;
2.ActionServlet把請求交給action去處理之前,會將請求參數封裝成一個formbean對象(就是一個Java類,這個類中的每個屬性對應一個請求參數),封裝成一個什么樣的formbean對象呢?看配置文件。
3.要說明的是, ActionServlet把formbean對象傳遞給action的execute方法之前,可能會調用formbean的validate方法進行校驗,只有校驗通過后才將這個formbean對象傳遞給action的execute方法,否則,它將返回一個錯誤頁面,這個錯誤頁面由input屬性指定,(看配置文件)作者為什么將這里命名為input屬性,而不是error屬性,我們后面結合實際的運行效果進行分析。
4.action執行完后要返回顯示的結果視圖,這個結果視圖是用一個ActionForward對象來表示的,actionforward對象通過struts-config.xml配置文件中的配置關聯到某個jsp頁面,因為程序中使用的是在struts-config.xml配置文件為jsp頁面設置的邏輯名,這樣可以實現action程序代碼與返回的jsp頁面名稱的解耦。
?
?||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
自己的話簡介Struts2執行流程
Struts 2的工作流程與WebWork框架基本相同,所以說Struts2是WebWork的升級版本。
基本簡要流程如下:1、客戶端瀏覽器發出HTTP請求。2、根據web.xml配置,該請求被FilterDispatcher接收。3、根據struts.xml配置,找到需要調用的Action類和方法,并通過IoC方式,將值注入給Aciton。4、Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。5、Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,并跳轉到相應頁面。6、返回HTTP響應到客戶端瀏覽器。
****************************************************************************************************
?
Struts2的工作機制
?一個請求在Struts2框架中的處理大概分為以下幾個步驟:
1、客戶端初始化一個指向Servlet容器(例如Tomcat)的請求;
2、這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin);
3、接著FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請求是否需要調用某個Action;
4、如果ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy;
5、ActionProxy通過ConfigurationManager詢問框架的配置文件,找到需要調用的Action類;
6、ActionProxy創建一個ActionInvocation的實例。
7、ActionInvocation實例使用命名模式來調用,在調用Action的過程前后,涉及到相關攔截器(Intercepter)的調用。
8、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2框架中繼承的標簽。在這個過程中需要涉及到ActionMapper。
****************************************************************************************************
Struts2的體系結構
Struts 2框架本身大致可以分為3個部分:核心控制器FilterDispatcher、業務控制器Action和用戶實現的企業業務邏輯組件。核心控制器 FilterDispatcher是Struts 2框架的基礎,包含了框架內部的控制流程和處理機制。業務控制器Action和業務邏輯組件是需要用戶來自己實現的。用戶在開發Action和業務邏輯組件的同時,還需要編寫相關的配置文件,供核心控制器FilterDispatcher來使用。
?
Struts2的體系與Struts1體系的差別非常大,因為Struts2使用了WebWork的設計核心,而不是Struts1的設計核心。Struts2中大量使用攔截器來處理用戶的請求,從而允許用戶的業務邏輯控制器與Servlet API分離。
Struts2框架的大概處理流程如下:
1、加載類(FilterDispatcher)
2、讀取配置(struts配置文件中的Action)
? 3、派發請求(客戶端發送請求)
4、調用Action(FilterDispatcher從struts配置文件中讀取與之相對應的Action)
5、啟用攔截器(WebWork攔截器鏈自動對請求應用通用功能,如驗證)
6、處理業務(回調Action的execute()方法)
7、返回響應(通過execute方法將信息返回到FilterDispatcher)
8、查找響應(FilterDispatcher根據配置查找響應的是什么信息如:SUCCESS、ERROR,將跳轉到哪個jsp頁面)
?? 9、響應用戶(jsp--->客戶瀏覽器端顯示)
? 10、struts2標簽庫(相比struts1的標簽庫,struts2是大大加強了,對數據的操作功能很強大)
?
****************************************************************************************************
在Struts2中怎樣把請求分發給方法去處理?
?答:在struts.xml中就只需要配置一個action,在一個Action類中分發Action請求調用不同的方法。
****************************************************************************************************
介紹一下Struts的ActionServlet類
?
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實例。
?
Struts2中常見的攔截器有哪些?
?答:上傳,重復提交,數字轉換,表單認證,國際化,等等
****************************************************************************************************
請簡述Struts2中自定義攔截器的步驟?
答:1.首先要實現Interceptor(攔截器)接口? 2.在配置文件中定義自己的攔截器。? 3.最后還要把系統提供的默認攔截器加上,否則系統默認攔截器不起作用
****************************************************************************************************
怎樣實現Struts2自定義轉換器??
答:實現TypeCoverter接口,或者繼承DefaultTypeConverter實現類(該類實現了TypeCoverter接口),通過繼承該實現類來實現自己的類型轉換器。重寫convertValue方法即可。
?
說說struts1與struts2的區別。
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視圖可以接受參數。
?
Struts2怎樣整合spring?
?答: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
****************************************************************************************************
spring是什么?
spring是一個集成了許多第三方框架的大雜燴,其核心技術是IOC(控制反轉,也稱依賴注入)和AOP(面向切面編程)
****************************************************************************************************
你對Spring的理解。
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功能
?
Spring流程
請求的分發
請求首先到達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()方法。
?
Spring容器基本的接口是什么?
答:beanfactory(容器),applicationContext(應用上下文)
什么是Spring的AOP,它的功能是什么??
答:AOP是面向方面,相當于攔截器,可以在需要的地方插入邏輯,所謂的面向方面就是把相同的功能抽象出來,
****************************************************************************************************
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的動態代理技術
****************************************************************************************************
請闡述Spring的IOC,有幾種類型。?
答:有setter注入(即類中設置一個全局屬性,并對屬性有setter方法,以供容器注入),接口注入和 構造器注入
Spring 的依賴注入是什么意思? 給一個 Bean 的 message 屬性, 字符串類型, 注入值為 "Hello" 的 XML 配置文件該怎么寫?
?
依賴注入是Spring?IOC的主要作用,依賴就是指屬性,意思就是說將屬性利用Spring注入到程序中,而非new。
<bean?id="message"?class="message所在類的路徑名">
???<property?name="message"?value="Hello"$amp;>amp;$lt;/property>
</bean>
Spring管理事務有哪幾種方式?? ??
答: 有兩種方式:基于XML配置文件的方式;另一個是在業務方法上進行@Transactional注解,將事務規則應用到業務邏輯中。
****************************************************************************************************
Spring的作用域有哪些??
答:singleton(單例) ,prototype(原型) ,request,session,globalsession
Hibernate
****************************************************************************************************
Hibernate工作原理流程?
原理: 1.讀取并解析配置文件 2.讀取并解析映射信息,創建SessionFactory 3.打開Session 4.創建事務Transation 5.持久化操作 6.提交事務 7.關閉Session 8.關閉SesstionFactory
為什么要用Hibernate
為什么要用: 1. 對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼。 2.hibernate是一個基于JDBC的主流持久化框架,是一個優秀的ORM(對象關系映射)實現。他很大程度的簡化DAO層的編碼工作 3. hibernate使用Java反射機制,而不是字節碼增強程序來實現透明性。 4. hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關系數據庫,從一對一到多對多的各種復雜關系。
使用Hibernate之前要配置什么
.使用Hibernate時,先要配置hibernate.cfg.xml文件,其中配置數據庫連接信息和方言等,還要為每個實體配置相應的hbm.xml文件,hibernate.cfg.xml文件中需要登記每個hbm.xml文件。
?
使用Hibernate的基本流程是:
配置Configuration對象、產生SessionFactory、創建session對象,啟動事務,完成CRUD操作,提交事務,關閉session。
相對于SQL,HQL查詢語言有什么特點,什么是方言??
答:sql是關系數據庫查詢語言,面對的數據庫;而hql是Hibernate這樣的數據庫持久化框架提供的內置查詢語言,雖然他們的目的都是為了從數據庫查詢需要的數據,但sql操作的是數據庫表和字段,而作為面向對象的hql操作的則是持久化類及其屬性,
****************************************************************************************************
Hibernate架構,對象有三種狀態,分別是什么,怎樣區分??
答:Hibernate三種狀態的區分,以及save,update,saveOrUpdHibernate的對象有3種狀態,
分別為:瞬時態(Transient)、持久態(Persistent)、脫管態(Detached)。
1.瞬時對象在內存孤立存在,它是攜帶信息的載體,不和數據庫的數據有任何關聯關系,在Hibernate中,可通過session的save()或saveOrUpdate()方法將瞬時對象與數據庫相關聯,并將數據對應的插入數據庫中,此時該瞬時對象轉變成持久化對象。?
2.持久對象具有如下特點: 1. 和session實例關聯; 2. 在數據庫中有與之關聯的記錄。 3. 比瞬時對象多了一個數據庫記錄標識值。
3.托管態,也叫游離態等,持久化對象脫離了Session的對象。如Session緩存被清空的對象。特點:已經持久化,但不在Session緩存中。處于此狀態的對象叫游離對象。
****************************************************************************************************
Hibernate中什么是延遲加載,延遲的作用是什么??
答:延遲加載機制是為了避免一些無謂的性能開銷而提出來的,所謂延遲加載就是當在真正需要數據的時候,才真正執行數據加載操作。在Hibernate中提供了對實體對象的延遲加載以及對集合的延遲加載,另外在Hibernate3中還提供了對屬性的延遲加載。
?
hibernate進行多表查詢每個表中各取幾個字段,也就是說查詢出來的結果集沒有一個實體類與之對應如何解決;
解決方案一,按照Object[]數據取出數據,然后自己組bean
解決方案二,對每個表的bean寫構造函數,比如表一要查出field1,field2兩個字段,那么有一個構造函數就是Bean(type1filed1,type2
field2),然后在hql里面就可以直接生成這個bean了。
?
第一個:查詢出來的list?轉換為一個數組???
也就是說?Object[]? objects=(Object[]) list??? --??你查詢出來的list?集合
for(object? item :objects? ){}進行自行封裝處理?
第二個說白了就是寫個構造函數讓他自己封裝省了自己處理過程了?
但是如果是查詢出來的多張表數據??還是得按第一種方式自己處理的。。。
介紹一下Hibernate的二級緩存
(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 的優缺點? 如何書寫一個 one to many 配置文件.
? 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) 的容器框架 , 面向接口的編程 , 由容器控制程序之間的(依賴)關系,而非傳統實現中,由程序代碼直接操控。這也就是所謂“ 控制反轉 ” 的概念所在:(依賴)控制權由應用代碼中轉到了外部容器,控制權的轉移,是所謂反轉。依賴注入,即組件之間的依賴關系由容器在運行期決定,形象的來說,即由容器動態的將某種依賴關系注入到組件之中? 起到的主要作用是解耦
****************************************************************************************************
整合SSH
?
把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了。
?
*****************************************************************************************************************************
其他
j2ee常用的設計模式?說明工廠模式。
總共23種,分為三大類:創建型,結構型,行為型
我只記得其中常用的6、7種,分別是:
創建型(工廠、工廠方法、抽象工廠、單例)
結構型(包裝、適配器,組合,代理)
行為(觀察者,模版,策略)
然后再針對你熟悉的模式談談你的理解即可。
工廠模式:
工廠模式是一種經常被使用到的模式,根據工廠模式實現的類可以根據提供的數據生成一組類中某一個類的實例,通常這一組類有一個公共的抽象父類并且實現了相同的方法,但是這些方法針對不同的數據進行了不同的操作。首先需要定義一個基類,該類的子類通過不同的方法實現了基類中的方法。然后需要定義一個工廠類,工廠類可以根據條件生成不同的子類實例。當得到子類的實例后,開發人員可以調用基類中的方法而不必考慮到底返回的是哪一個子類的實例。
單例模式
在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易于外界訪問,從而方便對實例個數的控制并節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。
轉載于:https://www.cnblogs.com/w-wfy/p/6416654.html
總結
以上是生活随笔為你收集整理的SSH三大框架的知识题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超炫jQuery测试答题功能
- 下一篇: Elasticsearch 安装配置 外