您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Java有哪些框架面試題”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Java有哪些框架面試題”吧!
71,談?wù)勀銓truts的理解。
1. struts是一個(gè)按MVC模式設(shè)計(jì)的Web層框架,其實(shí)它就是一個(gè)Servlet,這個(gè)Servlet名為ActionServlet,或是ActionServlet的子類。我們可以在web.xml文件中將符合某種特征的所有請求交給這個(gè)Servlet處理,這個(gè)Servlet再參照一個(gè)配置文件將各個(gè)請求分別分配給不同的action去處理。
(struts的配置文件可以有多個(gè),可以按模塊配置各自的配置文件,這樣可以防止配置文件的過度膨脹)
2.ActionServlet把請求交給action去處理之前,會(huì)將請求參數(shù)封裝成一個(gè)formbean對象(就是一個(gè)java類,這個(gè)類中的每個(gè)屬性對應(yīng)一個(gè)請求參數(shù)),
3.要說明的是, ActionServlet把formbean對象傳遞給action的execute方法之前,可能會(huì)調(diào)用formbean的validate方法進(jìn)行校驗(yàn),只有校驗(yàn)通過后才將這個(gè)formbean對象傳遞給action的execute方法,否則,它將返回一個(gè)錯(cuò)誤頁面,這個(gè)錯(cuò)誤頁面由input屬性指定。
4.action執(zhí)行完后要返回顯示的結(jié)果視圖,這個(gè)結(jié)果視圖是用一個(gè)ActionForward對象來表示的,actionForward對象通過struts-config.xml配置文件中的配置關(guān)聯(lián)到某個(gè)jsp頁面,因?yàn)槌绦蛑惺褂玫氖窃趕truts-config.xml配置文件為jsp頁面設(shè)置的邏輯名,這樣可以實(shí)現(xiàn)action程序代碼與返回的jsp頁面名稱的解耦。
(以上,也可以結(jié)合自己使用感受談自己的看法)
72、談?wù)勀銓ibernate的理解。
1. 面向?qū)ο笤O(shè)計(jì)的軟件內(nèi)部運(yùn)行過程可以理解成就是在不斷創(chuàng)建各種新對象、建立對象之間的關(guān)系,調(diào)用對象的方法來改變各個(gè)對象的狀態(tài)和對象消亡的過程,不管程序運(yùn)行的過程和操作怎么樣,本質(zhì)上都是要得到一個(gè)結(jié)果,程序上一個(gè)時(shí)刻和下一個(gè)時(shí)刻的運(yùn)行結(jié)果的差異就表現(xiàn)在內(nèi)存中的對象狀態(tài)發(fā)生了變化。
2.為了在關(guān)機(jī)和內(nèi)存空間不夠的狀況下,保持程序的運(yùn)行狀態(tài),需要將內(nèi)存中的對象狀態(tài)保存到持久化設(shè)備和從持久化設(shè)備中恢復(fù)出對象的狀態(tài),通常都是保存到關(guān)系數(shù)據(jù)庫來保存大量對象信息。從Java程序的運(yùn)行功能上來講,保存對象狀態(tài)的功能相比系統(tǒng)運(yùn)行的其他功能來說,應(yīng)該是一個(gè)很不起眼的附屬功能,java采用jdbc來實(shí)現(xiàn)這個(gè)功能,這個(gè)不起眼的功能卻要編寫大量的代碼,而做的事情僅僅是保存對象和恢復(fù)對象,并且那些大量的jdbc代碼并沒有什么技術(shù)含量,基本上是采用一套例行公事的標(biāo)準(zhǔn)代碼模板來編寫,是一種苦活和重復(fù)性的工作。
3.通過數(shù)據(jù)庫保存java程序運(yùn)行時(shí)產(chǎn)生的對象和恢復(fù)對象,其實(shí)就是實(shí)現(xiàn)了java對象與關(guān)系數(shù)據(jù)庫記錄的映射關(guān)系,稱為ORM(即Object RelationMapping),人們可以通過封裝JDBC代碼來實(shí)現(xiàn)了這種功能,封裝出來的產(chǎn)品稱之為ORM框架,Hibernate就是其中的一種流行ORM框架。使用Hibernate框架,不用寫JDBC代碼,僅僅是調(diào)用一個(gè)save方法,就可以將對象保存到關(guān)系數(shù)據(jù)庫中,僅僅是調(diào)用一個(gè)get方法,就可以從數(shù)據(jù)庫中加載出一個(gè)對象。
4.使用Hibernate的基本流程是:配置Configuration對象、產(chǎn)生SessionFactory、創(chuàng)建session對象,啟動(dòng)事務(wù),完成CRUD操作,提交事務(wù),關(guān)閉session。
5.使用Hibernate時(shí),先要配置hibernate.cfg.xml文件,其中配置數(shù)據(jù)庫連接信息和方言等,還要為每個(gè)實(shí)體配置相應(yīng)的hbm.xml文件,hibernate.cfg.xml文件中需要登記每個(gè)hbm.xml文件。
6.在應(yīng)用Hibernate時(shí),重點(diǎn)要了解Session的緩存原理,級聯(lián),延遲加載和hql查詢。
(以上,也可以結(jié)合自己使用JDBC時(shí)的繁瑣談hibernate的感受)
73,談?wù)勀銓pring的理解。
1.Spring是實(shí)現(xiàn)了工廠模式的工廠類(在這里有必要解釋清楚什么是工廠模式),這個(gè)類名為BeanFactory(實(shí)際上是一個(gè)接口),在程序中通常BeanFactory的子類ApplicationContext。Spring相當(dāng)于一個(gè)大的工廠類,在其配置文件中通過<bean>元素配置用于創(chuàng)建實(shí)例對象的類名和實(shí)例對象的屬性。
2. Spring提供了對IOC良好支持,IOC是一種編程思想,是一種架構(gòu)藝術(shù),利用這種思想可以很好地實(shí)現(xiàn)模塊之間的解耦,IOC也稱為DI(Depency Injection)。
3. Spring提供了對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)類對外具有相同的方法聲明,有兩種方式可以實(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對象進(jìn)行提供,顯然要?jiǎng)?chuàng)建出代理對象,至少需要目標(biāo)類和Advice類。spring提供了這種支持,只需要在spring配置文件中配置這兩個(gè)元素即可實(shí)現(xiàn)代理和aop功能。
(以上,也可以結(jié)合自己使用感受談自己的看法)
74,談?wù)凷truts的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1. 實(shí)現(xiàn)MVC模式,結(jié)構(gòu)清晰,使開發(fā)者只關(guān)注業(yè)務(wù)邏輯的實(shí)現(xiàn).
2.有豐富的tag可以用 ,Struts的標(biāo)記庫(Taglib),如能靈活動(dòng)用,則能大大提高開發(fā)效率
3. 頁面導(dǎo)航使系統(tǒng)的脈絡(luò)更加清晰。通過一個(gè)配置文件,即可把握整個(gè)系統(tǒng)各部分之間的聯(lián)系,這對于后期的維護(hù)有著莫大的好處。尤其是當(dāng)另一批開發(fā)者接手這個(gè)項(xiàng)目時(shí),這種優(yōu)勢體現(xiàn)得更加明顯。
4. 提供Exception處理機(jī)制 .
5. 數(shù)據(jù)庫鏈接池管理
6. 支持I18N
缺點(diǎn):
一,轉(zhuǎn)到展示層時(shí),需要配置forward,如果有十個(gè)展示層的jsp,需要配置十次struts,而且還不包括有時(shí)候目錄、文件變更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整個(gè)項(xiàng)目,而tomcate這樣的服務(wù)器,還必須重新啟動(dòng)服務(wù)器
二,Struts的Action必需是thread-safe方式,它僅僅允許一個(gè)實(shí)例去處理所有的請求。所以action用到的所有的資源都必需統(tǒng)一同步,這個(gè)就引起了線程安全的問題。
三,測試不方便. Struts的每個(gè)Action都同Web層耦合在一起,這樣它的測試依賴于Web容器,單元測試也很難實(shí)現(xiàn)。不過有一個(gè)Junit的擴(kuò)展工具Struts TestCase可以實(shí)現(xiàn)它的單元測試。
四,類型的轉(zhuǎn)換. Struts的FormBean把所有的數(shù)據(jù)都作為String類型,它可以使用工具Commons-Beanutils進(jìn)行類型轉(zhuǎn)化。但它的轉(zhuǎn)化都是在Class級別,而且轉(zhuǎn)化的類型是不可配置的。類型轉(zhuǎn)化時(shí)的錯(cuò)誤信息返回給用戶也是非常困難的。
五,對Servlet的依賴性過強(qiáng). Struts處理Action時(shí)必需要依賴ServletRequest和ServletResponse,所有它擺脫不了Servlet容器。
六,前端表達(dá)式語言方面.Struts集成了JSTL,所以它主要使用JSTL的表達(dá)式語言來獲取數(shù)據(jù)??墒荍STL的表達(dá)式語言在Collection和索引屬性方面處理顯得很弱。
七,對Action執(zhí)行的控制困難. Struts創(chuàng)建一個(gè)Action,如果想控制它的執(zhí)行順序?qū)?huì)非常困難。甚至你要重新去寫Servlet來實(shí)現(xiàn)你的這個(gè)功能需求。
八,對Action執(zhí)行前和后的處理. Struts處理Action的時(shí)候是基于class的hierarchies,很難在action處理前和后進(jìn)行操作。
九,對事件支持不夠.在struts中,實(shí)際是一個(gè)表單Form對應(yīng)一個(gè)Action類(或DispatchAction),換一句話說:在Struts中實(shí)際是一個(gè)表單只能對應(yīng)一個(gè)事件,struts這種事件方式稱為application event,application event和component event相比是一種粗粒度的事件
75,iBatis與Hibernate有什么不同?
相同點(diǎn):屏蔽jdbc api的底層訪問細(xì)節(jié),使用我們不用與jdbc api打交道,就可以訪問數(shù)據(jù)。
jdbc api編程流程固定,還將sql語句與java代碼混雜在了一起,經(jīng)常需要拼湊sql語句,細(xì)節(jié)很繁瑣。
ibatis的好處:屏蔽jdbc api的底層訪問細(xì)節(jié);將sql語句與java代碼進(jìn)行分離;提供了將結(jié)果集自動(dòng)封裝稱為實(shí)體對象和對象的集合的功能,queryForList返回對象集合,用queryForObject返回單個(gè)對象;提供了自動(dòng)將實(shí)體對象的屬性傳遞給sql語句的參數(shù)。
Hibernate是一個(gè)全自動(dòng)的orm映射工具,它可以自動(dòng)生成sql語句,ibatis需要我們自己在xml配置文件中寫sql語句,hibernate要比ibatis功能負(fù)責(zé)和強(qiáng)大很多。因?yàn)閔ibernate自動(dòng)生成sql語句,我們無法控制該語句,我們就無法去寫特定的高效率的sql。對于一些不太復(fù)雜的sql查詢,hibernate可以很好幫我們完成,但是,對于特別復(fù)雜的查詢,hibernate就很難適應(yīng)了,這時(shí)候用ibatis就是不錯(cuò)的選擇,因?yàn)閕batis還是由我們自己寫sql語句。
76,在hibernate進(jìn)行多表查詢每個(gè)表中各取幾個(gè)字段,也就是說查詢出來的結(jié)果集沒有一個(gè)實(shí)體類與之對應(yīng)如何解決?
解決方案一,:按照Object[]數(shù)據(jù)取出數(shù)據(jù),然后自己組bean
解決方案二:對每個(gè)表的bean寫構(gòu)造函數(shù),比如表一要查出field1,field2兩個(gè)字段,那么有一個(gè)構(gòu)造函數(shù)就是Bean(type1filed1,type2
field2) ,然后在hql里面就可以直接生成這個(gè)bean了。
77,介紹一下Hibernate的二級緩存
按照以下思路來回答:
(1)首先說清楚什么是緩存
(2)再說有了hibernate的Session就是一級緩存,即有了一級緩存,為什么還要有二級緩存
(3)最后再說如何配置Hibernate的二級緩存。
1,緩存就是把以前從數(shù)據(jù)庫中查詢出來和使用過的對象保存在內(nèi)存中(一個(gè)數(shù)據(jù)結(jié)構(gòu)中),這個(gè)數(shù)據(jù)結(jié)構(gòu)通常是或類似HashMap,當(dāng)以后要使用某個(gè)對象時(shí),先查詢緩存中是否有這個(gè)對象,如果有則使用緩存中的對象,如果沒有則去查詢數(shù)據(jù)庫,并將查詢出來的對象保存在緩存中,以便下次使用。
2,Hibernate的Session就是一種緩存,我們通常將之稱為Hibernate的一級緩存,當(dāng)想使用session從數(shù)據(jù)庫中查詢出一個(gè)對象時(shí),Session也是先從自己內(nèi)部查看是否存在這個(gè)對象,存在則直接返回,不存在才去訪問數(shù)據(jù)庫,并將查詢的結(jié)果保存在自己內(nèi)部。
由于Session代表一次會(huì)話過程,一個(gè)Session與一個(gè)數(shù)據(jù)庫連接相關(guān)連,所以Session最好不要長時(shí)間保持打開,通常僅用于一個(gè)事務(wù)當(dāng)中,在事務(wù)結(jié)束時(shí)就應(yīng)關(guān)閉。并且Session是線程不安全的,被多個(gè)線程共享時(shí)容易出現(xiàn)問題。通常只有那種全局意義上的緩存才是真正的緩存應(yīng)用,才有較大的緩存價(jià)值,因此,Hibernate的Session這一級緩存的緩存作用并不明顯,應(yīng)用價(jià)值不大。Hibernate的二級緩存就是要為Hibernate配置一種全局緩存,讓多個(gè)線程和多個(gè)事務(wù)都可以共享這個(gè)緩存。我們希望的是一個(gè)人使用過,其他人也可以使用,session沒有這種效果。
3,二級緩存是獨(dú)立于Hibernate的軟件部件,屬于第三方的產(chǎn)品,多個(gè)廠商和組織都提供有緩存產(chǎn)品,例如,EHCache和OSCache等等。在Hibernate中使用二級緩存,首先就要在hibernate.cfg.xml配置文件中配置使用哪個(gè)廠家的緩存產(chǎn)品,接著需要配置該緩存產(chǎn)品自己的配置文件,最后要配置Hibernate中的哪些實(shí)體對象要納入到二級緩存的管理中。明白了二級緩存原理和有了這個(gè)思路后,很容易配置起Hibernate的二級緩存。
擴(kuò)展知識:一個(gè)SessionFactory可以關(guān)聯(lián)一個(gè)二級緩存,也即一個(gè)二級緩存只能負(fù)責(zé)緩存一個(gè)數(shù)據(jù)庫中的數(shù)據(jù),當(dāng)使用Hibernate的二級緩存后,注意不要有其他的應(yīng)用或SessionFactory來更改當(dāng)前數(shù)據(jù)庫中的數(shù)據(jù),這樣緩存的數(shù)據(jù)就會(huì)與數(shù)據(jù)庫中的實(shí)際數(shù)據(jù)不一致。
78,JDO是什么?
JDO是Java對象持久化的新的規(guī)范,為java data object的簡稱,也是一個(gè)用于存取某種數(shù)據(jù)倉庫中的對象的標(biāo)準(zhǔn)化API。JDO提供了透明的對象存儲,因此對開發(fā)人員來說,存儲數(shù)據(jù)對象完全不需要額外的代碼(如JDBC API的使用)。這些繁瑣的例行工作已經(jīng)轉(zhuǎn)移到JDO產(chǎn)品提供商身上,使開發(fā)人員解脫出來,從而集中時(shí)間和精力在業(yè)務(wù)邏輯上。另外,JDO很靈活,因?yàn)樗梢栽谌魏螖?shù)據(jù)底層上運(yùn)行。
比較:JDBC只是面向關(guān)系數(shù)據(jù)庫(RDBMS)JDO更通用,提供到任何數(shù)據(jù)底層的存儲功能,比如關(guān)系數(shù)據(jù)庫、文件、XML以及對象數(shù)據(jù)庫(ODBMS)等等,使得應(yīng)用可移植性更強(qiáng)。
79,Hibernate的一對多和多對一雙向關(guān)聯(lián)的區(qū)別??
一對多關(guān)聯(lián)映射和多對一關(guān)聯(lián)映射實(shí)現(xiàn)的基本原理都是一樣的,既是在多的一端加入一個(gè)外鍵指向一的一端外鍵,而主要的區(qū)別就是維護(hù)端不同。
它們的區(qū)別在于維護(hù)的關(guān)系不同:
一對多關(guān)聯(lián)映射是指在加載一的一端數(shù)據(jù)的同時(shí)加載多的一端的數(shù)據(jù)多對一關(guān)聯(lián)映射是指在加載多的一端數(shù)據(jù)的同時(shí)加載一的一端的數(shù)據(jù)。
80,Hibernate是如何延遲加載?
1. Hibernate2延遲加載實(shí)現(xiàn):a)實(shí)體對象 b)集合(Collection)
2. Hibernate3 提供了屬性的延遲加載功能 當(dāng)Hibernate在查詢數(shù)據(jù)的時(shí)候,數(shù)據(jù)并沒有存在與內(nèi)存中,當(dāng)程序真正對數(shù)據(jù)的操作時(shí),對象才存在與內(nèi)存中,就實(shí)現(xiàn)了延遲加載,他節(jié)省了服務(wù)器的內(nèi)存開銷,從而提高了服務(wù)器的性能。
到此,相信大家對“Java有哪些框架面試題”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。