1.Struts2.0有幾種標(biāo)簽庫(kù)
【參考答案】
UI標(biāo)簽、控制標(biāo)簽、數(shù)據(jù)標(biāo)簽、雜項(xiàng)標(biāo)簽
2.struts2必備包有哪些?
【參考答案】
commons-fileupload-1.2.1.jar
freemarker-2.3.13.jar
ognl-2.6.11.jar
struts2-core-2.1.6.jar
xwork-2.1.2.jar
3.Hiberbate優(yōu)化方法有那些?
【參考答案】
1)盡量使用many-to-one,避免使用one-to-many
2)靈活使用單向one-to-many
3)不用一對(duì)一,使用多對(duì)一代替一對(duì)一
4)配置對(duì)象緩存,不使用集合緩存
5)一對(duì)多使用Bag多對(duì)一使用Set
6)繼承使用顯示多態(tài)HQL:from object polymorphism="exlicit"避免查處所有對(duì)象
7)消除大表,使用二級(jí)緩存
4.應(yīng)用服務(wù)器與Web Server的區(qū)別
【參考答案】
Web服務(wù)器(Web Server)
Web服務(wù)器可以解析(handles)HTTP協(xié)議。當(dāng)Web服務(wù)器接收到一個(gè)HTTP請(qǐng)求,會(huì)返回一個(gè)HTTP響應(yīng),例如送回一個(gè)HTML頁(yè)面。為了處理一個(gè)請(qǐng)求,Web服務(wù)器可以響應(yīng)一個(gè)靜態(tài)頁(yè)面或圖片,進(jìn)行頁(yè)面跳轉(zhuǎn),或者把動(dòng)態(tài)響應(yīng)的產(chǎn)生委托給一些其它的程序例如CGI腳本,JSP腳本,servlets,ASP腳本,服務(wù)器端JavaScript,或者一些其它的服務(wù)器端技術(shù)。無(wú)論它們(譯者注:腳本)的目的如何,這些服務(wù)器端的程序通常產(chǎn)生一個(gè)HTML的響應(yīng)來(lái)讓瀏覽器可以瀏覽。
應(yīng)用程序服務(wù)器
通過(guò)各種協(xié)議,可以包括HTTP,把商業(yè)邏輯暴露給客戶端應(yīng)用程序。Web服務(wù)器主要是處理向?yàn)g覽器發(fā)送HTML以供瀏覽,而應(yīng)用程序服務(wù)器提供訪問(wèn)商業(yè)邏輯的途徑以供客戶端應(yīng)用程序使用。應(yīng)用程序使用此商業(yè)邏輯就象你調(diào)用對(duì)象的一個(gè)方法(或過(guò)程語(yǔ)言中的一個(gè)函數(shù))一樣。
應(yīng)用程序服務(wù)器的客戶端(包含有圖形用戶界面(GUI)的)可能會(huì)運(yùn)行在一臺(tái)PC、一個(gè)Web服務(wù)器或者甚至是其它的應(yīng)用程序服務(wù)器上。在應(yīng)用程序服務(wù)器與其客戶端之間來(lái)回穿梭的信息不僅僅局限于簡(jiǎn)單的顯示標(biāo)記。相反,這種信息就是程序邏輯。正是由于這種邏輯取得了數(shù)據(jù)和方法調(diào)用的形式而不是靜態(tài)HTML,所以客戶端才可以隨心所欲的使用這種被暴露的商業(yè)邏輯。
在大多數(shù)情形下,應(yīng)用程序服務(wù)器是通過(guò)組件的應(yīng)用程序接口把商業(yè)邏輯暴露(給客戶端應(yīng)用程序)的,例如基于J2EE應(yīng)用程序服務(wù)器的EJB組件模型。此外,應(yīng)用程序服務(wù)器可以管理自己的資源,例如,安全,事務(wù)處理,資源池,和消息。就象Web服務(wù)器一樣,應(yīng)用程序服務(wù)器配置了多種可擴(kuò)展和容錯(cuò)技術(shù)。
5.如何設(shè)置Hibernate二級(jí)緩存
【參考答案】
1、首先要打開(kāi)二級(jí)緩存,在hibernate.cfg.xml中添加如下配置:
true
2、Hibernate的二級(jí)緩存使用第三方的緩存工具來(lái)實(shí)現(xiàn),所以我們需要指定Hibernate使用哪個(gè)緩存工具。如下配置指定Hibernate使用EhCache緩存工具。
org.hibernate.cache.EhCacheProvider
3、Hibernate在默認(rèn)情況下并不會(huì)對(duì)所有實(shí)體對(duì)象進(jìn)行緩存,所以,我們需要指定緩存哪些對(duì)象,在實(shí)體對(duì)象的映射文件中(相應(yīng)的標(biāo)簽內(nèi)部),添加如下配置:
usage="read-only"是“只讀”緩存策略。
6.ApplicationContext和BeanFactory有什么區(qū)別?
【參考答案】
BeanFactory實(shí)際上是實(shí)例化,配置和管理眾多bean的容器。這些bean通常會(huì)彼此合作,因而它們之間會(huì)產(chǎn)生依賴,而這種依賴只是體現(xiàn)在Bean與Bean之間的依賴這些依賴關(guān)系可以通過(guò)配置來(lái)反映,而ApplicationContextbeans包是BeanFactory的子類,提供了以編程的方式管理和操控bean的基本功能,而context包增加了ApplicationContext,它以一種更加面向框架的方式增強(qiáng)了BeanFactory的功能,簡(jiǎn)單說(shuō)他增強(qiáng)了面向Web容器的功能。ApplictionContext完全采用聲明式方式來(lái)使用容器,甚至不用去手工創(chuàng)建它,Web應(yīng)用的啟動(dòng)進(jìn)程中用它啟動(dòng)ApplicationContext。當(dāng)然用編程的方式創(chuàng)建一個(gè)ApplicationContext對(duì)象可以有以下幾種方式或?qū)崿F(xiàn):
1、ClassPathXmlApplicationContext:從類路徑中的XML文件載入上下文定義信息,把上下文定義文件當(dāng)作類路徑資源。
2、FileSystemXmlApplicationContext:從文件系統(tǒng)中的XML文件載入上下文定義信息。
3、XmlWebApplicationContext:從Web系統(tǒng)中的XMl文件載入上下文信息。
7.Spring MVC與Struts2 MVC的不同之處?【杭州網(wǎng)闕科技】
【參考答案】
1、請(qǐng)求處理機(jī)制:spring mvc是基于方法的設(shè)計(jì),而sturts是基于類,每次發(fā)一次請(qǐng)求都會(huì)實(shí)例一個(gè)action,每個(gè)action都會(huì)被注入屬性,而spring基于方法,粒度更細(xì)。
2、參數(shù)傳遞:struts是在接受參數(shù)的時(shí)候,可以用屬性來(lái)接受參數(shù),這就說(shuō)明參數(shù)是讓多個(gè)方法共享的。
3、設(shè)計(jì)思想上:struts更加符合oop的編程思想,spring就比較謹(jǐn)慎,在servlet上擴(kuò)展。
4、intercepter的實(shí)現(xiàn)機(jī)制:struts有以自己的interceptor機(jī)制,spring mvc用的是獨(dú)立的AOP方式。這樣導(dǎo)致struts的配置文件量還是比spring mvc大,雖然struts的配置能繼承,所以我覺(jué)得論使用上來(lái)講,spring mvc使用更加簡(jiǎn)潔,開(kāi)發(fā)效率Spring MVC確實(shí)比struts2高。
8.Spring使用了哪些設(shè)計(jì)模式,這樣用有什么好處?
【參考答案】
最典型的像:工廠模式,Spring的IOC容器就是一個(gè)大的Bean實(shí)例的工廠,負(fù)責(zé)Bean的周期管理。單例模式,這個(gè)和Spring的IOC一起的,既然是IOC是一個(gè)大工廠,那個(gè)Bean對(duì)象為減少內(nèi)存開(kāi)銷就需要提供單例特征。適配器模式,在Spring的AOP編程中隨處可見(jiàn)Adapter模式的應(yīng)用。代理模式,為其它對(duì)象提供一種代理訪問(wèn)的機(jī)制。觀察者模式,當(dāng)對(duì)象發(fā)生變化時(shí),其它對(duì)象需要得到相應(yīng)更新,Spring中應(yīng)用也較為普遍。
【分析】
就說(shuō)上面幾個(gè)了,這種問(wèn)題無(wú)法一追溯,把所有Spring用到的設(shè)計(jì)模式一一回答出來(lái),重要的是你只需要讓面試官覺(jué)得你對(duì)Spring有較深的理解和應(yīng)用即可。
9.Hibernate有哪幾種查詢數(shù)據(jù)的方法?
【參考答案】
hibernate查詢有三種方式:HQL查詢、結(jié)構(gòu)化SQL查詢、QBC查詢
10.3個(gè)框架在項(xiàng)目在項(xiàng)目當(dāng)中的用,BaseDao是用來(lái)做什么的。
【參考答案】
DAO組件主要提供數(shù)據(jù)庫(kù)訪問(wèn)操作,針對(duì)不同數(shù)據(jù)源表持久化操作進(jìn)行了封裝,這樣可以提供其它層的訪問(wèn)接口,使得組件之間解耦。而B(niǎo)aseDAO是這些所有這些不同的持久化的DAO的公共API進(jìn)行了封裝,進(jìn)一步抽象提取,使其它各組件DAO從BaseDAO中派生,增強(qiáng)系統(tǒng)的重用性、維護(hù)性、擴(kuò)展性。
11.ThreadLocal在項(xiàng)目中的實(shí)際意義?
【參考答案】
ThreadLocal和其它同步機(jī)制相比從另一個(gè)角度來(lái)解決多線程的并發(fā)訪問(wèn),它為每一個(gè)線程維護(hù)一個(gè)和該線程綁定的變量的副本,從而隔離了多個(gè)線程的數(shù)據(jù),每一個(gè)線程都擁有自己的變量副本,從而也就沒(méi)有必要對(duì)該變量進(jìn)行同步了。還提供了線程安全的共享對(duì)象,在編寫多線程代碼時(shí),可以把不安全的整個(gè)變量封裝進(jìn)ThreadLocal
ThreadLocal可以大量減少參數(shù)的傳遞,可以使代碼簡(jiǎn)潔,但一個(gè)線程會(huì)綁定多個(gè)自己定義的局部對(duì)象,ThreadLocal是抽象在線程上的對(duì)象創(chuàng)建工廠,目前的Tomcat5使用了線程池,一個(gè)線程處理一個(gè)request,這樣ThreadLocal對(duì)象可以抽象的綁定在request生命周期,不會(huì)存在線程危機(jī),而且線程池也平衡了這些ThreadLocal
12.Spring對(duì)多種ORM框架提供了很好的支持,結(jié)合事務(wù)管理描述spring從哪些方面提供了對(duì)Hibernate的支持。
【參考答案】
1、SessionFactory管理。使用Spring整合Hibernate時(shí)我們不需要hibernate.cfg.xml文件。首先,在applicationContext.xml中配置數(shù)據(jù)源(dataSource)bean和session工廠(sessionFactory)bean。
2、持入層管理。Spring提供了HibernateTemplate,用于持久層訪問(wèn),無(wú)需打開(kāi)Session及關(guān)閉Session。它只要獲得SessionFactory的引用,將可以只讀地打開(kāi)Session,并在持久化訪問(wèn)結(jié)束后關(guān)閉Session,對(duì)持久層邏輯,通用的操作(如對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的增,刪,改,查)有HibernateTemplate完成。
3、對(duì)DAO的支持:通過(guò)繼承HibernateDaoSupport實(shí)現(xiàn)DAO基本操作。
4、對(duì)事務(wù)支持:Spring的聲明式事務(wù)和編程式事務(wù),很好的將持久化的操作納入事務(wù)管理。
13.Hibernate的session.save()與session.saveOrUpdate()的區(qū)別?
【參考答案】
1.save()方法,調(diào)用save方法時(shí),首先會(huì)在session緩存中查找保存對(duì)象如果實(shí)體對(duì)象已經(jīng)處于Persient狀態(tài),直接返回;否則并將保存至數(shù)據(jù)庫(kù),對(duì)象變?yōu)槌志脿顟B(tài)。
2.saveOrUpdate()方法:和save方法一樣首先在session緩存中查找,判斷對(duì)象是否為為保存狀態(tài),如果對(duì)象處于Persient,不執(zhí)行操作,處于Transient執(zhí)行save操作,處于Detached調(diào)用saveOrUpdate將對(duì)象與session重新關(guān)聯(lián)(簡(jiǎn)單的說(shuō)就是該方法會(huì)先看該對(duì)象是否已經(jīng)存在,如果已經(jīng)存在就更新,否則新增保存),如果此時(shí)saveOrUpdate的對(duì)象與另一個(gè)與Session關(guān)聯(lián)的對(duì)象持有相同的持久化標(biāo)識(shí)則拋出相同的標(biāo)識(shí)符異常。
14.Hibernate中sedssion.get()與session.load()的區(qū)別?
【參考答案】
Session.load/get方法均可以根據(jù)指定的實(shí)體類和id從數(shù)據(jù)庫(kù)讀取記錄,并返回與之對(duì)應(yīng)的實(shí)體對(duì)象。其區(qū)別在于:
1)如果未能發(fā)現(xiàn)符合條件的記錄,get方法返回null,而load方法會(huì)拋出一個(gè)ObjectNotFoundException。
2)load支持延遲加載,get不支持
3)load方法可返回實(shí)體的代理類實(shí)例,而get方法永遠(yuǎn)直接返回實(shí)體類。
4)load方法可以充分利用內(nèi)部緩存和二級(jí)緩存中的現(xiàn)有數(shù)據(jù),get方法則僅僅在內(nèi)部緩存中進(jìn)行數(shù)據(jù)查找,如沒(méi)有發(fā)現(xiàn)對(duì)應(yīng)數(shù)據(jù),將越過(guò)二級(jí)緩存,直接調(diào)用SQL完成數(shù)據(jù)讀取。
15.annotation的使用方法和用途主要分為幾類?
【參考答案】
1、內(nèi)建Annotation——Java5.0版在java語(yǔ)法中經(jīng)常用到的內(nèi)建Annotation:
2、開(kāi)發(fā)者自定義Annotation:由開(kāi)發(fā)者自定義Annotation類型;
3、使用第三方開(kāi)發(fā)的Annotation類型
16.Struts2是怎么實(shí)現(xiàn)MVC的?
【參考答案】
MVC就是model view controller,三種組件,Struts2實(shí)現(xiàn)Controller主要由一系列的前端過(guò)濾器(Filter)實(shí)現(xiàn)Controller。Model層主要由Struts2的Action組件實(shí)現(xiàn)。View層主要是由Struts2的標(biāo)簽庫(kù)、Freemarker等組件實(shí)現(xiàn)視圖層
17.介紹下hibernate【上海數(shù)字政通】
【參考答案】
Hibernate是一個(gè)開(kāi)放源代碼Java語(yǔ)言下的對(duì)象關(guān)系映射解決方案。它為面向?qū)ο蟮念I(lǐng)域模型到傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)的映射,提供了一個(gè)使用方便的框架。Hibernate也是目前Java開(kāi)發(fā)中最為流行的數(shù)據(jù)庫(kù)持久層框架。將軟件開(kāi)發(fā)人員從大量相同的數(shù)據(jù)持久層相關(guān)編程工作中解放出來(lái),Hibernate不僅負(fù)責(zé)從Java類到數(shù)據(jù)庫(kù)表的映射(還包括從Java數(shù)據(jù)類型到SQL數(shù)據(jù)類型的映射),還提供了面向?qū)ο蟮臄?shù)據(jù)查詢檢索機(jī)制,從而極大地縮短的手動(dòng)處理SQL和JDBC上的開(kāi)發(fā)時(shí)間。
18.在Struts2中,配置文件中通配符是怎么表示和使用的?使用通配符后有什么好處。【上海咯勤】
示例1:調(diào)用相同Action中的不同方法
/login.jsp
/error.jsp
/welcome.jsp
其中表達(dá)式{1}的值name屬性值中第一個(gè)*的值。
如果用戶請(qǐng)求的URL為loginAction.action,則調(diào)用Jcuckoo.LoginRegistAction中的login方法;
如果用戶請(qǐng)求的URL為registerAction.action,則調(diào)用Jcuckoo.LoginRegistAction中的register方法
示例2:帶轉(zhuǎn)視圖
/input.jsp
/{1}.jsp
當(dāng)處理結(jié)果是input時(shí),會(huì)轉(zhuǎn)到/input.jsp頁(yè)面
當(dāng)處理結(jié)果是success時(shí),
如果crud_create.action,則會(huì)執(zhí)行Jcuckoo.CrudAction中的create方法,并且跳轉(zhuǎn)到/create.jsp;
如果crud_delete.action,則會(huì)執(zhí)行Jcuckoo.CrudAction中的delete方法,并且跳轉(zhuǎn)到/delete.jsp;
優(yōu)點(diǎn):
使用通配符能規(guī)范命名格式,簡(jiǎn)潔配置文件,加速開(kāi)發(fā)效率,也是Struts倡導(dǎo)的一種開(kāi)發(fā)模式。
19.Hibernate中的HQL和criteria的區(qū)別?
【參考答案】
1.QBC(Query by Criteria)查詢對(duì)查詢條件進(jìn)行了面向?qū)ο蠓庋b,符合編程人員的思維方式;
2.HQL(Hibernate Query Language)查詢提供了更加豐富的和靈活的查詢特性,在涵蓋Criteria查詢的所有功能的前提下,提供了類似標(biāo)準(zhǔn)SQL語(yǔ)句的查詢方式,同時(shí)也提供了更加面向?qū)ο蟮姆庋b。
20.介紹hibernate延持加載屬性
【參考答案】
Hibernate通過(guò)lazy來(lái)指定加載策略,一般值為true或false,。設(shè)為flase表示立即加載,true表過(guò)延遲加載。
21.列舉你接觸過(guò)的框架,說(shuō)明特點(diǎn)和原理
【參考答案】
Struts2的特點(diǎn):自己總結(jié)一下。
Hibernate特點(diǎn):
1.基于JDBC的主流持久化框架,是一個(gè)優(yōu)秀的ORM實(shí)現(xiàn),對(duì)JDBC訪問(wèn)數(shù)據(jù)庫(kù)的代碼做了封裝,大大簡(jiǎn)化了數(shù)據(jù)訪問(wèn)層繁瑣的重復(fù)性代碼。
2. hibernate使用Java反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序來(lái)實(shí)現(xiàn)透明性。
3. hibernate的性能非常好,因?yàn)樗莻€(gè)輕量級(jí)框架。映射的靈活性很出色。它支持各種關(guān)系數(shù)據(jù)庫(kù),從一對(duì)一到多對(duì)多的各種復(fù)雜關(guān)系。
Spring特點(diǎn):
Spring框架的主要優(yōu)勢(shì)之一低侵入式的架構(gòu)思想,實(shí)現(xiàn)了IOC容器。另外一個(gè)AOP的編程也在很多應(yīng)用場(chǎng)合下地位較重。提供了對(duì)各種不同類型框架的支持,如:Web容器、持入層、事務(wù)層、其它J2EE組件等。
22.解釋一下IOC,以及spring的舉例
【參考答案】
IOC稱為控制反轉(zhuǎn),也叫依賴注入,ioc是Spring的核心組件,它通過(guò)配置文件,將需要?jiǎng)?chuàng)建的對(duì)象以池的方式管理,將實(shí)例注入到需要的對(duì)象中區(qū),是對(duì)象依賴于注入而不依賴于實(shí)現(xiàn),解決了各個(gè)組件的耦合度,使得項(xiàng)目在后期的維護(hù)和擴(kuò)展上非常方便。如在ssh框架整合中,我們將datasource對(duì)象注入給sessionFactory,再將sessionFactory注入給dao組件,再將dao組件注入給struts的Action組件,在將action對(duì)象注入給struts的攔截器。
23.解釋一下mvc以及熟悉的mvc框架
【參考答案】
MVC是Model-View-Controller的簡(jiǎn)寫。Model代表的是應(yīng)用的業(yè)務(wù)邏輯(通過(guò)JavaBean,EJB組件實(shí)現(xiàn)),View是應(yīng)用的表示層(由JSP、HTML、各種Taglib等組成),Controller是提供應(yīng)用程序的中心控制處理。通過(guò)這種設(shè)計(jì)模型把應(yīng)用邏輯,處理過(guò)程和顯示邏輯分成不同的組件實(shí)現(xiàn),這些組件可以進(jìn)行交互和重用,另外有利于維護(hù)。
Struts1、Struts2、Spring MVC、WebWork等這些都是屬于基于MVC模式實(shí)現(xiàn)的框架
24.Spring工作原理
【參考答案】
內(nèi)部最核心的就是IOC了,動(dòng)態(tài)注入,讓一個(gè)對(duì)象的創(chuàng)建不用new了,可以自動(dòng)的生產(chǎn),這其實(shí)就是利用java里的反射,反射其實(shí)就是在運(yùn)行時(shí)動(dòng)態(tài)的去創(chuàng)建、調(diào)用對(duì)象,Spring就是在運(yùn)行時(shí),跟xml ?Spring的配置文件來(lái)動(dòng)態(tài)的創(chuàng)建對(duì)象,和調(diào)用對(duì)象里的方法的還有一個(gè)核心就是AOP這個(gè)就是面向切面編程,可以為某一類對(duì)象進(jìn)行監(jiān)督和控制(也就是在調(diào)用這類對(duì)象的具體方法的前后去調(diào)用你指定的模塊)從而達(dá)到對(duì)一個(gè)模塊擴(kuò)充的功能。這些都是通過(guò)配置類達(dá)到的
Spring目的:
就是讓對(duì)象與對(duì)象(模塊與模塊)之間的關(guān)系沒(méi)有通過(guò)代碼來(lái)關(guān)聯(lián),都是通過(guò)配置類說(shuō)明管理的(Spring根據(jù)這些配置內(nèi)部通過(guò)反射去動(dòng)態(tài)的組裝對(duì)象)要記住:Spring是一個(gè)容器,凡是在容器里的對(duì)象才會(huì)有Spring所提供的這些服務(wù)和功能
25.Hibernate中離線查詢與在線查詢的區(qū)別
【參考答案】
Criteria和DetachedCriteria的主要區(qū)別在于創(chuàng)建的形式不一樣,Criteria是在線的,所以它是由Hibernate Session進(jìn)行創(chuàng)建的;而DetachedCriteria是離線的,創(chuàng)建時(shí)無(wú)需Session,DetachedCriteria提供了2個(gè)靜態(tài)方法forClass(Class)或forEntityName(Name)進(jìn)行DetachedCriteria實(shí)例的創(chuàng)建。
26.Struts2實(shí)現(xiàn)攔截器的原理?
【參考答案】
攔截器是AOP中的概念,它本身是一段代碼,可以通過(guò)定義“織入點(diǎn)”,來(lái)指定攔截器的代碼在“織入點(diǎn)”的前后執(zhí)行,從而起到攔截的作用。而Struts2的Interceptor,其攔截的對(duì)象是Action代碼,可以定義在Action代碼之前或者之后執(zhí)行攔截器的代碼。
1.整個(gè)結(jié)構(gòu)就如同一個(gè)堆棧,除了Action以外,堆棧中的其他元素是Interceptor
2. Action位于堆棧的底部。由于堆棧"先進(jìn)后出"的特性,而這些都是圍繞著Action的,當(dāng)我們請(qǐng)求Action時(shí),必須首先把位于Action上端的Interceptor拿出來(lái)執(zhí)行。
27.Struts2的實(shí)現(xiàn)原理。【高達(dá)軟件】
【參考答案】
1、客戶端初始化一個(gè)指向Servlet容器(例如Tomcat)的請(qǐng)求
2、這個(gè)請(qǐng)求經(jīng)過(guò)一系列的過(guò)濾器(Filter)(這些過(guò)濾器中有一個(gè)叫做ActionContextCleanUp的可選過(guò)濾器,這個(gè)過(guò)濾器對(duì)于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin);
3、接著FilterDispatcher被調(diào)用,F(xiàn)ilterDispatcher詢問(wèn)ActionMapper來(lái)決定這個(gè)請(qǐng)求是否需要調(diào)用某個(gè)Action;
4、如果ActionMapper決定需要調(diào)用某個(gè)Action,F(xiàn)ilterDispatcher把請(qǐng)求的處理交給ActionProxy;
5、ActionProxy通過(guò)Configuration Manager詢問(wèn)框架的配置文件,找到需要調(diào)用的Action類;
6、ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例。
7、ActionInvocation實(shí)例使用命名模式來(lái)調(diào)用,在調(diào)用Action的過(guò)程前后,涉及到相關(guān)攔截器(Intercepter)的調(diào)用。
8、一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果。返回結(jié)果通常是(但不總是,也可能是另外的一個(gè)Action鏈)一個(gè)需要被表示的JSP或者FreeMarker的模版。在表示的過(guò)程中可以使用Struts2框架中繼承的標(biāo)簽。在這個(gè)過(guò)程中需要涉及到ActionMapper
28.簡(jiǎn)述spring的事務(wù)傳播行為和隔離級(jí)別
【參考答案】
spring的事務(wù)傳播行為:
Spring在TransactionDefinition接口中規(guī)定了7種類型的事務(wù)傳播行為,它們規(guī)定了事務(wù)方法和事務(wù)方法發(fā)生嵌套調(diào)用時(shí)事務(wù)如何進(jìn)行傳播:
PROPAGATION_REQUIRED:如果當(dāng)前沒(méi)有事務(wù),就新建一個(gè)事務(wù),如果已經(jīng)存在一個(gè)事務(wù)中,加入到這個(gè)事務(wù)中。這是最常見(jiàn)的選擇。
PROPAGATION_SUPPORTS:支持當(dāng)前事務(wù),如果當(dāng)前沒(méi)有事務(wù),就以非事務(wù)方式執(zhí)行。
PROPAGATION_MANDATORY:使用當(dāng)前的事務(wù),如果當(dāng)前沒(méi)有事務(wù),就拋出異常。
PROPAGATION_REQUIRES_NEW:新建事務(wù),如果當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起。
PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。
PROPAGATION_NEVER:以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。
PROPAGATION_NESTED:如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。如果當(dāng)前沒(méi)有事務(wù),則執(zhí)行與PROPAGATION_REQUIRED類似的操作。
Spring的隔離級(jí)別
1、Serializable:最嚴(yán)格的級(jí)別,事務(wù)串行執(zhí)行,資源消耗最大;
2、REPEATABLE READ:保證了一個(gè)事務(wù)不會(huì)修改已經(jīng)由另一個(gè)事務(wù)讀取但未提交(回滾)的數(shù)據(jù)。避免了“臟讀取”和“不可重復(fù)讀取”的情況,但是帶來(lái)了更多的性能損失。
3、READ COMMITTED:大多數(shù)主流數(shù)據(jù)庫(kù)的默認(rèn)事務(wù)等級(jí),保證了一個(gè)事務(wù)不會(huì)讀到另一個(gè)并行事務(wù)已修改但未提交的數(shù)據(jù),避免了“臟讀取”。該級(jí)別適用于大多數(shù)系統(tǒng)。
4、Read Uncommitted:保證了讀取過(guò)程中不會(huì)讀取到非法數(shù)據(jù)。
29.Ibatis框架和Hibernate框架各有什么特點(diǎn)?
【參考答案】
比較方面
Ibatis框架
Hibernate框架
從設(shè)計(jì)思路來(lái)看
從關(guān)系型開(kāi)始到對(duì)象型的思路來(lái)解決數(shù)據(jù)庫(kù)的操作問(wèn)題
從對(duì)象的角度的思路來(lái)解決數(shù)據(jù)庫(kù)的操作問(wèn)題
從方便性上來(lái)看
半自動(dòng)
全自動(dòng)
從sql語(yǔ)句書(shū)寫來(lái)看
要寫sql語(yǔ)句
一般不用寫,但是有時(shí)候我們還是要用書(shū)寫hql語(yǔ)句的
從映射角度來(lái)看
映射sql語(yǔ)句的輸入輸出參數(shù)
對(duì)數(shù)據(jù)庫(kù)表結(jié)構(gòu)來(lái)進(jìn)行映射
30.為什么要用ORM?和JDBC有何不一樣?
【參考答案】
orm是一種思想,就是把object對(duì)象轉(zhuǎn)變成數(shù)據(jù)庫(kù)中的記錄,或者把數(shù)據(jù)庫(kù)中的記錄轉(zhuǎn)變成object對(duì)象,我們可以用jdbc來(lái)實(shí)現(xiàn)這種思想,orm的思想本質(zhì)就是建立是JDBC上,對(duì)JDBC的一種封裝,這種封裝可以省去了直接使用jdbc的繁瑣細(xì)節(jié),提高了開(kāi)發(fā)效率,現(xiàn)在用的較多的ORM工具很多,一般我們公司采用的ORM框架主要有hibernate和MyBatis。當(dāng)然也聽(tīng)說(shuō)一些其他orm工具,如toplink,ojb等。
31.談?wù)勀銓?duì)SpringAOP思想的理解。
【參考答案】
AOP(Aspect-OrientedProgramming,面向方面編程),可以說(shuō)是OOP(Object-Oriented Programing,面向?qū)ο缶幊蹋┑难a(bǔ)充和完善。OOP引入封裝、繼承和多態(tài)性等概念來(lái)建立一種對(duì)象層次結(jié)構(gòu),用以模擬公共行為的一個(gè)集合。當(dāng)我們需要為分散的對(duì)象引入公共行為的時(shí)候,OOP則顯得無(wú)能為力。也就是說(shuō),OOP允許你定義從上到下的關(guān)系,但并不適合定義從左到右的關(guān)系。例如日志功能,日志代碼往往水平地散布在所有對(duì)象層次中,而與它所散布到的對(duì)象的核心功能毫無(wú)關(guān)系。對(duì)于其他類型的代碼,如安全性、異常處理和透明的持續(xù)性也是如此。這種散布在各處的無(wú)關(guān)的代碼被稱為橫切(cross-cutting)代碼,在OOP設(shè)計(jì)中,它導(dǎo)致了大量代碼的重復(fù),而不利于各個(gè)模塊的重用。而AOP技術(shù)則恰恰相反,它利用一種稱為“橫切”的技術(shù),剖解開(kāi)封裝的對(duì)象內(nèi)部,并將那些影響了多個(gè)類的公共行為封裝到一個(gè)可重用模塊,并將其名為“Aspect”,即方面。所謂“方面”,簡(jiǎn)單地說(shuō),就是將那些與業(yè)務(wù)無(wú)關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任封裝起來(lái),便于減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,并有利于未來(lái)的可操作性和可維護(hù)性。AOP代表的是一個(gè)橫向的關(guān)系,如果說(shuō)“對(duì)象”是一個(gè)空心的圓柱體,其中封裝的是對(duì)象的屬性和行為;那么面向方面編程的方法,就仿佛一把利刃,將這些空心圓柱體剖開(kāi),以獲得其內(nèi)部的消息。而剖開(kāi)的切面,也就是所謂的“方面”了。然后它又以巧奪天功的妙手將這些剖開(kāi)的切面復(fù)原,不留痕跡。
使用“橫切”技術(shù),AOP把軟件系統(tǒng)分為兩個(gè)部分:核心關(guān)注點(diǎn)和橫切關(guān)注點(diǎn)。業(yè)務(wù)處理的主要流程是核心關(guān)注點(diǎn),與之關(guān)系不大的部分是橫切關(guān)注點(diǎn)。橫切關(guān)注點(diǎn)的一個(gè)特點(diǎn)是,他們經(jīng)常發(fā)生在核心關(guān)注點(diǎn)的多處,而各處都基本相似。比如權(quán)限認(rèn)證、日志、事務(wù)處理。Aop的作用在于分離系統(tǒng)中的各種關(guān)注點(diǎn),將核心關(guān)注點(diǎn)和橫切關(guān)注點(diǎn)分離開(kāi)來(lái)。
實(shí)現(xiàn)AOP的技術(shù),主要分為兩大類:一是采用動(dòng)態(tài)代理技術(shù),利用截取消息的方式,對(duì)該消息進(jìn)行裝飾,以取代原有對(duì)象行為的執(zhí)行;二是采用靜態(tài)織入的方式,引入特定的語(yǔ)法創(chuàng)建“方面”,從而使得編譯器可以在編譯期間織入有關(guān)“方面”的代碼。
32.談?wù)勀銓?duì)Spring的理解。
【參考答案】
1.Spring實(shí)現(xiàn)了工廠模式的工廠類(在這里有必要解釋清楚什么是工廠模式),這個(gè)類名為BeanFactory(實(shí)際上是一個(gè)接口),在程序中通常BeanFactory的子類ApplicationContext。Spring相當(dāng)于一個(gè)大的工廠類,在其配置文件中通過(guò)元素配置用于創(chuàng)建實(shí)例對(duì)象的類名和實(shí)例對(duì)象的屬性。
2. Spring提供了對(duì)IOC良好支持,IOC是一種編程思想,是一種架構(gòu)藝術(shù),利用這種思想可以很好地實(shí)現(xiàn)模塊之間的解耦。IOC也稱為DI(Depency Injection)。
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類。
33.說(shuō)說(shuō)struts1與struts2的區(qū)別。【首都信息面試題】
【參考答案】
從以下幾個(gè)方面來(lái)一一總結(jié)Struts1與Struts2的區(qū)別:
①Servlet依賴性
由于Action在被調(diào)用時(shí),HttpServletRequest和HttpServletResponse被傳遞到execute()方法中,Struts1中的Action對(duì)Servlet的API是有依賴性的.但如果在Struts2中,Action就不會(huì)對(duì)容器有依賴了,因?yàn)锳ction是由簡(jiǎn)單的POJO組成的.在Struts2中,servlet上下文以簡(jiǎn)單的Map的形式表現(xiàn)出來(lái),這使得Action可以得到獨(dú)立的測(cè)試.如果需要,Struts2也可以訪問(wèn)原始的請(qǐng)求與響應(yīng)。不過(guò),其他的框架元素減少或排除直接訪問(wèn)HttpServetRequest或HttpServletResponse的必要。
②Action類
使用抽象類而不是接口設(shè)計(jì)是Struts1設(shè)計(jì)上的問(wèn)題,這已經(jīng)在Struts2中得到了解決.Struts1中的Action類需要繼承框架中依賴的抽象基礎(chǔ)類.但在Struts2中,Action類可能會(huì)也可能不會(huì)實(shí)現(xiàn)接口來(lái)啟用可選的或者自定義的服務(wù).在Struts2中,Action是不會(huì)依賴于容器的,因?yàn)樗怯珊?jiǎn)單的POJO組成的.Struts2提供了一個(gè)基礎(chǔ)的ActionSupport類來(lái)實(shí)現(xiàn)一些常用的接口。盡管這樣,Action接口仍然不是必須要繼承的,任何含有execute方法的POJO對(duì)象都可以當(dāng)作Action對(duì)象來(lái)用。
③驗(yàn)證
Struts1與Struts2都支持通過(guò)validate方法的手動(dòng)驗(yàn)證.Struts1使用ActionForm中的validate方法或者通過(guò)擴(kuò)展Commons Validator來(lái)進(jìn)行校驗(yàn).然而,Struts2支持通過(guò)Validate方法與Xwork校驗(yàn)框架的手動(dòng)驗(yàn)證.Xwork框架支持驗(yàn)證鏈到子屬性----使用為屬性類文件和校驗(yàn)上下文定義的驗(yàn)證.
④線程模型
在Struts1中,Action資源一定是線程安全或者同步的.所以Action是singletons并且線程安全的,一定只有一個(gè)Action類的實(shí)例處理該Action的所有請(qǐng)求,singleton策略限制了Struts1的Action所能完成的,并且需要更加謹(jǐn)慎的開(kāi)發(fā).但是在Struts2中,Action對(duì)象對(duì)每一個(gè)請(qǐng)求都生成實(shí)例,所以在Struts2中不存在線程安全的問(wèn)題。
⑤易測(cè)性
測(cè)試Struts1的程序會(huì)有些復(fù)雜.測(cè)試Struts1 Action的主要它依賴容器。但是在Struts2中,Action可以經(jīng)由創(chuàng)建Action的實(shí)例,設(shè)置屬性和調(diào)用方法來(lái)得到測(cè)試。Struts2中的測(cè)試是很簡(jiǎn)單的,不依賴于容器。
⑥獲取輸入
Struts1使用ActionForm來(lái)捕獲輸入,而且所有的ActionForm需要繼承一個(gè)框架依賴的基類.由于JavaBean不能當(dāng)作ActionForm來(lái)用,開(kāi)發(fā)人員不得不創(chuàng)建冗繁的類來(lái)獲取輸入.不過(guò)Struts2使用Action屬性(例如輸入屬性不依賴于底層框架)這避免了需要?jiǎng)?chuàng)建第二個(gè)輸入對(duì)象,從此冗繁減少了.此外在Struts2中,Action的屬性可以通過(guò)標(biāo)簽在web頁(yè)面中得到訪問(wèn),POJO表單對(duì)象和POJO Action.甚至富對(duì)象類型,包括業(yè)務(wù)或域?qū)ο?都可以被當(dāng)作輸入/輸出對(duì)象來(lái)使用。
⑦表達(dá)式語(yǔ)言
Struts1與JSTL整合,所以它使用JSTL表達(dá)式語(yǔ)言.Struts1的表達(dá)式語(yǔ)言含有遍歷圖表的基礎(chǔ)對(duì)象,但是在集合和索引屬性的支持上表現(xiàn)不好.Struts2同樣支持JSTL,但是它也支持一種更強(qiáng)大且靈活的表達(dá)式語(yǔ)言----“對(duì)象圖標(biāo)記語(yǔ)言”(OGNL)
⑧將綁定值到視圖中
在視圖層,Struts1使用標(biāo)準(zhǔn)的JSP來(lái)綁定對(duì)象(在模型層被處理的)到頁(yè)面上下文來(lái)進(jìn)行訪問(wèn).然而Struts2使用一種叫做值棧的技術(shù),這使得標(biāo)簽可以訪問(wèn)值而不需將視圖與正在呈遞的對(duì)象類型連接起來(lái).值棧允許重用一些屬性名相同但類型不同的視圖類型.
⑨類型轉(zhuǎn)換
通常Struts1的ActionForm屬性都是String型的。Struts1使用Commons-Beanutils進(jìn)行類型轉(zhuǎn)換,這些針對(duì)每一個(gè)類的類型轉(zhuǎn)換無(wú)法為每一個(gè)實(shí)例配置。然而Struts2使用OGNL來(lái)進(jìn)行類型轉(zhuǎn)換.框架包含了針對(duì)基礎(chǔ)類型,常見(jiàn)對(duì)象類型與原始類型的轉(zhuǎn)換器。
⑩Action的生存周期
Struts1支持對(duì)每一個(gè)模塊的請(qǐng)求處理器的分離(生命周期),但是同一模塊下的所有Action必須共享相同的生命周期。Struts2支持通過(guò)攔截器棧為每一個(gè)Action創(chuàng)建不同的生命周期.自定義棧可以視需要對(duì)不同的Action使用.
34.簡(jiǎn)述Hibernate和JDBC的優(yōu)缺點(diǎn)?如何書(shū)寫一個(gè)one to many配置文件
【參考答案】
1、封裝了jdbc,簡(jiǎn)化了很多重復(fù)性代碼。
2、簡(jiǎn)化了DAO層編碼工作,使開(kāi)發(fā)更對(duì)象化了。
3、移植性好,支持各種數(shù)據(jù)庫(kù),如果換個(gè)數(shù)據(jù)庫(kù)只要在配置文件中變換配置就可以了,不用改變hibernate代碼。
4、支持透明持久化,因?yàn)閔ibernate操作的是純粹的(pojo)java類,沒(méi)有實(shí)現(xiàn)任何接口,沒(méi)有侵入性。
說(shuō)明:
One to many配置見(jiàn)下題
35.寫Hibernate的一對(duì)多和多對(duì)一雙向關(guān)聯(lián)的orm配置?
【參考答案】
配置一對(duì)多
多對(duì)一
36.hibernate的inverse屬性的作用?
【參考答案】
在Hibernate中,術(shù)語(yǔ)inverse是反轉(zhuǎn)的意思,在關(guān)聯(lián)關(guān)系中,inverse="false"為主控方,由主控方負(fù)責(zé)維護(hù)對(duì)象的關(guān)聯(lián)關(guān)系,如果設(shè)為主控方對(duì)象,主控對(duì)象更新,則負(fù)責(zé)更新另一方對(duì)象更新。
37.Spring的依賴注入是什么意思?給一個(gè)Bean的message屬性,字符串類型,注入值為"Hello"的XML配置文件該怎么寫?
【參考答案】
依賴注入(Dependency Injection)和控制反轉(zhuǎn)(Inversion of Control)是同一個(gè)概念。具體含義是:當(dāng)某一個(gè)Java類,需要另一個(gè)Java類的協(xié)助時(shí),在傳統(tǒng)的程序設(shè)計(jì)過(guò)程中,通常由當(dāng)前類(調(diào)用者)來(lái)創(chuàng)建被調(diào)用者的實(shí)例,然后使用被調(diào)用者的方法。但在Spring里,創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來(lái)完成,而是由其它類(往往是工廠類)或容器(Spring IOC容器)完成,當(dāng)前調(diào)用者從其它類或容器中來(lái)獲取被調(diào)用者的實(shí)例,這種方式稱為控制反轉(zhuǎn);創(chuàng)建被調(diào)用者實(shí)例的工作通常由Spring容器來(lái)完成,然后注入調(diào)用者,因此也稱為依賴注入,這是Spring的一種編程思想的體現(xiàn)。
依賴注入在設(shè)計(jì)模式也體現(xiàn)得非常多,比如說(shuō)工廠模式和構(gòu)建模式,這種就是一個(gè)依賴注入的實(shí)現(xiàn)
38.JDO是什么?
【參考答案】
JDO是Java對(duì)象持久化的新的規(guī)范,為java data object的簡(jiǎn)稱,也是一個(gè)用于存取某種數(shù)據(jù)倉(cāng)庫(kù)中的對(duì)象的標(biāo)準(zhǔn)化API。JDO提供了透明的對(duì)象存儲(chǔ),因此對(duì)開(kāi)發(fā)人員來(lái)說(shuō),存儲(chǔ)數(shù)據(jù)對(duì)象完全不需要額外的代碼(如JDBC API的使用)。這些繁瑣的例行工作已經(jīng)轉(zhuǎn)移到JDO產(chǎn)品提供商身上,使開(kāi)發(fā)人員解脫出來(lái),從而集中時(shí)間和精力在業(yè)務(wù)邏輯上。另外,JDO很靈活,因?yàn)樗梢栽谌魏螖?shù)據(jù)底層上運(yùn)行。JDBC只是面向關(guān)系數(shù)據(jù)庫(kù)(RDBMS)JDO更通用,提供到任何數(shù)據(jù)底層的存儲(chǔ)功能,比如關(guān)系數(shù)據(jù)庫(kù)、文件、XML以及對(duì)象數(shù)據(jù)庫(kù)(ODBMS)等等,使得應(yīng)用可移植性更強(qiáng)。
39.Spring與EJB的區(qū)別?
【參考答案】
①提供商無(wú)關(guān)性
EJB 3.0是一個(gè)被設(shè)計(jì)為對(duì)提供商沒(méi)有依賴性的開(kāi)放的標(biāo)準(zhǔn)。EJB 3.0規(guī)范由企業(yè)JAVA社區(qū)的主流開(kāi)源組織和廠商共同編寫和支持的。EJB 3.0框架使開(kāi)發(fā)者的應(yīng)用程序?qū)崿F(xiàn)可以獨(dú)立于應(yīng)用服務(wù)器。而Spring一直是一個(gè)非標(biāo)準(zhǔn)的技術(shù),盡管你在任何應(yīng)用服務(wù)器都上可以使用Spring框架,但基于Spring的應(yīng)用仍然被限制于Spring本身和在你的應(yīng)用中使用到的Spring提供的各種特別服務(wù)。
②服務(wù)整合
Spring框架是建立在應(yīng)用服務(wù)器和服務(wù)庫(kù)之上,它的服務(wù)整合代碼(如數(shù)據(jù)訪問(wèn)模板和Helper類)是基于框架的,并暴露給應(yīng)用開(kāi)發(fā)者。相反,EJB 3.0框架是緊密整合到應(yīng)用服務(wù)器中的,它的服務(wù)整合代碼是封裝在一個(gè)標(biāo)準(zhǔn)的接口下的。
③服務(wù)聚合的靈活性
由于Spring中的服務(wù)整合代碼是作為編程接口暴露給應(yīng)用開(kāi)發(fā)者的,因此開(kāi)發(fā)人員可以根據(jù)需要來(lái)聚合多個(gè)服務(wù)。這個(gè)特性使你可以集成一個(gè)你自己的“輕量”級(jí)應(yīng)用服務(wù)器。通常,EJB 3.0應(yīng)用服務(wù)器不提供給開(kāi)發(fā)者這種按照你的需要來(lái)選擇服務(wù)的靈活性。大多數(shù)情況,你會(huì)得到一系列已經(jīng)預(yù)先打包好的特性,其中有些你可能是不需要的。
④聲明式服務(wù)
EJB 3.0和Spring都將運(yùn)行時(shí)服務(wù)(如事務(wù)管理、安全、日志、消息、和信息服務(wù))連接給應(yīng)用程序。由于這些服務(wù)同應(yīng)用程序的業(yè)務(wù)邏輯并不是直接相關(guān)的,因此,它們不被應(yīng)用程序本身來(lái)管理。相反,這些服務(wù)被服務(wù)容器(如EJB 3.0和Spring)以不可見(jiàn)的方式在運(yùn)行時(shí)提供給應(yīng)用程序。開(kāi)發(fā)人員(或系統(tǒng)管理員)通過(guò)配置來(lái)告訴容器什么時(shí)候,以怎樣的方式來(lái)應(yīng)用這些服務(wù)。
⑤注射依賴
Spring和EJB 3.0都提供了大量的DI模式支持。但是,它們之間也有著根本的不同。Spring支持了通常意義上的但是復(fù)雜的基于XML配置文件的注射依賴API;EJB 3.0支持的注射大多數(shù)通用服務(wù)對(duì)象(如,EJB和容器對(duì)象)和JNDI對(duì)象,它通過(guò)簡(jiǎn)單的JAVA注解來(lái)完成。
40.SSH框架的優(yōu)缺點(diǎn)。【北京科瑞明面試題】
【參考答案】
先說(shuō)說(shuō)Struts:
1.struts第一個(gè)優(yōu)點(diǎn)應(yīng)該是實(shí)現(xiàn)了MVC。
對(duì)Servlet依賴減少,低侵入式的設(shè)計(jì)
2.Action線程安全的設(shè)計(jì)
3.功能強(qiáng)大的OGNL表達(dá)式使用。
4.支持多種復(fù)合視圖,表現(xiàn)層的使用也多樣化,像JSP\freeMarker\Velocity。
5.?dāng)r截器的應(yīng)用,實(shí)現(xiàn)了AOP的思想,方便重用與擴(kuò)展
6.自動(dòng)類型轉(zhuǎn)換功能。
7.相對(duì)低粗度的數(shù)據(jù)驗(yàn)證功能
Struts缺點(diǎn):
Struts2中Action中取得從jsp中傳過(guò)來(lái)的參數(shù)時(shí),如果頁(yè)面過(guò)于復(fù)雜,會(huì)造成對(duì)象臃腫。
Spring優(yōu)點(diǎn):
1、非常優(yōu)秀的輕量級(jí),低侵入式的框架。
2、IOC的容器周期式的管理,降低組件的偶合。
3、對(duì)其它容器有非常好的支持,像對(duì)持久層的Hibernate、Ibaits、TOP Link
等。
Spring缺點(diǎn):
1.Web層的MVC框架單過(guò)于單薄,對(duì)頁(yè)面框架的支持,跟其它框架還有很大的差距。
2.不是一站式解決方案。
3.使用了反射來(lái)管理其容器中的bean,在程序中增大了內(nèi)存和運(yùn)行計(jì)算的時(shí)間。
4.部分組件功能還有待完善
Hibernate的優(yōu)點(diǎn):
1、非常好的ORM的框架,在MVC的切分和JDBC的封裝上做的很好。
缺點(diǎn):
1、對(duì)復(fù)雜查詢,多變的查詢,完成起來(lái)有難度。
2、自動(dòng)化程序高,改寫靈活性不夠。
2、緩存不是太高效,所以有些企業(yè)單獨(dú)會(huì)選擇緩存框架或者棄用Hibernate的原因之一。
41.Spring有哪幾種注入方式?
【參考答案】
3種方法。構(gòu)造屬入、屬性注入、接口注入
42.Hibernate原理
【參考答案】
1.讀取并解析配置文件
2.讀取并解析映射信息,創(chuàng)建SessionFactory
3.打開(kāi)Sesssion
4.創(chuàng)建事務(wù)Transation
5.持久化操作
6.提交事務(wù)
7.關(guān)閉Session
8.關(guān)閉SesstionFactory
43.Spring MVC工作機(jī)制及為什么要用?【杭州網(wǎng)闕科技】
【參考答案】
1、客戶端所有的請(qǐng)求都提交給DispatcherServlet,它會(huì)委托應(yīng)用系統(tǒng)的其他模塊負(fù)責(zé)負(fù)責(zé)對(duì)請(qǐng)求進(jìn)行真正的處理工作。
2.DispatcherServlet查詢一個(gè)或多個(gè)HandlerMapping,找到處理請(qǐng)求的Controller.
3.DispatcherServlet請(qǐng)請(qǐng)求提交到目標(biāo)Controller
4.Controller進(jìn)行業(yè)務(wù)邏輯處理后,會(huì)返回一個(gè)ModelAndView
5.Dispathcher查詢一個(gè)或多個(gè)ViewResolver視圖解析器,找到ModelAndView對(duì)象指定的視圖對(duì)象
6.視圖對(duì)象負(fù)責(zé)渲染返回給客戶端。
44.spring中常用的幾種advice
【參考答案】
BeforeAdvice(前織入)、AfterAdvice(后織入)、ArroundAdvice(前后織入)ThrowAdvice(異常織入)
45.Spring中bean的配置scope表示什么含義?可以有哪幾種取值。
【參考答案】
scope表示Bean的生命周期或者叫Bean的作用域。scope的值有兩個(gè):
1、singleton,為單例屬性,即Spring IoC容器只會(huì)創(chuàng)建該bean的唯一一個(gè)實(shí)例,這也是默認(rèn)的。
2、prototype為原型屬性,即每一次請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的bean實(shí)例。
46.Hibernate對(duì)象有幾種狀態(tài)?如何轉(zhuǎn)換
【參考答案】
共3種狀態(tài),分別是:Transient狀態(tài)(瞬時(shí))、Persient狀態(tài)(持久)、Detached(脫管狀態(tài))狀態(tài)。
47.spring中OpenSessionInViewFilter作用什么的,解決了什么問(wèn)題
【參考答案】
解決Hibernate的Session的關(guān)閉與開(kāi)啟問(wèn)題。
SSH整合問(wèn)題:Hibernate允許對(duì)關(guān)聯(lián)對(duì)象、屬性進(jìn)行延遲加載,但是必須保證延遲加載的操作限于同一個(gè)Hibernate Session范圍之內(nèi)進(jìn)行。如果Service層返回一個(gè)啟用了延遲加載功能的領(lǐng)域?qū)ο蠼oWeb層,當(dāng)Web層訪問(wèn)到那些需要延遲加載的數(shù)據(jù)時(shí),由于加載領(lǐng)域?qū)ο蟮腍ibernate Session已經(jīng)關(guān)閉,這些導(dǎo)致延遲加載數(shù)據(jù)的訪問(wèn)異常。而Spring為我們提供的OpenSessionInViewFilter過(guò)濾器為我們很好的解決了這個(gè)問(wèn)題。OpenSessionInViewFilter的主要功能是用來(lái)把一個(gè)Hibernate Session和一次完整的請(qǐng)求過(guò)程對(duì)應(yīng)的線程相綁定,允許在事務(wù)提交之后延遲加載顯示所需要的對(duì)象。實(shí)現(xiàn)"Open Session in View"的模式。
【補(bǔ)充說(shuō)明】
配置如下:
Spring OpenSessionInViewFilter
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
sessionFactoryBean
sessionFactory
Spring OpenSessionInViewFilter
/*
一般在項(xiàng)目中SSH整合時(shí),我們會(huì)加入上面的配置,解決延遲加載時(shí)的異常。
48.hibernate有哪五個(gè)核心接口。
【參考答案】
Configuration接口,SessionFactory接口,Session接口,Transaction接口,Query和Criteria接口
49.Hibernate中有幾種關(guān)系映射【嘉瑞互動(dòng)】
【參考答案】
主要有單向一對(duì)一、單向一對(duì)多、單向多對(duì)一、單向多對(duì)多、雙向一對(duì)一、雙向一對(duì)多、雙向多對(duì)多。
50.介紹一下Hibernate的一級(jí)緩存與二級(jí)緩存。
緩存就是把以前從數(shù)據(jù)庫(kù)中查詢出來(lái)和使用過(guò)的對(duì)象保存在內(nèi)存中(一個(gè)數(shù)據(jù)結(jié)構(gòu)中),這個(gè)數(shù)據(jù)結(jié)構(gòu)通常是或類似Hashmap,當(dāng)以后要使用某個(gè)對(duì)象時(shí),先查詢緩存中是否有這個(gè)對(duì)象,如果有則使用緩存中的對(duì)象,如果沒(méi)有則去查詢數(shù)據(jù)庫(kù),并將查詢出來(lái)的對(duì)象保存在緩存中,以便下次使用。Hibernate的Session就是一種緩存,我們通常將之稱為Hibernate的一級(jí)緩存,當(dāng)想使用session從數(shù)據(jù)庫(kù)中查詢出一個(gè)對(duì)象時(shí),Session也是先從自己內(nèi)部查看是否存在這個(gè)對(duì)象,存在則直接返回,不存在才去訪問(wèn)數(shù)據(jù)庫(kù),并將查詢的結(jié)果保存在自己內(nèi)部。由于Session代表一次會(huì)話過(guò)程,一個(gè)Session與一個(gè)數(shù)據(jù)庫(kù)連接相關(guān)連,所以Session最好不要長(zhǎng)時(shí)間保持打開(kāi),通常僅用于一個(gè)事務(wù)當(dāng)中,在事務(wù)結(jié)束時(shí)就應(yīng)關(guān)閉。并且Session是線程不安全的,被多個(gè)線程共享時(shí)容易出現(xiàn)問(wèn)題。通常只有那種全局意義上的緩存才是真正的緩存應(yīng)用,才有較大的緩存價(jià)值,因此,Hibernate的Session這一級(jí)緩存的緩存作用并不明顯,應(yīng)用價(jià)值不大。
Hibernate的二級(jí)緩存就是要為Hibernate配置一種全局緩存,讓多個(gè)線程和多個(gè)事務(wù)都可以共享這個(gè)緩存。一般我們叫它sessionFactory緩存,也叫進(jìn)程級(jí)的緩存,使用第3方插件實(shí)現(xiàn)的,也值緩存實(shí)體,生命周期和sessionFactory一致,可以進(jìn)行管理。
二級(jí)緩存具體實(shí)現(xiàn):
首先配置第3放插件,我們用的是EHCache,在hibernate.cfg.xml文件中加入
true
在映射中也要顯示的調(diào)用,
二級(jí)緩存之查詢緩存:對(duì)普通屬性進(jìn)行緩存。如果關(guān)聯(lián)的表發(fā)生了修改,那么查詢緩存的生命周期也結(jié)束了。
在程序中必須手動(dòng)啟用查詢緩存:query.setCacheable(true);
51.如何在WEB里面配置SPRING【首都信息面試題】
【參考答案】
主要配置Spring ?Web監(jiān)聽(tīng)器
52.Hibernate中的Cascade屬性有什么作用?
cascade屬性的作用是描述關(guān)聯(lián)對(duì)象進(jìn)行操作時(shí)的級(jí)聯(lián)特性。可以有以下幾種取值:
all :所有情況下均進(jìn)行關(guān)聯(lián)操作。
save-update:(級(jí)聯(lián)保存)表明保存或更新當(dāng)前對(duì)象時(shí)會(huì)級(jí)聯(lián)保存或更新他所關(guān)聯(lián)的對(duì)象。
none:所有情況下均不進(jìn)行關(guān)聯(lián)操作。這是默認(rèn)值。
delete:(級(jí)聯(lián)刪除)級(jí)聯(lián)刪除所關(guān)聯(lián)的對(duì)象。
all-delete-orphan:自動(dòng)刪除不再和父對(duì)象關(guān)聯(lián)的子對(duì)象。并且,在出現(xiàn)上面兩種情況時(shí)執(zhí)行上面兩種的功能,可以說(shuō)是一個(gè)全自動(dòng)的屬性值。
53.Struts1優(yōu)缺點(diǎn)
【參考答案】
優(yōu)點(diǎn):
1)實(shí)現(xiàn)MVC模式,結(jié)構(gòu)清晰,使開(kāi)發(fā)者只關(guān)注業(yè)務(wù)邏輯的實(shí)現(xiàn).
2)有豐富的tag可以用,Struts的標(biāo)記庫(kù)(Taglib),如能靈活動(dòng)用,則能大大提高開(kāi)發(fā)效率
3)頁(yè)面導(dǎo)航
4)使系統(tǒng)的脈絡(luò)更加清晰。通過(guò)一個(gè)配置文件,即可把握整個(gè)系統(tǒng)各部分之間的聯(lián)系,這對(duì)于后期的維護(hù)有著莫大的好處。尤其是當(dāng)另一批開(kāi)發(fā)者接手這個(gè)項(xiàng)目時(shí),這種優(yōu)勢(shì)體現(xiàn)得更加明顯。
5)提供Exception處理機(jī)制。
6)數(shù)據(jù)庫(kù)鏈接池管理。
7)支持I18N (國(guó)際化)
缺點(diǎn)
1)轉(zhuǎn)到展示層時(shí),需要配置forward,如果有十個(gè)展示層的jsp,需要配置十次struts,而且還不包括有時(shí)候目錄、文件變更,需要重新修改forward,注意,每
2)Struts的Action必需是thread-safe方式,它僅僅允許一個(gè)實(shí)例去處理所有的請(qǐng)求。所以action用到的所有的資源都必需統(tǒng)一同步,這個(gè)就引起了線程安全的問(wèn)題。
3)測(cè)試不方便. Struts的每個(gè)Action都同Web層耦合在一起,這樣它的測(cè)試依賴于Web容器,單元測(cè)試也很難實(shí)現(xiàn)
4)類型的轉(zhuǎn)換. Struts的FormBean把所有的數(shù)據(jù)都作為String類型,它可以使用工具Commons-Beanutils進(jìn)行類型轉(zhuǎn)化。但它的轉(zhuǎn)化都是在Class級(jí)別,而且轉(zhuǎn)化的類型是不可配置的。
5)對(duì)Servlet的依賴性過(guò)強(qiáng). Struts處理Action時(shí)必需要依賴ServletRequest和ServletResponse,所有它擺脫不了Servlet容器。
6)前端表達(dá)式語(yǔ)言方面集成了JSTL,所以它主要使用JSTL的表達(dá)式語(yǔ)言來(lái)獲取數(shù)據(jù)。可是JSTL的表達(dá)式語(yǔ)言在Collection和索引屬性方面處理顯得很弱。
7)對(duì)Action執(zhí)行的控制困難. Struts創(chuàng)建一個(gè)Action,如果想控制它的執(zhí)行順序?qū)?huì)非常困難。
8)對(duì)Action執(zhí)行前和后的處理. Struts處理Action的時(shí)候是基于class的hierarchies,很難在action處理前和后進(jìn)行操作。
9)對(duì)事件支持不夠.在struts中,實(shí)際是一個(gè)表單Form對(duì)應(yīng)一個(gè)Action類(或DispatchAction),換一句話說(shuō):在Struts中實(shí)際是一個(gè)表單只能對(duì)應(yīng)一個(gè)事件。
54.整合spring與struts1的方法,那種最好,為什么?
【參考答案】
答:1.第一種方法:
Struts的Action繼承Spring的ActionSupport類,并在Action中獲取Spring的ApplicationContext。這是最簡(jiǎn)單的一種整合方式,但有三個(gè)缺點(diǎn):第一,Struts與Spring緊密耦合,不能改換到其他IoC容器;第二,難以使用Spring AOP特性;第三,對(duì)于需要使用DispatchAction的Struts應(yīng)用無(wú)能為力。
2.第二種方法:
在Struts的配置文件中,以Spring的DelegatingRequestProcessor類代替Struts的RequestProcessor類,并在Spring的配置文件中定義與Struts配置文件中對(duì)應(yīng)的bean,從而將Struts的Action與Spring分開(kāi),并把Struts的動(dòng)作置于Spring的控制之下。這種整合方式的優(yōu)點(diǎn)是將不再依賴Spring這個(gè)特定的IoC容器,但必須依賴Struts的RequestProcessor類。
3.第三種方法:
通過(guò)Spring的DelegatingActionProxy類代理Struts的動(dòng)作,即在Struts配置文件中,定義的type屬性全部改為DelegatingActionProxy,而不是具體的類名,并在Spring配置文件中定義與Struts動(dòng)作映射對(duì)應(yīng)的bean,從而將Struts的Action與Spring分開(kāi),并把Struts的動(dòng)作置于Spring的控制之下。無(wú)疑,這是最靈活的一種整合方式。
【分析】
注意一般說(shuō)幾種整合方式所指的就是Struts1
55.Struts1.2的工作原理
【參考答案】
1.ActionServlet核心控制器會(huì)攔截所有*.do的請(qǐng)求
2.從struts-config.xml中找到用戶請(qǐng)求的Action
3.通過(guò)struts-config.xml中的配置再去找這個(gè)Action對(duì)應(yīng)的ActionForm,并實(shí)例化
4.把用戶填寫的數(shù)據(jù)自動(dòng)填充到ActionForm中(調(diào)用ActionForm中的setXX()方法填充)
5.同時(shí)把ActionForm放入到指定的范圍中(request,session)
6.然后把請(qǐng)求轉(zhuǎn)發(fā)給Action
7.Action獲取ActionForm中的值然后調(diào)用業(yè)務(wù)邏輯層實(shí)現(xiàn)功能
8.在通過(guò)ActionMapping查找Actionforward實(shí)現(xiàn)轉(zhuǎn)發(fā);
56.談?wù)?/i>Struts1中的ActionServlet。
【參考答案】
中心控制器,負(fù)責(zé)所以請(qǐng)求處理,并根據(jù)配置文件,將請(qǐng)求轉(zhuǎn)到指定Action執(zhí)行,并根據(jù)Action的ActionForward返回,轉(zhuǎn)到指定視圖。
57.Struts1.X中ActionServlet、ActionForm、Action、ActionMapping各起什么作用?
【參考答案】
a.Actionservlet為控制器,接受用戶請(qǐng)求并派發(fā)給相應(yīng)的Action組件處理;
b.ActionForm主要用于封裝請(qǐng)求中的數(shù)據(jù)和簡(jiǎn)單驗(yàn)證
c.Action組件具體對(duì)用戶的請(qǐng)求進(jìn)行處理
d.ActionMapping封裝當(dāng)前用戶請(qǐng)求Action相關(guān)的配置信息
58.Struts 1的Action類與Struts 2的Action類區(qū)別?
【參考答案】
Struts 1要求Action類要擴(kuò)展自一個(gè)抽象基類。Struts 1的一個(gè)共有的問(wèn)題是面向抽象類編程而不是面向接口編程。
Struts 2的Action類實(shí)現(xiàn)了一個(gè)Action接口,連同其他接口一起實(shí)現(xiàn)可選擇和自定義的服務(wù)。
Struts 1 Action類是單例類,因只有一個(gè)示例控制所有的請(qǐng)求。
Struts 2 Action對(duì)象每一個(gè)請(qǐng)求都實(shí)例化對(duì)象,所以沒(méi)有程安全的問(wèn)題。
59.談?wù)勀銓?duì)Struts1的理解。
【參考答案】
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去處理。
2.ActionServlet把請(qǐng)求交給action去處理之前,會(huì)將請(qǐng)求參數(shù)封裝成一個(gè)formbean對(duì)象(就是一個(gè)java類,這個(gè)類中的每個(gè)屬性對(duì)應(yīng)一個(gè)請(qǐng)求參數(shù))
3.要說(shuō)明的是,ActionServlet把formbean對(duì)象傳遞給action的execute方法之前,可能會(huì)調(diào)用formbean的validate方法進(jìn)行校驗(yàn),只有校驗(yàn)通過(guò)后才將這個(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ì)象通過(guò)struts-config.xml配置文件中的配置關(guān)聯(lián)到某個(gè)jsp頁(yè)面,因?yàn)槌绦蛑惺褂玫氖窃趕truts-config.xml配置文件為jsp頁(yè)面設(shè)置的邏輯名,這樣可以實(shí)現(xiàn)action程序代碼與返回的jsp頁(yè)面名稱的解耦。
60.Struts1中的action是安全線程么?為什么
【參考答案】
Servlet是在多線程環(huán)境下的。即可能有多個(gè)請(qǐng)求發(fā)給一個(gè)servelt實(shí)例,每個(gè)請(qǐng)求是一個(gè)線程。
struts下的action也類似,同樣在多線程環(huán)境下。
為多線程環(huán)境編寫代碼。我們的controller servlet指揮創(chuàng)建你的Action類的一個(gè)實(shí)例,用此實(shí)例來(lái)服務(wù)所有的請(qǐng)求。因此,你必須編寫線程安全的Action類。遵循與寫線程安全的servlet同樣的方針。
61.在Struts1中actionform屬于哪一層
【參考答案】
屬于視圖層組件,負(fù)責(zé)封裝頁(yè)面表單數(shù)據(jù)。
62.struts控制器組件的主要包括?
【參考答案】
ActionServlet組件:充當(dāng)struts框架的中央控制器。
RequestProcessor組件,充當(dāng)每個(gè)子應(yīng)用模塊的請(qǐng)求處理器
Action組件,負(fù)責(zé)處理一項(xiàng)具體的業(yè)務(wù)。
63.常見(jiàn)的緩存技術(shù)舉例【大唐動(dòng)力面試題】
【參考答案】
操作系統(tǒng)磁盤緩存->減少磁盤機(jī)械操作
數(shù)據(jù)庫(kù)緩存->減少文件系統(tǒng)I/O
應(yīng)用程序緩存->減少對(duì)數(shù)據(jù)庫(kù)的查詢
Web服務(wù)器緩存->減少應(yīng)用服務(wù)器請(qǐng)求
客戶端瀏覽器緩存->減少對(duì)網(wǎng)站的訪問(wèn)
64.以Spring為基礎(chǔ)的J2EE項(xiàng)目中,一般如何分層?每個(gè)層的作用是什么?事務(wù)控制放在哪一層?
一般分為持久層(DAO層)、業(yè)務(wù)層(Service層)、控制層、視圖層;
事務(wù)一般放在業(yè)務(wù)層,以一個(gè)業(yè)務(wù)作為一個(gè)事務(wù)分割的最小單位。