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"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://blog.csdn.net/jiangjunshow