Java面試寶典2013版

項目介紹

在進行技術面試前,提醒大家,必須要準備好項目介紹,即需要準備好你的簡歷中列的所有項目的項目介紹!

面試時關於項目,面試官常見的問題及回答(以銀行櫃檯系統爲例):

l你給我簡要介紹一下銀行櫃檯系統?

1、簡易銀行櫃檯系統是模擬銀行櫃檯的基本功能而做的一個系統。

2、系統分前臺和後臺部分,前臺部分是銀行櫃檯人員操作的,包括:註冊登錄模塊、開銷戶模塊、帳號管理模塊、存取錢轉賬模塊、櫃檯人員信息管理;後臺部分是銀行管理者操作的,包括查看日誌模塊、管理櫃檯人員信息模塊;

3、我主要負責的是前臺的全部功能;

l你詳細介紹一下你負責的模塊的功能?

1、我負責的註冊登錄模塊和櫃檯人員信息模塊實際上是管理櫃檯人員信息的,內容比較簡單;

2、開銷戶模塊、帳號管理模塊、存取錢轉賬模塊是爲銀行儲戶服務的模塊。其中開銷戶就是爲儲戶開戶、銷戶的功能,賬戶管理模塊就是幫儲戶凍結帳號、修改密碼等功能,存取錢轉賬模塊就是爲儲戶存錢、取錢,幫儲戶轉賬的功能;

l這個項目幾個人做的?用了多長時間?

1、這個項目比較小,由2個人合作完成的,我負責的是前臺部分;

2、項目大概用了4天左右的時間;

l這個項目使用了什麼技術?

1、這個項目使用Struts2、Hibernate3和MySQL

l你在做這個項目的時候,遇到了什麼困難,怎麼解決的?

1、比如在Hiberante的使用,關於表之間關聯關係的配置,我開始操作的時候不太熟悉,後來通過查文檔、和其他同學溝通的方式,這個問題也得到了解決;

備註:如果你在這裏提到了表之間關聯關係的配置,那麼這個問題面試官非常有可能接下去就問這個技術問題,所以務必認真準備這個技術問題。

前言

這套面試題主要目的是幫助那些還沒有java軟件開發實際工作經驗,而正在努力尋找java軟件開發工作的學生在筆試/面試時更好地贏得好的結果。由於這套試題涉及的範圍很泛,很廣,很雜,大家不可能一天兩天就看完和學完這套面試寶典,即使你已經學過了有關的技術,那麼至少也需要半個月的時間才能消化和掌握這套面試寶典,所以,大家應該早作準備,從拿到這套面試寶典之日起,就要堅持在每天閒暇之餘學習其中幾道題目,日積月累,等到出去面試時,一切都水到渠成,面試時就自然會遊刃有餘了。

答題時,先答是什麼,再答有什麼作用,要注意什麼(這條可以沒有)

比如說面試官問:給我介紹一下ORM?

較好回答:

1、ORM就是Object Relational Mapping,就是對象關係映射;

2、作用:我們在寫程序的時候,用的是面向對象的方法,但是在關係型數據庫裏,存的是一條條的記錄;爲了用純面向對象的思想解決問題,所以需要將程序中的對象和數據庫中的記錄建立起映射關係,ORM就是將對象和數據庫中的記錄建立起映射的技術;

答案要層次分明,條理清晰,從這些表面的東西也可以看出一個人的習慣、辦事風格、條理等。

答題不侷限於什麼格式和形式,就是要將自己的掌握的技術內容展現出來,比如可以採用舉例的說法:

需要特別注意的是,因爲面試官本身水平層次不齊,不要因爲人家題目問的模棱兩可(或者題目問的不準確),你就心裏膽怯和沒底氣了,不敢回答了。你要大膽地提出對方題目中你不清楚的地方,希望對方能重新明確的提出問題?

例如,你可以問:您提的問題,我剛纔沒有完全聽明白,能不能再說一遍。

一. Java基礎部分

1、請說一下break和continue的區別?

1、這兩個語句都可以用於跳出循環的;

2、break是中止循環,執行循環體以後的語句,而continue是跳出本次循環,執行下一次循環;

2、switch 中用於判斷的表達式,可以用哪些數據類型?

1、可以是char、byte、short、int,不可以是long、String等其他類型;

2、從JDK1.7開始,支持String類型;

3、char型變量中能不能存貯一箇中文漢字?爲什麼?

Java裏採用了Unicode編碼格式,Unicode編碼中一個char型佔用2個字節,而一個漢字也是佔用2個字節,所以可以存儲中文漢字。

備註:C語言裏,char佔用1個字節,不用存漢字。

4、靜態變量和實例變量的區別?

在語法定義上的區別:靜態變量前要加static關鍵字,而實例變量前則不加。

在程序運行時的區別:實例變量屬於某個對象的屬性,必須創建了實例對象,其中的實例變量纔會被分配空間,才能使用這個實例變量。靜態變量不屬於某個實例對象,而是屬於類,所以也稱爲類變量,不用創建任何實例對象,靜態變量就會被分配空間,靜態變量就可以被使用了。總之,實例變量必須創建對象後纔可以通過這個對象來使用,靜態變量則可以直接使用類名來引用。

5、是否可以從一個static方法內部發出對非static方法的調用?

不可以。因爲非static方法是要與對象關聯在一起的,必須創建一個對象後,纔可以在該對象上進行方法調用,而static方法調用時不需要創建對象,可以直接調用。也就是說,當一個static方法被調用時,可能還沒有創建任何實例對象,如果從一個static方法中發出對非static方法的調用,那個非static方法是關聯到哪個對象上的呢?這個邏輯無法成立,所以,一個static方法內部發出對非static方法的調用。

6、Integer與int的區別

1、int是基本數據類型,Integer是包裝類;

2、int的默認值是0,Interger的默認值是null;

7、Overload和Override的區別。參數列表相同,返回值不同的方法,是否是重載方法?

Overload是重載的意思,Override是覆蓋的意思,也就是重寫。

重載是指在一個類裏,方法名相同,參數不同;

重寫是指子類繼承父類,子類裏重新編寫了父類中的同名(同參數)方法,也就是覆蓋了父類的方法;


不是!因爲重載必須要求參數列表不同!

8、接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承具體類(concrete class)?

接口可以繼承接口。抽象類可以實現(implements)接口,抽象類是否可繼承具體類。

備註:只要明白了接口和抽象類的本質和作用,這些問題都很好回答。

只有記住抽象類與普通類的唯一區別就是不能創建實例對象和允許有abstract方法。

9、面向對象有哪三大特性?

1、面向對象有三大特性,分別是:封裝、繼承和多態。

2、封裝:面向對象的封裝就是把描述一個對象的屬性和行爲的代碼封裝在一個類中,有些屬性是不希望公開的,或者說被其他對象訪問的,所以我們使用private修飾該屬性,使其隱藏起來;類中提供了方法(用public修飾),常用的是get、set方法,可以操作這些被隱藏的屬性,其他類可以通過調用這些方法,改變隱藏屬性的值!

下面的回答是更高要求,不需要學生必須掌握:

封裝是保證軟件部件具有優良的模塊性的基礎,封裝的目標就是要實現軟件部件的“高內聚、低耦合”,防止程序相互依賴性而帶來的變動影響。在面向對象的編程語言中,對象是封裝的最基本單位,面向對象的封裝比傳統語言的封裝更爲清晰、更爲有力。

3、繼承:在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,使用extends關鍵字實現繼承;子類中可以加入若干新的內容,或修改原來的方法使之更適合特殊的需要,這就是繼承。繼承是子類自動共享父類數據和方法的機制,這是類之間的一種關係,提高了軟件的可重用性和可擴展性。

4、多態:多態就是在聲明時使用父類,在實現或調用時使用具體的子類;即不修改程序代碼就可以改變程序運行時所綁定的具體代碼,讓程序可以選擇多個運行狀態,這就是多態性,多態增強了軟件的靈活性和擴展性。這裏可以舉個例子,比如聲明時使用的是動物類,調用時傳遞的是一個貓類(動物類的子類)的對象,具體執行父類裏動物——吃的方法時,實際執行的是貓——吃的方法。

10、abstract class和interface有什麼區別?

1、抽象類裏面可以用普通方法,而接口中的方法全部都是抽象的;

2、在應用範圍上來說,接口往往在程序設計的時候,用來定義程序模塊的功能,方便各模塊協同工作;抽象類是對相似類進行抽象,形成一個抽象的父類可供重用!


11、String是最基本的數據類型嗎?

1、String是個類,不是基本數據類型;

2、基本數據類型包括byte、int、char、long、float、double、boolean和short。

12、String 和StringBuffer的區別

1、String是個不可變長度的字符串,而StringBuffer是個可變長度的字符串;

2、在對String類進行操作的時候(例如增加字符),實際上是在內存中產生了一個新的String對象; 而StringBuffer是給原對象增加字符,不是新創建一個對象;

13、數組有沒有length()這個方法? String有沒有length()這個方法?

數組沒有length()這個方法,有length的屬性。String有length()這個方法。

14、final, finally, finalize的區別。

final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。

finally是異常處理語句結構的一部分,表示總是執行。

finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。JVM不保證此方法總被調用

15、請說一下你常用的幾種異常?

比如:

1、空指針異常;

2、數組下標越界;

3、類型轉換異常;

4、算數異常,例如除數爲零;

5、IO異常,比如說找不到文件;

6、找不到類異常;

7、sql異常,例如sql語句不能正常運行;

8、

16、線程的基本概念?線程的基本狀態以及狀態之間的關係

1、是程序執行流的最小單元。在單個程序中同時運行多個線程完成不同的工作,稱爲多線程

2、開始時:就緒狀態,等待cpu調用後進入運行狀態,運行過程中遇到阻塞事件,進入阻塞狀態,等待阻塞事件結束後,重新進入就緒狀態;如果沒有阻塞事件,運行結束後,則進入結束狀態

17、sleep() 和 wait() 有什麼區別?

sleep就是暫停當前線程一段時間,把cpu讓給其他線程使用,到時後會自動恢復。調用sleep不會釋放對象鎖。 wait方法導致本線程放棄對象鎖,進入等待,只有等到本對象的notify方法(或notifyAll)後本線程才進入就緒狀態,等待執行。

18、多線程有幾種實現方法?

多線程有兩種實現方法,分別是繼承Thread類與實現Runnable接口

19、啓動一個線程是用run()還是start()? .

啓動一個線程是調用start()方法,使線程就緒狀態,以後可以被調度爲運行狀態,一個線程必須關聯一些具體的執行代碼,run()方法是該線程所關聯的執行代碼。

20、Set和List的區別,List和Map的區別

1、Set是無序的,元素不可重複;List是有序的,元素可以重複;

2、List存儲的是單個對象的集合(有序的),Map存儲的是鍵值對爲對象的集合(無序的);

21、HashMap和Hashtable的區別

1、HashMap和Hashtable都完成了Map接口;

2、HashMap非線程安全的,而Hashtable是線程安全的,原因是Hashtable裏面的方法使用Synchronize關鍵字修飾的;

3、因爲Hashtable使用了Synchronize關鍵字修飾,其性能比較差;(具體原因不做詳細說明)

22、說出ArrayList, LinkedList的區別

23、1、ArrayList和LinkedList都完成了List接口;

2、ArrayList底層是用數組實現的,而LinkedList使用鏈表實現的;

3、ArrayList在插入、刪除時,需要移動數組元素,故性能較差;但是在查詢時,因爲是連續的數組,所以查詢速度快;LinkedList正好相反。

24、請描述一下JDK1.5有哪些新特性?

1、泛型

2、For-Each循環

3、自動裝包/拆包

4、枚舉

5、靜態導入

6、Annotation

25、爲什麼要使用單例模式

1、避免在開發程序的時候,創建出一個類的多個實例(佔用空間,性能問題),所以使用單例模式,保證該類只創建一個對象;

2、一般單例模式通常有兩種形式:它的構造函數爲private的,必須有一個靜態方法,靜態方法返回自己的實例;實行形式有兩種,懶漢式和餓漢式;所謂的餓漢式就是在聲明實例的時候直接初始化對象,而懶漢式是先聲明一個空對象,在靜態方法中實例化該對象並返回。

二.Java web部分

26、什麼是B/S和C/S?

1、B/S:瀏覽器服務器模式;

2、C/S:客戶端 服務器模式;


27、如何設置servlet初始化參數?如何獲取servlet初始化的參數?

1、在web.xml裏爲每一個Servlet配置初始化參數;

2、通過ServletConfig對象實現對Servlet初始化對象的獲取;

28、Ajax是幹麼用的?有哪些常用的Ajax框架?

1、Ajax是採用了異步請求的方式,解決了頁面無刷新式提交的問題,改善了頁面的用戶體驗效果;常用在google地圖,註冊時用戶名重複性校驗,百度搜索下拉列表框;

2、常用的Ajax框架:底層框架:JQuery、Prototype;高層框架:DWR、DOJO、EXTJS、YUI;


29、HTTP請求的GET與POST方式的區別

Get和Post都是提交表單的方式之一;

1、get方式表單中的數據放到HTTP數據包的頭部,post方式放到body中;

2、get方式提交後,數據會在地址欄中顯示出來,而post方式不會,所以post更安全;

3、get方式在提交數據的時候,數據長度是有限制的;而post方式在理論上對提交數據的大小是無限制的;

4、get提交表單永遠使用字符方式提交;而post方式提交表單可以是字節方式也可以是字符方式


30、說一說Servlet的生命週期? Servlet裏常用的方法有哪些?

Servlet生命週期包括加載和實例化、初始化、處理請求以及服務結束;

Servlet生命週期是由容器進行管理的,不可以被程序員手工銷燬;

Servlet被服務器實例化後(用戶第一次訪問該Servlet時),容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當服務器決定將實例銷燬的時候調用其destroy方法。

31、Servlet API中forward() 與redirect()的區別?

1、forward是請求轉發,而reditect是重定向;

2、請求轉發是服務器將客戶端的請求轉發到另一個地址去處理,然後將響應返回給客戶端;實際上是1次請求,1次響應,對客戶端而言是透明的;而重定向是服務器根據客戶端發來的請求,返回給一個客戶端一個新的地址,客戶端根據這個返回的地址再發送請求,得到響應;實際上是2次請求,2次響應,而且客戶端的地址是第二次訪問的地址;

3、轉發只能轉發到自己的資源,重定向無限制。

32、jsp有哪些內置對象?

JSP共有以下9個內置的對象:

request 用戶端請求

response 網頁傳回用戶端的迴應

pageContext 網頁的屬性是在這裏管理

session 與請求有關的會話期

application

out 用來傳送回應的輸出

config

page JSP網頁本身

exception頁面中的異常和錯誤

33、Session和Cookie的區別?

1、Session和Cookie都是會話跟蹤技術;

2、Session是保存在服務器端的技術(保持用戶登錄狀態的檢查常用Session),而Cookie是保存在客戶端的技術;

3、Cookie只能存字符串,Session可以存對象;

34、靜態include和動態include的區別?

1、靜態包含屬於編譯期包含(包含頁面和被包含的頁面在編譯期形成一個jsp文件),動態包含屬於運行期包含(包含頁面和被包含的頁面分別編譯成兩個文件,然後運行時把兩個文件組裝起來);

2、動態包含可以帶參數;

三. 數據庫部分

重要備註:此數據庫部分面試題不含SQL語句(含各類函數)面試具體的題目,關於SQL語句的使用,請學生自己準備!

35、SQL語言包括哪三種類型,每種類型又包括哪些語句?

數據定義:create Table,AlterTable,Drop Table, Create/Drop Index等(學生需要了解)

數據操縱:select ,insert,update,delete(這個最重要,學生需要開展學習準備)

數據控制:grant,revoke

36、簡要介紹一下數據庫有哪些常用對象?

常用的數據庫對象包括:表、視圖、索引、函數、存儲過程、觸發器等。

37、什麼是數據庫中的視圖,其好處是什麼?

1、視圖是一個虛擬表,是由查詢語句產生的,不是真實存在的表;同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。

2、它主要出於兩種原因:安全原因, 視圖可以隱藏一些數據,如:員工信息表,可以用視圖只顯示姓名,年齡、性別等通用信息,而隱藏工資等敏感信息,另一原因是多表連接,可使複雜的查詢易於理解和使用。

38、數據庫中索引的好處是什麼?一個數據庫表,經常要進行添加和刪除記錄的操作,應該爲該表建多個索引嗎?

1、索引是一種特殊的查詢表,簡單的理解就是在數據庫中,將數據按一定的順序進行排列(分物理索引:只有1個 和邏輯索引:可以有多個),查詢的時候,可以有效提高查詢速度。

2、如果一個表要頻繁的進行添加和刪除記錄的操作(不是查詢),不建議建立多個索引,因爲添加和刪除記錄,都需要調整索引,增加數據庫負擔,影響性能。

39、什麼是數據庫遊標?

1、遊標是對查詢出來的結果集進行處理的一個對象,遊標可以定在該集合中的特定行,從而根據遊標從結果集中檢索出一行或多行。

40、什麼是事務?

1、事務是一系列的數據庫操作,是數據庫應用的基本邏輯單位,事務由事務開始(begin transaction)和事務結束(end transaction)之間執行的全體操作組成。

2、事務具有如下特性:(其中原子性最爲重要,必須掌握)

原子性(atomicity) 一個事務是一個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。

 一致性(consistency) 事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。

 隔離性(isolation) 一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。

 持久性(durability) 持續性也稱永久性(permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。

41、數據庫中日誌的作用是什麼?

日誌的作用是記錄所有對數據庫數據的修改,主要是保護數據庫以防止故障發生後,對數據庫進行恢復;

42、什麼是主鍵和外鍵?

1、主鍵和外鍵是用來建立數據庫表之間關聯關係的;

2、舉例來說,有一個學生表(學生學號、姓名、班級編號等信息)和一個班級表(班級編號、班級名稱),通過編輯編號建立班級表和學生表之間一對多的關聯,則班級表中班級編號是主鍵,學生表中的班級編號是外鍵。


43、什麼是數據庫中的存儲過程和觸發器?存儲過程的好處?

1、數據庫中的存儲過程是用於定義的一系列的sql語句的集合(含控制語句),涉及特定表和其他對象的任務,用戶可以調用存儲過程(有些類似java裏的方法);

2、觸發器(trigger)是個特殊的存儲過程,它的執行不是由程序調用,也不是手工啓動,而是由事件來觸發,比如當對一個表進行操作( insert,delete, update)時就會激活它執行。

3、存儲過程的好處:

SQL語句已經預編繹過了,因此運行的速度比較快;

常用功能的集合,提高了重用性;

用戶只需要調用存儲過程,不需要逐個寫存儲過程中的語句,減少了數據傳輸量;

44、內連接和外連接的區別?

1、內連接是保證兩個表中所有的行都要滿足連接條件,而外連接則不然。

2、在外連接中,某些不滿條件的列也會顯示出來,也就是說,只限制其中一個表的行,而不限制另一個表的行。分左連接、右連接、全連接(笛卡爾集)三種。

45、請介紹一下數據庫連接池技術?

1、數據庫連接池技術,就是數據庫啓動時會建立一定數量的數據庫連接(也稱爲池連接),並一直維持不少於此數目的池連接。

2、客戶端程序需要連接數據庫時,數據庫連接池會返回一個未使用的池連接給數據庫使用。如果當前沒有空閒連接,數據庫連接池就新建一定數量的連接。當使用的池連接調用完成後,連接池將此連接表記爲空閒,其他調用就可以使用這個連接。這樣做的目的是提高了應用程序訪問數據庫的性能。

46、MySQL、Oracle、SQL Server各數據庫服務的端口號?

1、MySQL:3306

2、Oracle:1521

3、SQLServer:1433

47、Oracle和SQL Server的分頁有什麼區別?

在SQL Server中使用TOP分頁,

在Oracle中用ROWNUM,或分析函數ROW_NUMBER,

在MySQL中用Limit。

48、如何對數據庫進行優化?

1、先優化SQL語句;

2、表級別優化:比如說建立索引;

3、數據庫級別優化:比如說數據庫參數設置,例如連接池數量;

49、JDBC連接數據庫的步驟?

1、加載JDBC驅動程序;

2、創建數據庫的連接;

3、創建一個Statement對象;

4、執行SQL語句;

5、返回並處理結果;

6、關閉連接;

50、JDBC中的PreparedStatement相比Statement的好處

1、PreparedStatement是Statement的子接口;

2、PreparedStatement有綁定參數的功能,避免SQL注入,安全性更好;

3、PreparedStatement對SQL語句有預編譯的功能,所以性能更好;


四. 其他部分

51、xml有哪些解析技術?區別是什麼?

1、有DOM,SAX等

2、DOM:處理大型文件時性能比較差,原因是DOM需要把整個文檔裝入內存,適合對XML的隨機訪問;

3、SAX:是事件驅動型的XML解析方式,它順序讀取XML文件,不需要一次全部裝載整個文件,當遇到像文檔開頭、文檔結束或標籤開頭和結束時,會觸發一個事件,用戶可以進行處理;

52、xml文檔在實際項目中有哪些應用?

1、配置文件中使用XML文檔;

2、XML是標準的文件傳輸格式,異構系統數據交換常採用XML;

五. 流行框架與技術

53、什麼是MVC?常用的MVC框架有哪些?

1、M:Model模型層 主要用來處理業務邏輯,承載數據;

2、V:View視圖層 主要用來做頁面顯示的

3、C:Control控制層 主要用來進行業務流程控制;

4、常用的MVC框架包括:Struts、Struts2、SpringMVC;

54、談談Struts的工作流程(或運行原理)

備註:下面的描述必須轉換成自己的語言進行表述!!!這道題非常重要,面試官關於Struts的很多問題都可以從本題中找到答案。

1、Struts是一個應用於Web層的MVC框架;

2、以ActionServlet作爲核心控制器,接收用戶所有請求,並將請求分發到不同的Action中進行處理,並將響應結果返回給客戶端;

3、我們可以在web.xml文件中將符合某種特徵的所有請求交給這個核心控制器進行處理,這個狠心控制器再參照一個配置文件(通常爲/WEB-INF/struts-config.xml)將各個請求分別分配給不同的Action去處理。

4、ActionServlet把請求交給Action去處理之前,會將請求參數封裝成一個formbean對象。

備註:如果面試官需要解釋一下formbean,則按如下思路回答:

ActionServlet把formbean對象傳遞給action的execute方法之前,可能會調用formbean的validate方法進行校驗,只有校驗通過後纔將這個formbean對象傳遞給action的execute方法,否則,它將返回一個錯誤頁面,這個錯誤頁面由input屬性指定,(看配置文件)作者爲什麼將這裏命名爲input屬性,而不是error屬性,我們後面結合實際的運行效果進行分析。

5、Action執行完後要返回顯示的結果視圖,這個結果視圖是用一個ActionForward對象來表示的,actionforward對象通過struts-config.xml配置文件中的配置關聯到某個jsp頁面,因爲程序中使用的是在struts-config.xml配置文件爲jsp頁面設置的邏輯名,這樣可以實現action程序代碼與返回的jsp頁面名稱的解耦。

55、談談Struts2的工作流程(或運行原理)

備註:下面的描述必須轉換成自己的語言進行表述!!!這道題非常重要,面試官關於Struts2的很多問題都可以從本題中找到答案。


1、客戶端發送一個指向Servlet容器(例如Tomcat)的請求

2、這個請求經過一系列的過濾器(Filter)

3、接着FilterDispatcher被調用,將request中所攜帶的數據放入值棧(ValueStack);

4、 FilterDispatcher詢問ActionMapper來決定這個請求是否需要調用某個Action,把請求的處理交給ActionProxy;

5、ActionProxy通過Configuration Manager詢問框架的配置文件(struts.xml),找到調用的Action類;

6、ActionProxy創建一個ActionInvocation的實例;
7、 ActionInvocation在調用Action的過程前後,涉及到相關攔截器(Intercepter)的調用;

8、 一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果(JSP顯示結果)。

56、說說struts1與struts2的區別

備註:下面的描述必須轉換成自己的語言進行表述!!!

1、都是MVC的WEB框架;

2、struts1的前端控制器是一個Servlet,名稱爲ActionServlet,struts2的前端控制器是一個filter,在struts2.0中叫FilterDispatcher,在struts2.1中叫StrutsPrepareAndExecuteFilter;

3、struts1的action需要繼承Action類,struts2的action可以不繼承任何類;struts1對同一個路徑的所有請求共享一個Action實例,struts2對同一個路徑的每個請求分別使用一個獨立Action實例對象,所有對於struts2的Action不用考慮線程安全問題。

4、在struts1中使用formbean封裝請求參數,在struts2中直接使用action的屬性來封裝請求參數。

5、struts1中的多個業務方法放在一個Action中時(即繼承DispatchAction時),要麼都校驗,要麼都不校驗;對於struts2,可以指定只對某個方法進行校驗,當一個Action繼承了ActionSupport且在這個類中只編寫了validateXxx()方法,那麼則只對Xxx()方法進行校驗。


57、Struts優缺點

優點:

1、實現MVC模式,結構清晰,使開發者只關注業務邏輯的實現;

2、有豐富的tag可以用 ,Struts的標記庫(Taglib),如能靈活動用,則能大大提高開發效率;

3、通過配置文件,使系統的脈絡更加清晰。一個配置文件,即可把握整個系統各部分之間的聯繫,這對於後期的維護有着很大的好處。

4、Struts提供了兩週異常處理方式,聲明式異常處理和編程式異常處理——此處學生需要自己多看看相關資料,能夠進一步回答面試官問題;

5、對國際化進行支持,支持I18N;

缺點:

1、實現MVC模式,代碼複雜度提升;

2、需要維護配置文件,比較麻煩;

58、什麼是Hibernate,好處是什麼?

1、Hibernate是一個操作數據庫的框架,實現了對JDBC的封裝;

2、Hibernate是一個ORM框架,我們在寫程序的時候,用的是面向對象的方法,但是在關係型數據庫裏,存的是一條條的記錄;爲了用純面向對象的思想解決問題,所以需要將程序中的對象和數據庫中的記錄建立起映射關係,ORM就是將對象和數據庫中的記錄建立起映射的技術,而Hibernate就是這樣一個ORM框架;

3、Hibernate簡化了代碼編寫,原來JDBC需要寫一堆代碼完成的功能,Hibernate需要少量的代碼即可以實現;

4、Hibernate屏蔽了數據庫的差異,增加了對不同數據庫的可移植性(通過方言);


5、使用Hibernate的基本流程是:配置Configuration對象、產生SessionFactory、創建session對象,啓動事務,完成CRUD操作,提交事務,關閉session;

6、使用Hibernate時,先要配置hibernate.cfg.xml文件,其中配置數據庫連接信息和方言等,還要爲每個實體配置相應的hbm.xml文件,hibernate.cfg.xml文件中需要登記每個hbm.xml文件。

59、hibernate中的update()和saveOrUpdate()的區別

1、update針對的是已存在的實體對象,數據庫中如果沒有實體所對應的數據記錄,將會拋出異常;

2、saveOrUpdate()對象存在與否都不會有任何影響,有則更新,沒則插入。

60、hibernate中對象的三種狀態?

1、瞬時態:用new創建的對象,它沒有持久化,沒有處於Session中,處於此狀態的對象叫臨時對象;

2、持久態:已經持久化,加入到了Session緩存中。如通過hibernate語句保存的對象。處於此狀態的對象叫持久對象;

3、遊離態(託管態): 持久化對象脫離了Session的對象。如Session緩存被清空的對象。特點:已經持久化,但不在Session緩存中。處於此狀態的對象叫遊離對象;

61、session的load()和get()的區別

1、get()採用立即加載方式;而load()採用延遲加載;

2、get()方法執行的時候,會立即向數據庫發出查詢語句,而load()方法返回的是一個代理(此代理中只有一個id屬性),只有等真正使用該對象屬性的時候,纔會發出sql語句;

3、如果數據庫中沒有對應的記錄,get()方法返回的是null。而load()方法出現異常ObjectNotFoundException 。

62、iBatis與Hibernate有什麼不同?

1、Hibernate是一個全自動的orm映射工具,它可以自動生成sql語句;ibatis需要我們自己在xml配置文件中寫sql語句,hibernate要比ibatis功能負責和強大很多。因爲hibernate自動生成sql語句,我們無法控制該語句,我們就無法去寫特定的高效率的sql。對於一些不太複雜的sql查詢,hibernate可以很好幫我們完成,但是,對於特別複雜的查詢,hibernate就很難適應了,這時候用ibatis就是不錯的選擇,因爲ibatis還是由我們自己寫sql語句;

2、相同點:屏蔽jdbcapi的底層訪問細節,使用我們不用與jdbc api打交道,就可以訪問數據。

3、jdbcapi編程流程固定,還將sql語句與java代碼混雜在了一起,經常需要拼湊sql語句,細節很繁瑣。

4、ibatis的好處:屏蔽jdbc api的底層訪問細節;將sql語句與java代碼進行分離;提供了將結果集自動封裝稱爲實體對象和對象的集合的功能,queryForList返回對象集合,用queryForObject返回單個對象;提供了自動將實體對象的屬性傳遞給sql語句的參數。

63、介紹一下Hibernate的二級緩存

1、按照以下思路來回答:(1)首先說清楚什麼是緩存,(2)再說有了hibernate的Session就是一級緩存,即有了一級緩存,爲什麼還要有二級緩存,(3)最後再說如何配置Hibernate的二級緩存。

2.1、緩存就是把以前從數據庫中查詢出來和使用過的對象保存在內存中,當以後要使用某個對象時,先查詢緩存中是否有這個對象,如果有則使用緩存中的對象,如果沒有則去查詢數據庫,並將查詢出來的對象保存在緩存中,以便下次使用。

2.2、Hibernate中Session內置了一種緩存,我們通常將之稱爲Hibernate的一級緩存(Session級別的),當想使用session從數據庫中查詢出一個對象時,Session也是先從自己內部查看是否存在這個對象,存在則直接返回,不存在纔去訪問數據庫,並將查詢的結果保存在自己內部。由於Session代表一次會話過程,一個Session與一個數據庫連接相關連,所以Session最好不要長時間保持打開,通常僅用於一個事務當中,在事務結束時就應關閉。

2.3、二級緩存是SessionFactory級別的緩存,能被此SessionFactory裏的所有Session共享。多個廠商和組織都提供有緩存產品,例如,EHCache和OSCache等等。在Hibernate中使用二級緩存,首先就要在hibernate.cfg.xml配置文件中配置使用哪個廠家的緩存產品,接着需要配置該緩存產品自己的配置文件,最後要配置Hibernate中的哪些實體對象要納入到二級緩存的管理中。

64、什麼是AOP?談談你對他的理解。

1、AOP爲Aspect Oriented Programming的縮寫,意爲:面向切面編程(也叫面向方面),可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種思想。

2、利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。 當項目中需要編寫大量相同功能重複代碼時,可以考慮使用AOP的形式來實現。如聲明式事務管理、權限校驗等。

備註:如果面試官問你是否用過AOP,一定要說用過(Spring的事務處理機制就是AOP的思想來實現的)——非常重要!!!

65、什麼是IOC和DI?

1、IOC是控制反轉,DI是依賴注入,其基本含義差不多。

2、IOC:原來創建對象的控制權是由我們自己來創建的,現在不再是由程序員創建了,由IOC容器爲我們提供,這樣帶來的好處是,降低代碼的耦合度,更加符合開閉原則;

備註:學生需要知道怎麼在配置文件裏配置相關信息,面試官可能會問。

66、依賴注入的兩種方式?

1、Set注入

2、構造器注入

67、Spring IOC容器中Bean默認的範圍(scope)?

1、singleton



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章