SSH三大框架的知识题
Struts
談?wù)勀銓?duì)Struts的理解。
答:
1.struts是一個(gè)按MVC模式設(shè)計(jì)的Web層框架,其實(shí)它就是一個(gè)大大的servlet,這個(gè)Servlet名為ActionServlet,或是ActionServlet的子類。我們可以在web.xml文件中將符合某種特征的所有請(qǐng)求交給這個(gè)Servlet處理,這個(gè)Servlet再參照一個(gè)配置文件(通常為/WEB-INF/struts-config.xml)將各個(gè)請(qǐng)求分別分配給不同的action去處理。
一個(gè)擴(kuò)展知識(shí)點(diǎn):struts的配置文件可以有多個(gè),可以按模塊配置各自的配置文件,這樣可以防止配置文件的過度膨脹;
2.ActionServlet把請(qǐng)求交給action去處理之前,會(huì)將請(qǐng)求參數(shù)封裝成一個(gè)formbean對(duì)象(就是一個(gè)Java類,這個(gè)類中的每個(gè)屬性對(duì)應(yīng)一個(gè)請(qǐng)求參數(shù)),封裝成一個(gè)什么樣的formbean對(duì)象呢?看配置文件。
3.要說明的是, ActionServlet把formbean對(duì)象傳遞給action的execute方法之前,可能會(huì)調(diào)用formbean的validate方法進(jìn)行校驗(yàn),只有校驗(yàn)通過后才將這個(gè)formbean對(duì)象傳遞給action的execute方法,否則,它將返回一個(gè)錯(cuò)誤頁(yè)面,這個(gè)錯(cuò)誤頁(yè)面由input屬性指定,(看配置文件)作者為什么將這里命名為input屬性,而不是error屬性,我們后面結(jié)合實(shí)際的運(yùn)行效果進(jìn)行分析。
4.action執(zhí)行完后要返回顯示的結(jié)果視圖,這個(gè)結(jié)果視圖是用一個(gè)ActionForward對(duì)象來(lái)表示的,actionforward對(duì)象通過struts-config.xml配置文件中的配置關(guān)聯(lián)到某個(gè)jsp頁(yè)面,因?yàn)槌绦蛑惺褂玫氖窃趕truts-config.xml配置文件為jsp頁(yè)面設(shè)置的邏輯名,這樣可以實(shí)現(xiàn)action程序代碼與返回的jsp頁(yè)面名稱的解耦。
?
?||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
自己的話簡(jiǎn)介Struts2執(zhí)行流程
Struts 2的工作流程與WebWork框架基本相同,所以說Struts2是WebWork的升級(jí)版本。
基本簡(jiǎn)要流程如下:1、客戶端瀏覽器發(fā)出HTTP請(qǐng)求。2、根據(jù)web.xml配置,該請(qǐng)求被FilterDispatcher接收。3、根據(jù)struts.xml配置,找到需要調(diào)用的Action類和方法,并通過IoC方式,將值注入給Aciton。4、Action調(diào)用業(yè)務(wù)邏輯組件處理業(yè)務(wù)邏輯,這一步包含表單驗(yàn)證。5、Action執(zhí)行完畢,根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果result,并跳轉(zhuǎn)到相應(yīng)頁(yè)面。6、返回HTTP響應(yīng)到客戶端瀏覽器。
****************************************************************************************************
?
Struts2的工作機(jī)制
?一個(gè)請(qǐng)求在Struts2框架中的處理大概分為以下幾個(gè)步驟:
1、客戶端初始化一個(gè)指向Servlet容器(例如Tomcat)的請(qǐng)求;
2、這個(gè)請(qǐng)求經(jīng)過一系列的過濾器(Filter)(這些過濾器中有一個(gè)叫做ActionContextCleanUp的可選過濾器,這個(gè)過濾器對(duì)于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin);
3、接著FilterDispatcher被調(diào)用,FilterDispatcher詢問ActionMapper來(lái)決定這個(gè)請(qǐng)求是否需要調(diào)用某個(gè)Action;
4、如果ActionMapper決定需要調(diào)用某個(gè)Action,FilterDispatcher把請(qǐng)求的處理交給ActionProxy;
5、ActionProxy通過ConfigurationManager詢問框架的配置文件,找到需要調(diào)用的Action類;
6、ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例。
7、ActionInvocation實(shí)例使用命名模式來(lái)調(diào)用,在調(diào)用Action的過程前后,涉及到相關(guān)攔截器(Intercepter)的調(diào)用。
8、一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果。返回結(jié)果通常是(但不總是,也可能是另外的一個(gè)Action鏈)一個(gè)需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2框架中繼承的標(biāo)簽。在這個(gè)過程中需要涉及到ActionMapper。
****************************************************************************************************
Struts2的體系結(jié)構(gòu)
Struts 2框架本身大致可以分為3個(gè)部分:核心控制器FilterDispatcher、業(yè)務(wù)控制器Action和用戶實(shí)現(xiàn)的企業(yè)業(yè)務(wù)邏輯組件。核心控制器 FilterDispatcher是Struts 2框架的基礎(chǔ),包含了框架內(nèi)部的控制流程和處理機(jī)制。業(yè)務(wù)控制器Action和業(yè)務(wù)邏輯組件是需要用戶來(lái)自己實(shí)現(xiàn)的。用戶在開發(fā)Action和業(yè)務(wù)邏輯組件的同時(shí),還需要編寫相關(guān)的配置文件,供核心控制器FilterDispatcher來(lái)使用。
?
Struts2的體系與Struts1體系的差別非常大,因?yàn)镾truts2使用了WebWork的設(shè)計(jì)核心,而不是Struts1的設(shè)計(jì)核心。Struts2中大量使用攔截器來(lái)處理用戶的請(qǐng)求,從而允許用戶的業(yè)務(wù)邏輯控制器與Servlet API分離。
Struts2框架的大概處理流程如下:
1、加載類(FilterDispatcher)
2、讀取配置(struts配置文件中的Action)
? 3、派發(fā)請(qǐng)求(客戶端發(fā)送請(qǐng)求)
4、調(diào)用Action(FilterDispatcher從struts配置文件中讀取與之相對(duì)應(yīng)的Action)
5、啟用攔截器(WebWork攔截器鏈自動(dòng)對(duì)請(qǐng)求應(yīng)用通用功能,如驗(yàn)證)
6、處理業(yè)務(wù)(回調(diào)Action的execute()方法)
7、返回響應(yīng)(通過execute方法將信息返回到FilterDispatcher)
8、查找響應(yīng)(FilterDispatcher根據(jù)配置查找響應(yīng)的是什么信息如:SUCCESS、ERROR,將跳轉(zhuǎn)到哪個(gè)jsp頁(yè)面)
?? 9、響應(yīng)用戶(jsp--->客戶瀏覽器端顯示)
? 10、struts2標(biāo)簽庫(kù)(相比struts1的標(biāo)簽庫(kù),struts2是大大加強(qiáng)了,對(duì)數(shù)據(jù)的操作功能很強(qiáng)大)
?
****************************************************************************************************
在Struts2中怎樣把請(qǐng)求分發(fā)給方法去處理?
?答:在struts.xml中就只需要配置一個(gè)action,在一個(gè)Action類中分發(fā)Action請(qǐng)求調(diào)用不同的方法。
****************************************************************************************************
介紹一下Struts的ActionServlet類
?
ActionServlet繼承自javax.servlet.http.HttpServlet類,其在Strutsframework中扮演的角色是中心控制器。它提供一個(gè)中心位置來(lái)處理全部的終端請(qǐng)求。控制器ActionServlet主要負(fù)責(zé)將HTTP的客戶請(qǐng)求信息組裝后,根據(jù)配置文件的指定描述,轉(zhuǎn)發(fā)到適當(dāng)?shù)奶幚砥鳌?br />按照Servelt的標(biāo)準(zhǔn),所有得Servlet必須在web配置文件(web.xml)聲明。同樣,ActoinServlet必須在WebApplication配置文件(web.xml)中描述,有關(guān)配置信息如下。
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
</servlet>
全部的請(qǐng)求URI以*.do的模式存在并映射到這個(gè)servlet,其配置如下:
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
一個(gè)該模式的請(qǐng)求URI符合如下格式:http://www.my_site_name.com/mycontext/actionName.do
當(dāng)用戶向服務(wù)器端提交請(qǐng)求的時(shí)候,實(shí)際上信息是首先發(fā)送到控制器ActionServlet,一旦控制器獲得了請(qǐng)求,其就會(huì)將請(qǐng)求信息傳交給一些輔助類(help classes)處理。這些輔助類知道如何去處理與請(qǐng)求信息所對(duì)應(yīng)的業(yè)務(wù)操作。在Struts中,這個(gè)輔助類就是org.apache.struts.action.Action。通常開發(fā)者需要自己繼承Aciton類,從而實(shí)現(xiàn)自己的Action實(shí)例。
?
Struts2中常見的攔截器有哪些?
?答:上傳,重復(fù)提交,數(shù)字轉(zhuǎn)換,表單認(rèn)證,國(guó)際化,等等
****************************************************************************************************
請(qǐng)簡(jiǎn)述Struts2中自定義攔截器的步驟?
答:1.首先要實(shí)現(xiàn)Interceptor(攔截器)接口? 2.在配置文件中定義自己的攔截器。? 3.最后還要把系統(tǒng)提供的默認(rèn)攔截器加上,否則系統(tǒng)默認(rèn)攔截器不起作用
****************************************************************************************************
怎樣實(shí)現(xiàn)Struts2自定義轉(zhuǎn)換器??
答:實(shí)現(xiàn)TypeCoverter接口,或者繼承DefaultTypeConverter實(shí)現(xiàn)類(該類實(shí)現(xiàn)了TypeCoverter接口),通過繼承該實(shí)現(xiàn)類來(lái)實(shí)現(xiàn)自己的類型轉(zhuǎn)換器。重寫convertValue方法即可。
?
說說struts1與struts2的區(qū)別。
1.都是MVC的WEB框架,
2struts1的老牌框架,應(yīng)用很廣泛,有很好的群眾基礎(chǔ),使用它開發(fā)風(fēng)險(xiǎn)很小,成本更低!struts2雖然基于這個(gè)框架,但是應(yīng)用群眾并多,相對(duì)不成熟,未知的風(fēng)險(xiǎn)和變化很多,開發(fā)人員相對(duì)不好招,使用它開發(fā)項(xiàng)目的風(fēng)險(xiǎn)系數(shù)更大,用人成本更高!
3.struts2畢竟是站在前輩的基礎(chǔ)設(shè)計(jì)出來(lái),它會(huì)改善和完善struts1中的一些缺陷,struts1中一些懸而未決問題在struts2得到了解決。
4.struts1的前端控制器是一個(gè)Servlet,名稱為ActionServlet,struts2的前端控制器是一個(gè)filter,在struts2.0中叫FilterDispatcher,在struts2.1中叫StrutsPrepareAndExecuteFilter。
5.struts1的action需要繼承Action類,struts2的action可以不繼承任何類;struts1對(duì)同一個(gè)路徑的所有請(qǐng)求共享一個(gè)Action實(shí)例,struts2對(duì)同一個(gè)路徑的每個(gè)請(qǐng)求分別使用一個(gè)獨(dú)立Action實(shí)例對(duì)象,所有對(duì)于struts2的Action不用考慮線程安全問題。
6.在struts1中使用formbean封裝請(qǐng)求參數(shù),在struts2中直接使用action的屬性來(lái)封裝請(qǐng)求參數(shù)。
7.struts1中的多個(gè)業(yè)務(wù)方法放在一個(gè)Action中時(shí)(即繼承DispatchAction時(shí)),要么都校驗(yàn),要么都不校驗(yàn);對(duì)于struts2,可以指定只對(duì)某個(gè)方法進(jìn)行校驗(yàn),當(dāng)一個(gè)Action繼承了ActionSupport且在這個(gè)類中只編寫了validateXxx()方法,那么則只對(duì)Xxx()方法進(jìn)行校驗(yàn)。
(一個(gè)請(qǐng)求來(lái)了的執(zhí)行流程進(jìn)行分析,struts2是自動(dòng)支持分模塊開發(fā),并可以不同模塊設(shè)置不同的url前綴,這是通過package的namespace來(lái)實(shí)現(xiàn)的;struts2是支持多種類型的視圖;struts2的視圖地址可以是動(dòng)態(tài)的,即視圖的名稱是支持變量方式的,舉例,論壇發(fā)帖失敗后回來(lái)還要傳遞boardid。視圖內(nèi)容顯示方面:它的標(biāo)簽用ognl,要el強(qiáng)大很多,在國(guó)際化方面支持分模塊管理,兩個(gè)模塊用到同樣的key,對(duì)應(yīng)不同的消息;)
與Struts1不同,Struts2對(duì)用戶的每一次請(qǐng)求都會(huì)創(chuàng)建一個(gè)Action,所以Struts2中的Action是線程安全的。
給我印象最深刻的是:struts配置文件中的redirect視圖的url不能接受參數(shù),而struts2配置文件中的redirect視圖可以接受參數(shù)。
?
Struts2怎樣整合spring?
?答:1.使用向?qū)砑觭truts2的組件;
????2.使用向?qū)砑觭pring2.5的組件;???
?????????????????????????????????????????????? struts.properties???????????? --指定有Struts2的action由spring容器管理
???????????????????????????????????? ??????? web.xml?????????????????????? --指定spring容器配置文件??
?????????????????????????????????????????????? globalMessages.properties???? --非必須有???
?????????????????????????????????????????????? struts.xml??????????????????? --class屬性配置改成spring容器內(nèi)bean的ID
???????????????????????????????????????????? applicationContext.xml??????? --action的作用域需要是原型
****************************************************************************************************
Spring
****************************************************************************************************
spring是什么?
spring是一個(gè)集成了許多第三方框架的大雜燴,其核心技術(shù)是IOC(控制反轉(zhuǎn),也稱依賴注入)和AOP(面向切面編程)
****************************************************************************************************
你對(duì)Spring的理解。
1.Spring實(shí)現(xiàn)了工廠模式的工廠類(在這里有必要解釋清楚什么是工廠模式),這個(gè)類名為BeanFactory(實(shí)際上是一個(gè)接口),在程序中通常BeanFactory的子類ApplicationContext。Spring相當(dāng)于一個(gè)大的工廠類,在其配置文件中通過<bean>元素配置用于創(chuàng)建實(shí)例對(duì)象的類名和實(shí)例對(duì)象的屬性。
2.Spring提供了對(duì)IOC(控制反轉(zhuǎn))良好支持,IOC是一種編程思想,是一種架構(gòu)藝術(shù),利用這種思想可以很好地實(shí)現(xiàn)模塊之間的解耦。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;
}
}
另外兩種方式都由依賴,第一個(gè)直接依賴于目標(biāo)類,第二個(gè)把依賴轉(zhuǎn)移到工廠上,第三個(gè)徹底與目標(biāo)和工廠解耦了。在spring的配置文件中配置片段如下:
<beanid=”computer” class=”cn.itcast.interview.Computer”>
</bean>
<beanid=”programmer” class=”cn.itcast.interview.Programmer”>
<propertyname=”computer”? ref=”computer”></property>
</bean>
3. Spring提供了對(duì)AOP技術(shù)的良好封裝, AOP稱為面向切面編程,就是系統(tǒng)中有很多各不相干的類的方法,在這些眾多方法中要加入某種系統(tǒng)功能的代碼,例如,加入日志,加入權(quán)限判斷,加入異常處理,這種應(yīng)用稱為AOP。實(shí)現(xiàn)AOP功能采用的是代理技術(shù),客戶端程序不再調(diào)用目標(biāo),而調(diào)用代理類,代理類與目標(biāo)類對(duì)外具有相同的方法聲明,有兩種方式可以實(shí)現(xiàn)相同的方法聲明,一是實(shí)現(xiàn)相同的接口,二是作為目標(biāo)的子類在,JDK中采用Proxy類產(chǎn)生動(dòng)態(tài)代理的方式為某個(gè)接口生成實(shí)現(xiàn)類,如果要為某個(gè)類生成子類,則可以用CGLI B。在生成的代理類的方法中加入系統(tǒng)功能和調(diào)用目標(biāo)類的相應(yīng)方法,系統(tǒng)功能的代理以Advice對(duì)象進(jìn)行提供,顯然要?jiǎng)?chuàng)建出代理對(duì)象,至少需要目標(biāo)類和Advice類。spring提供了這種支持,只需要在spring配置文件中配置這兩個(gè)元素即可實(shí)現(xiàn)代理和aop功能
?
Spring流程
請(qǐng)求的分發(fā)
請(qǐng)求首先到達(dá)DispatcherServlet,應(yīng)用服務(wù)器會(huì)根據(jù)Web應(yīng)用中web.xml文件定義的url映射將相應(yīng)的請(qǐng)求分發(fā)到DispatcherServlet中
請(qǐng)求的處理
DispatcherServlet會(huì)查找相應(yīng)的HandlerMapping接口的實(shí)現(xiàn)類,調(diào)用其中的方法:HandlerExecutionChaingetHandler(HttpServletRequest request) throws Exception,該方法會(huì)返回一個(gè)HandlerExecutionChain。返回的HandlerExecutionChain中包含了零個(gè)或者是多個(gè)Interceptor和一個(gè)處理請(qǐng)求的Handler。DispatcherServlet會(huì)調(diào)用Interceptor中的preHandle()?方法。然后處理Handler,這個(gè)Handler相當(dāng)于Struts中Action,在SpringMVC中默認(rèn)的實(shí)現(xiàn)是Controller接口,是具體處理請(qǐng)求的代碼所駐留的地方。事實(shí)上HandlerExecutionChain中的getHandler()返回的是一個(gè)Object類型。DispatcherServlet不會(huì)直接調(diào)用getHandler()返回對(duì)象中的方法,DispatcherServlet會(huì)查找相應(yīng)的HandlerAdapter,然后具體通過HandlerAdapter來(lái)調(diào)用getHandler()返回的handler對(duì)象中的方法。就是說我們可以實(shí)現(xiàn)自己的HandlerAdapter然后通過IoC注入到DispatcherServlet中,從而可以實(shí)現(xiàn)一套自定義的控制器。隨后DispatcherServlet會(huì)調(diào)用Interceptor中的postHandle()方法。
?
Spring容器基本的接口是什么?
答:beanfactory(容器),applicationContext(應(yīng)用上下文)
什么是Spring的AOP,它的功能是什么??
答:AOP是面向方面,相當(dāng)于攔截器,可以在需要的地方插入邏輯,所謂的面向方面就是把相同的功能抽象出來(lái),
****************************************************************************************************
AOP中的術(shù)語(yǔ)
1.通知(Advice):
通知定義了切面是什么以及何時(shí)使用。描述了切面要完成的工作和何時(shí)需要執(zhí)行這個(gè)工作。
2.連接點(diǎn)(Joinpoint):
程序能夠應(yīng)用通知的一個(gè)“時(shí)機(jī)”,這些“時(shí)機(jī)”就是連接點(diǎn),例如方法被調(diào)用時(shí)、異常被拋出時(shí)等等。
3.切入點(diǎn)(Pointcut)
通知定義了切面要發(fā)生的“故事”和時(shí)間,那么切入點(diǎn)就定義了“故事”發(fā)生的地點(diǎn),例如某個(gè)類或方法的名稱,Spring中允許我們方便的用正則表達(dá)式來(lái)指定
4.切面(Aspect)
通知和切入點(diǎn)共同組成了切面:時(shí)間、地點(diǎn)和要發(fā)生的“故事”
5.引入(Introduction)
引入允許我們向現(xiàn)有的類添加新的方法和屬性(Spring提供了一個(gè)方法注入的功能)
6.目標(biāo)(Target)
即被通知的對(duì)象,如果沒有AOP,那么它的邏輯將要交叉別的事務(wù)邏輯,有了AOP之后它可以只關(guān)注自己要做的事(AOP讓他做愛做的事)
7.代理(proxy)
應(yīng)用通知的對(duì)象,詳細(xì)內(nèi)容參見設(shè)計(jì)模式里面的代理模式
8.織入(Weaving)
把切面應(yīng)用到目標(biāo)對(duì)象來(lái)創(chuàng)建新的代理對(duì)象的過程,織入一般發(fā)生在如下幾個(gè)時(shí)機(jī):
(1)編譯時(shí):當(dāng)一個(gè)類文件被編譯時(shí)進(jìn)行織入,這需要特殊的編譯器才可以做的到,例如AspectJ的織入編譯器
(2)類加載時(shí):使用特殊的ClassLoader在目標(biāo)類被加載到程序之前增強(qiáng)類的字節(jié)代碼
(3)運(yùn)行時(shí):切面在運(yùn)行的某個(gè)時(shí)刻被織入,SpringAOP就是以這種方式織入切面的,原理應(yīng)該是使用了JDK的動(dòng)態(tài)代理技術(shù)
****************************************************************************************************
請(qǐng)闡述Spring的IOC,有幾種類型。?
答:有setter注入(即類中設(shè)置一個(gè)全局屬性,并對(duì)屬性有setter方法,以供容器注入),接口注入和 構(gòu)造器注入
Spring 的依賴注入是什么意思? 給一個(gè) Bean 的 message 屬性, 字符串類型, 注入值為 "Hello" 的 XML 配置文件該怎么寫?
?
依賴注入是Spring?IOC的主要作用,依賴就是指屬性,意思就是說將屬性利用Spring注入到程序中,而非new。
<bean?id="message"?class="message所在類的路徑名">
???<property?name="message"?value="Hello"$amp;>amp;$lt;/property>
</bean>
Spring管理事務(wù)有哪幾種方式?? ??
答: 有兩種方式:基于XML配置文件的方式;另一個(gè)是在業(yè)務(wù)方法上進(jìn)行@Transactional注解,將事務(wù)規(guī)則應(yīng)用到業(yè)務(wù)邏輯中。
****************************************************************************************************
Spring的作用域有哪些??
答:singleton(單例) ,prototype(原型) ,request,session,globalsession
Hibernate
****************************************************************************************************
Hibernate工作原理流程?
原理: 1.讀取并解析配置文件 2.讀取并解析映射信息,創(chuàng)建SessionFactory 3.打開Session 4.創(chuàng)建事務(wù)Transation 5.持久化操作 6.提交事務(wù) 7.關(guān)閉Session 8.關(guān)閉SesstionFactory
為什么要用Hibernate
為什么要用: 1. 對(duì)JDBC訪問數(shù)據(jù)庫(kù)的代碼做了封裝,大大簡(jiǎn)化了數(shù)據(jù)訪問層繁瑣的重復(fù)性代碼。 2.hibernate是一個(gè)基于JDBC的主流持久化框架,是一個(gè)優(yōu)秀的ORM(對(duì)象關(guān)系映射)實(shí)現(xiàn)。他很大程度的簡(jiǎn)化DAO層的編碼工作 3. hibernate使用Java反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序來(lái)實(shí)現(xiàn)透明性。 4. hibernate的性能非常好,因?yàn)樗莻€(gè)輕量級(jí)框架。映射的靈活性很出色。它支持各種關(guān)系數(shù)據(jù)庫(kù),從一對(duì)一到多對(duì)多的各種復(fù)雜關(guān)系。
使用Hibernate之前要配置什么
.使用Hibernate時(shí),先要配置hibernate.cfg.xml文件,其中配置數(shù)據(jù)庫(kù)連接信息和方言等,還要為每個(gè)實(shí)體配置相應(yīng)的hbm.xml文件,hibernate.cfg.xml文件中需要登記每個(gè)hbm.xml文件。
?
使用Hibernate的基本流程是:
配置Configuration對(duì)象、產(chǎn)生SessionFactory、創(chuàng)建session對(duì)象,啟動(dòng)事務(wù),完成CRUD操作,提交事務(wù),關(guān)閉session。
相對(duì)于SQL,HQL查詢語(yǔ)言有什么特點(diǎn),什么是方言??
答:sql是關(guān)系數(shù)據(jù)庫(kù)查詢語(yǔ)言,面對(duì)的數(shù)據(jù)庫(kù);而hql是Hibernate這樣的數(shù)據(jù)庫(kù)持久化框架提供的內(nèi)置查詢語(yǔ)言,雖然他們的目的都是為了從數(shù)據(jù)庫(kù)查詢需要的數(shù)據(jù),但sql操作的是數(shù)據(jù)庫(kù)表和字段,而作為面向?qū)ο蟮膆ql操作的則是持久化類及其屬性,
****************************************************************************************************
Hibernate架構(gòu),對(duì)象有三種狀態(tài),分別是什么,怎樣區(qū)分??
答:Hibernate三種狀態(tài)的區(qū)分,以及save,update,saveOrUpdHibernate的對(duì)象有3種狀態(tài),
分別為:瞬時(shí)態(tài)(Transient)、持久態(tài)(Persistent)、脫管態(tài)(Detached)。
1.瞬時(shí)對(duì)象在內(nèi)存孤立存在,它是攜帶信息的載體,不和數(shù)據(jù)庫(kù)的數(shù)據(jù)有任何關(guān)聯(lián)關(guān)系,在Hibernate中,可通過session的save()或saveOrUpdate()方法將瞬時(shí)對(duì)象與數(shù)據(jù)庫(kù)相關(guān)聯(lián),并將數(shù)據(jù)對(duì)應(yīng)的插入數(shù)據(jù)庫(kù)中,此時(shí)該瞬時(shí)對(duì)象轉(zhuǎn)變成持久化對(duì)象。?
2.持久對(duì)象具有如下特點(diǎn): 1. 和session實(shí)例關(guān)聯(lián); 2. 在數(shù)據(jù)庫(kù)中有與之關(guān)聯(lián)的記錄。 3. 比瞬時(shí)對(duì)象多了一個(gè)數(shù)據(jù)庫(kù)記錄標(biāo)識(shí)值。
3.托管態(tài),也叫游離態(tài)等,持久化對(duì)象脫離了Session的對(duì)象。如Session緩存被清空的對(duì)象。特點(diǎn):已經(jīng)持久化,但不在Session緩存中。處于此狀態(tài)的對(duì)象叫游離對(duì)象。
****************************************************************************************************
Hibernate中什么是延遲加載,延遲的作用是什么??
答:延遲加載機(jī)制是為了避免一些無(wú)謂的性能開銷而提出來(lái)的,所謂延遲加載就是當(dāng)在真正需要數(shù)據(jù)的時(shí)候,才真正執(zhí)行數(shù)據(jù)加載操作。在Hibernate中提供了對(duì)實(shí)體對(duì)象的延遲加載以及對(duì)集合的延遲加載,另外在Hibernate3中還提供了對(duì)屬性的延遲加載。
?
hibernate進(jìn)行多表查詢每個(gè)表中各取幾個(gè)字段,也就是說查詢出來(lái)的結(jié)果集沒有一個(gè)實(shí)體類與之對(duì)應(yīng)如何解決;
解決方案一,按照Object[]數(shù)據(jù)取出數(shù)據(jù),然后自己組bean
解決方案二,對(duì)每個(gè)表的bean寫構(gòu)造函數(shù),比如表一要查出field1,field2兩個(gè)字段,那么有一個(gè)構(gòu)造函數(shù)就是Bean(type1filed1,type2
field2),然后在hql里面就可以直接生成這個(gè)bean了。
?
第一個(gè):查詢出來(lái)的list?轉(zhuǎn)換為一個(gè)數(shù)組???
也就是說?Object[]? objects=(Object[]) list??? --??你查詢出來(lái)的list?集合
for(object? item :objects? ){}進(jìn)行自行封裝處理?
第二個(gè)說白了就是寫個(gè)構(gòu)造函數(shù)讓他自己封裝省了自己處理過程了?
但是如果是查詢出來(lái)的多張表數(shù)據(jù)??還是得按第一種方式自己處理的。。。
介紹一下Hibernate的二級(jí)緩存
(1)緩存就是把以前從數(shù)據(jù)庫(kù)中查詢出來(lái)和使用過的對(duì)象保存在內(nèi)存中(一個(gè)數(shù)據(jù)結(jié)構(gòu)中),這個(gè)數(shù)據(jù)結(jié)構(gòu)通常是或類似Hashmap,當(dāng)以后要使用某個(gè)對(duì)象時(shí),先查詢緩存中是否有這個(gè)對(duì)象,如果有則使用緩存中的對(duì)象,如果沒有則去查詢數(shù)據(jù)庫(kù),并將查詢出來(lái)的對(duì)象保存在緩存中,以便下次使用。
(2)Hibernate的Session就是一種緩存,我們通常將之稱為Hibernate的一級(jí)緩存,當(dāng)想使用session從數(shù)據(jù)庫(kù)中查詢出一個(gè)對(duì)象時(shí),Session也是先從自己內(nèi)部查看是否存在這個(gè)對(duì)象,存在則直接返回,不存在才去訪問數(shù)據(jù)庫(kù),并將查詢的結(jié)果保存在自己內(nèi)部。由于Session代表一次會(huì)話過程,一個(gè)Session與一個(gè)數(shù)據(jù)庫(kù)連接相關(guān)連,所以Session最好不要長(zhǎng)時(shí)間保持打開,通常僅用于一個(gè)事務(wù)當(dāng)中,在事務(wù)結(jié)束時(shí)就應(yīng)關(guān)閉。并且Session是線程不安全的,被多個(gè)線程共享時(shí)容易出現(xiàn)問題。通常只有那種全局意義上的緩存才是真正的緩存應(yīng)用,才有較大的緩存價(jià)值,因此,Hibernate的Session這一級(jí)緩存的緩存作用并不明顯,應(yīng)用價(jià)值不大。Hibernate的二級(jí)緩存就是要為Hibernate配置一種全局緩存,讓多個(gè)線程和多個(gè)事務(wù)都可以共享這個(gè)緩存。我們希望的是一個(gè)人使用過,其他人也可以使用,session沒有這種效果。
(3)二級(jí)緩存是獨(dú)立于Hibernate的軟件部件,屬于第三方的產(chǎn)品,多個(gè)廠商和組織都提供有緩存產(chǎn)品,例如,EHCache和OSCache等等。在Hibernate中使用二級(jí)緩存,首先就要在hibernate.cfg.xml配置文件中配置使用哪個(gè)廠家的緩存產(chǎn)品,接著需要配置該緩存產(chǎn)品自己的配置文件,最后要配置Hibernate中的哪些實(shí)體對(duì)象要納入到二級(jí)緩存的管理中。明白了二級(jí)緩存原理和有了這個(gè)思路后,很容易配置起Hibernate的二級(jí)緩存。擴(kuò)展知識(shí):一個(gè)SessionFactory可以關(guān)聯(lián)一個(gè)二級(jí)緩存,也即一個(gè)二級(jí)緩存只能負(fù)責(zé)緩存一個(gè)數(shù)據(jù)庫(kù)中的數(shù)據(jù),當(dāng)使用Hibernate的二級(jí)緩存后,注意不要有其他的應(yīng)用或SessionFactory來(lái)更改當(dāng)前數(shù)據(jù)庫(kù)中的數(shù)據(jù),這樣緩存的數(shù)據(jù)就會(huì)與數(shù)據(jù)庫(kù)中的實(shí)際數(shù)據(jù)不一致。
簡(jiǎn)述 Hibernate 和 JDBC 的優(yōu)缺點(diǎn)? 如何書寫一個(gè) one to many 配置文件.
? Hibernate就是封裝了JDBC,他可以寫一條hql語(yǔ)句,可以再不同數(shù)據(jù)庫(kù)中使用,不用修改hql語(yǔ)句,但是關(guān)聯(lián)查詢效率低。 JDBC是基礎(chǔ)的鏈接數(shù)據(jù)庫(kù)的框架,效率高,但是mysql、oracle、sql service等不同的數(shù)據(jù)庫(kù)要寫不同的sql語(yǔ)句。 one to many比如Class和Student吧就是一個(gè)班級(jí)對(duì)應(yīng)多個(gè)學(xué)生在Class類中追加集合屬性 Set<Student> students; 在Class的配置文件中追加(Class.hbm.xml) <!-- 追加集合屬性的配置 --><!-- 設(shè)置集合屬性 --><set name="students" lazy="false" fetch="join" cascade="all" inverse="true"><!-- 設(shè)置關(guān)聯(lián)字段 --><key column="classId" /><!-- 設(shè)置關(guān)聯(lián)關(guān)系 --><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. 主要控制邏輯關(guān)系的處理 .??? hibernate 是數(shù)據(jù)持久化層 , 是一種新的對(duì)象、關(guān)系的映射工具 , 提供了從 Java 類到數(shù)據(jù)表的映射,也提供了數(shù)據(jù)查詢和恢復(fù)等機(jī)制 , 大大減少數(shù)據(jù)訪問的復(fù)雜度。把對(duì)數(shù)據(jù)庫(kù)的直接操作 , 轉(zhuǎn)換為對(duì)持久對(duì)象的操作 .???
spring 是一個(gè)輕量級(jí)的控制反轉(zhuǎn) (IoC) 和面向切面 (AOP) 的容器框架 , 面向接口的編程 , 由容器控制程序之間的(依賴)關(guān)系,而非傳統(tǒng)實(shí)現(xiàn)中,由程序代碼直接操控。這也就是所謂“ 控制反轉(zhuǎn) ” 的概念所在:(依賴)控制權(quán)由應(yīng)用代碼中轉(zhuǎn)到了外部容器,控制權(quán)的轉(zhuǎn)移,是所謂反轉(zhuǎn)。依賴注入,即組件之間的依賴關(guān)系由容器在運(yùn)行期決定,形象的來(lái)說,即由容器動(dòng)態(tài)的將某種依賴關(guān)系注入到組件之中? 起到的主要作用是解耦
****************************************************************************************************
整合SSH
?
把hibernate的配置寫到spring的配置中,用spring管理和調(diào)用hibernate的工廠和session等。
struts的話,通常有2中。一種是用spring中的一個(gè)工廠類代替struts的工廠類去生成action,并且用spring管理。 另一種是,struts 用自己的工廠生成action,但是由spring管理。這樣耦合低一些。
大概就是這樣,hibernate負(fù)責(zé)它最擅長(zhǎng)的數(shù)據(jù)庫(kù)管理。 struts頁(yè)面的請(qǐng)求處理調(diào)用相應(yīng)的底層數(shù)據(jù)庫(kù)等。spring負(fù)責(zé)管理他們兩個(gè)。
?
****************************************************************************************************
整合SSH的三種方法
?
方法一:直接獲得ApplicationContext對(duì)象
?
這種方法通過spring獲取與Hibernate相關(guān)聯(lián)的對(duì)象。
?
關(guān)鍵是在Action類中獲得ApplicationContext對(duì)象,然后通過getBean方法獲得JavaBean對(duì)象。
?
(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>?????
?
<!—數(shù)據(jù)庫(kù)的實(shí)體類映射文件-->
?
???????<mapping resource="User.hbm.xml" />
?
???</session-factory>
?
?
?
(2)在applicationContext.xml文件中對(duì)hibernate相關(guān)聯(lián)的對(duì)象使用依賴注入,使用Spring的HibernateTemplate類來(lái)對(duì)Hibernate的Session進(jìn)行操作
?
???<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>
?
?
?
???<!-- 事務(wù)攔截器bean需要依賴注入一個(gè)事務(wù)管理器 -->
?
???<bean id="transactionManager"
?
??????class="org.springframework.orm.hibernate3.HibernateTransactionManager">
?
??????<property name="sessionFactory">
?
??????????<ref bean="sessionFactory" />
?
??????</property>
?
???</bean>
?
?
?
???<!-- 設(shè)置事務(wù)傳播特性,對(duì)應(yīng)于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,配置哪些類和哪些方法使用事務(wù)對(duì)應(yīng)于AOP中的 <aop:pointcut/> -->??
?
???<bean
?
??????class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
?
??????<!-- 指定對(duì)滿足哪些bean name的bean自動(dòng)生成業(yè)務(wù)代理 -->
?
??????<property name="beanNames">
?
??????????<!-- 下面是所有需要自動(dòng)創(chuàng)建事務(wù)代理的bean-->??
?
??????????<list>
?
??????????????<value>userDAO</value>????????????
?
??????????</list>
?
??????????<!-- 此處可增加其他需要自動(dòng)創(chuàng)建事務(wù)代理的bean-->
?
??????</property>
?
??????<property name="interceptorNames">
?
??????????<!--? 下面定義BeanNameAutoProxyCreator所需的事務(wù)攔截器-->??
?
??????????<list>
?
?????????????<value>transactionInterceptor</value>
?
?????????????? <!-- 此處可增加其他新的Interceptor-->
?
??????????</list>
?
??????</property>
?
???</bean>??
?
?
?
??????<!--配置數(shù)據(jù)訪問層對(duì)象-->
?
???<bean id="userDAO"class="com.dao.UserDAOImpl">
?
??????<constructor-arg>
?
??????????<ref bean="hibernateTemplate" />
?
??????</constructor-arg>
?
???</bean>
?
?
?
??????<!--配置業(yè)務(wù)邏輯層對(duì)象-->
?
???<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);
?
?
?
第一種方法的缺點(diǎn):將Action類魚Spring的裝配JavaBean綁定的過緊,增加了其耦合度,不適合裝配文件有變化的情況。
?
?
?
?
?
方法二:由Spring創(chuàng)建Action類的對(duì)象
?
在方法一的基礎(chǔ)之上需要做如下幾步修改
?
(1)在Action方法中增加setUserService的方法,把UserService交給spring處理
?
private UserService userService;
?
public void setUserService(UserServiceuserService) {
?
???this.userService = userService;
?
}
?
(2)在application.xml文件中對(duì)action進(jìn)行配置
?
<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對(duì)象-->
?
?
?
第二種方法的缺點(diǎn):雖然使用了Spring的IOC特性,對(duì)Action和ApplicationContext對(duì)象進(jìn)行了解耦,但配置一個(gè)Action需要同時(shí)維護(hù)兩份文件:struts.xml和application.xml,比較難維護(hù)。
?
?
?
方法三:直接使用Spring的自動(dòng)裝配JavaBean的特性進(jìn)行整合
?
???????在方法一的配置基礎(chǔ)上進(jìn)行如下修改
?
(1)編寫UserAction類,在UserAction中添加setUserService方法,讓spring自動(dòng)裝配
?
private UserService userService;
?
public void setUserService(UserServiceuserService) {
?
???this.userService = userService;
?
}
?
(2)直接在Struts中配置LoginAction
?
<action name=”LoginAction”class=”com.test.LoginAction”/>
?
由于已經(jīng)在application.xml文件中裝配了userService屬性,這樣spring就可以自動(dòng)裝配LoginAction中的UserService了。
?
*****************************************************************************************************************************
其他
j2ee常用的設(shè)計(jì)模式?說明工廠模式。
總共23種,分為三大類:創(chuàng)建型,結(jié)構(gòu)型,行為型
我只記得其中常用的6、7種,分別是:
創(chuàng)建型(工廠、工廠方法、抽象工廠、單例)
結(jié)構(gòu)型(包裝、適配器,組合,代理)
行為(觀察者,模版,策略)
然后再針對(duì)你熟悉的模式談?wù)勀愕睦斫饧纯伞?/p>
工廠模式:
工廠模式是一種經(jīng)常被使用到的模式,根據(jù)工廠模式實(shí)現(xiàn)的類可以根據(jù)提供的數(shù)據(jù)生成一組類中某一個(gè)類的實(shí)例,通常這一組類有一個(gè)公共的抽象父類并且實(shí)現(xiàn)了相同的方法,但是這些方法針對(duì)不同的數(shù)據(jù)進(jìn)行了不同的操作。首先需要定義一個(gè)基類,該類的子類通過不同的方法實(shí)現(xiàn)了基類中的方法。然后需要定義一個(gè)工廠類,工廠類可以根據(jù)條件生成不同的子類實(shí)例。當(dāng)?shù)玫阶宇惖膶?shí)例后,開發(fā)人員可以調(diào)用基類中的方法而不必考慮到底返回的是哪一個(gè)子類的實(shí)例。
單例模式
在它的核心結(jié)構(gòu)中只包含一個(gè)被稱為單例類的特殊類。通過單例模式可以保證系統(tǒng)中一個(gè)類只有一個(gè)實(shí)例而且該實(shí)例易于外界訪問,從而方便對(duì)實(shí)例個(gè)數(shù)的控制并節(jié)約系統(tǒng)資源。如果希望在系統(tǒng)中某個(gè)類的對(duì)象只能存在一個(gè),單例模式是最好的解決方案。
轉(zhuǎn)載于:https://www.cnblogs.com/w-wfy/p/6416654.html
總結(jié)
以上是生活随笔為你收集整理的SSH三大框架的知识题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超炫jQuery测试答题功能
- 下一篇: Elasticsearch 安装配置 外