115個(gè)Java面試題和答案——終極列表(下)

第一篇討論了面向?qū)ο缶幊毯退奶攸c(diǎn)阎姥,關(guān)于Java和它的功能的常見(jiàn)問(wèn)題记舆,Java的集合類(lèi),垃圾收集器呼巴,本章主要討論異常處理泽腮,Java小應(yīng)用程序,Swing衣赶,JDBC诊赊,遠(yuǎn)程方法調(diào)用(RMI),Servlet和JSP府瞄。

異常處理

Java小應(yīng)用程序(Applet)

Swing

JDBC

遠(yuǎn)程方法調(diào)用(RMI)

Servlet

JSP

異常處理

43.Java中的兩種異常類(lèi)型是什么碧磅?他們有什么區(qū)別?

Java中有兩種異常:受檢查的(checked)異常和不受檢查的(unchecked)異常遵馆。不受檢查的異常不需要在方法或者是構(gòu)造函數(shù)上聲明鲸郊,就算方法或者是構(gòu)造函數(shù)的執(zhí)行可能會(huì)拋出這樣的異常,并且不受檢查的異郴醯耍可以傳播到方法或者是構(gòu)造函數(shù)的外面秆撮。相反,受檢查的異常必須要用throws語(yǔ)句在方法或者是構(gòu)造函數(shù)上聲明换况。這里有Java異常處理的一些小建議职辨。

44.Java中Exception和Error有什么區(qū)別?

Exception和Error都是Throwable的子類(lèi)戈二。Exception用于用戶(hù)程序可以捕獲的異常情況舒裤。Error定義了不期望被用戶(hù)程序捕獲的異常。

45.throw和throws有什么區(qū)別挽拂?

throw關(guān)鍵字用來(lái)在程序中明確的拋出異常惭每,相反,throws語(yǔ)句用來(lái)表明方法不能處理的異常亏栈。每一個(gè)方法都必須要指定哪些異常不能處理,所以方法的調(diào)用者才能夠確保處理可能發(fā)生的異常宏赘,多個(gè)異常是用逗號(hào)分隔的绒北。

45.異常處理的時(shí)候,finally代碼塊的重要性是什么察署?(譯者注:作者標(biāo)題的序號(hào)弄錯(cuò)了)

無(wú)論是否拋出異常闷游,finally代碼塊總是會(huì)被執(zhí)行。就算是沒(méi)有catch語(yǔ)句同時(shí)又拋出異常的情況下,finally代碼塊仍然會(huì)被執(zhí)行脐往。最后要說(shuō)的是休吠,finally代碼塊主要用來(lái)釋放資源,比如:I/O緩沖區(qū)业簿,數(shù)據(jù)庫(kù)連接瘤礁。

46.異常處理完成以后,Exception對(duì)象會(huì)發(fā)生什么變化梅尤?

Exception對(duì)象會(huì)在下一個(gè)垃圾回收過(guò)程中被回收掉柜思。

47.finally代碼塊和finalize()方法有什么區(qū)別?

無(wú)論是否拋出異常巷燥,finally代碼塊都會(huì)執(zhí)行赡盘,它主要是用來(lái)釋放應(yīng)用占用的資源。finalize()方法是Object類(lèi)的一個(gè)protected方法缰揪,它是在對(duì)象被垃圾回收之前由Java虛擬機(jī)來(lái)調(diào)用的陨享。

Java小應(yīng)用程序(Applet)

48.什么是Applet?

java applet是能夠被包含在HTML頁(yè)面中并且能被啟用了java的客戶(hù)端瀏覽器執(zhí)行的程序钝腺。Applet主要用來(lái)創(chuàng)建動(dòng)態(tài)交互的web應(yīng)用程序抛姑。

49.解釋一下Applet的生命周期

applet可以經(jīng)歷下面的狀態(tài):

Init:每次被載入的時(shí)候都會(huì)被初始化。

Start:開(kāi)始執(zhí)行applet拍屑。

Stop:結(jié)束執(zhí)行applet途戒。

Destroy:卸載applet之前,做最后的清理工作僵驰。

50.當(dāng)applet被載入的時(shí)候會(huì)發(fā)生什么喷斋?

首先,創(chuàng)建applet控制類(lèi)的實(shí)例蒜茴,然后初始化applet星爪,最后開(kāi)始運(yùn)行。

51.Applet和普通的Java應(yīng)用程序有什么區(qū)別粉私?

applet是運(yùn)行在啟用了java的瀏覽器中顽腾,Java應(yīng)用程序是可以在瀏覽器之外運(yùn)行的獨(dú)立的Java程序。但是诺核,它們都需要有Java虛擬機(jī)抄肖。

進(jìn)一步來(lái)說(shuō),Java應(yīng)用程序需要一個(gè)有特定方法簽名的main函數(shù)來(lái)開(kāi)始執(zhí)行窖杀。Java applet不需要這樣的函數(shù)來(lái)開(kāi)始執(zhí)行漓摩。

最后,Java applet一般會(huì)使用很?chē)?yán)格的安全策略入客,Java應(yīng)用一般使用比較寬松的安全策略管毙。

52.Java applet有哪些限制條件腿椎?

主要是由于安全的原因,給applet施加了以下的限制:

applet不能夠載入類(lèi)庫(kù)或者定義本地方法夭咬。

applet不能在宿主機(jī)上讀寫(xiě)文件啃炸。

applet不能讀取特定的系統(tǒng)屬性。

applet不能發(fā)起網(wǎng)絡(luò)連接卓舵,除非是跟宿主機(jī)南用。

applet不能夠開(kāi)啟宿主機(jī)上其他任何的程序。

53.什么是不受信任的applet边器?

不受信任的applet是不能訪(fǎng)問(wèn)或是執(zhí)行本地系統(tǒng)文件的Java applet训枢,默認(rèn)情況下,所有下載的applet都是不受信任的忘巧。

54.從網(wǎng)絡(luò)上加載的applet和從本地文件系統(tǒng)加載的applet有什么區(qū)別恒界?

當(dāng)applet是從網(wǎng)絡(luò)上加載的時(shí)候,applet是由applet類(lèi)加載器載入的砚嘴,它受applet安全管理器的限制十酣。

當(dāng)applet是從客戶(hù)端的本地磁盤(pán)載入的時(shí)候,applet是由文件系統(tǒng)加載器載入的际长。

從文件系統(tǒng)載入的applet允許在客戶(hù)端讀文件耸采,寫(xiě)文件,加載類(lèi)庫(kù)工育,并且也允許執(zhí)行其他程序虾宇,但是,卻通不過(guò)字節(jié)碼校驗(yàn)如绸。

55.applet類(lèi)加載器是什么嘱朽?它會(huì)做哪些工作?

當(dāng)applet是從網(wǎng)絡(luò)上加載的時(shí)候怔接,它是由applet類(lèi)加載器載入的搪泳。類(lèi)加載器有自己的java名稱(chēng)空間等級(jí)結(jié)構(gòu)。類(lèi)加載器會(huì)保證來(lái)自文件系統(tǒng)的類(lèi)有唯一的名稱(chēng)空間扼脐,來(lái)自網(wǎng)絡(luò)資源的類(lèi)有唯一的名稱(chēng)空間岸军。

當(dāng)瀏覽器通過(guò)網(wǎng)絡(luò)載入applet的時(shí)候,applet的類(lèi)被放置于和applet的源相關(guān)聯(lián)的私有的名稱(chēng)空間中瓦侮。然后艰赞,那些被類(lèi)加載器載入進(jìn)來(lái)的類(lèi)都是通過(guò)了驗(yàn)證器驗(yàn)證的。驗(yàn)證器會(huì)檢查類(lèi)文件格式是否遵守Java語(yǔ)言規(guī)范肚吏,確保不會(huì)出現(xiàn)堆棧溢出(stack overflow)或者下溢(underflow)猖毫,傳遞給字節(jié)碼指令的參數(shù)是正確的。

56.applet安全管理器是什么须喂?它會(huì)做哪些工作吁断?

applet安全管理器是給applet施加限制條件的一種機(jī)制。瀏覽器可以只有一個(gè)安全管理器坞生。安全管理器在啟動(dòng)的時(shí)候被創(chuàng)建仔役,之后不能被替換覆蓋或者是擴(kuò)展。

Swing

57.彈出式選擇菜單(Choice)和列表(List)有什么區(qū)別

Choice是以一種緊湊的形式展示的是己,需要下拉才能看到所有的選項(xiàng)又兵。Choice中一次只能選中一個(gè)選項(xiàng)。List同時(shí)可以有多個(gè)元素可見(jiàn)卒废,支持選中一個(gè)或者多個(gè)元素沛厨。

58.什么是布局管理器?

布局管理器用來(lái)在容器中組織組件摔认。

59.滾動(dòng)條(Scrollbar)和滾動(dòng)面板(JScrollPane)有什么區(qū)別逆皮?

Scrollbar是一個(gè)組件,不是容器参袱。而ScrollPane是容器电谣。ScrollPane自己處理滾動(dòng)事件。

60.哪些Swing的方法是線(xiàn)程安全的抹蚀?

只有3個(gè)線(xiàn)程安全的方法: repaint(), revalidate(), and invalidate()剿牺。

61.說(shuō)出三種支持重繪(painting)的組件。

Canvas, Frame, Panel,和Applet支持重繪环壤。

62.什么是裁剪(clipping)晒来?

限制在一個(gè)給定的區(qū)域或者形狀的繪圖操作就做裁剪。

63.MenuItem和CheckboxMenuItem的區(qū)別是什么郑现?

CheckboxMenuItem類(lèi)繼承自MenuItem類(lèi)湃崩,支持菜單選項(xiàng)可以選中或者不選中。

64.邊緣布局(BorderLayout)里面的元素是如何布局的懂酱?

BorderLayout里面的元素是按照容器的東西南北中進(jìn)行布局的浩蓉。

65.網(wǎng)格包布局(GridBagLayout)里面的元素是如何布局的?

GridBagLayout里面的元素是按照網(wǎng)格進(jìn)行布局的猴抹。不同大小的元素可能會(huì)占據(jù)網(wǎng)格的多于1行或一列划纽。因此,行數(shù)和列數(shù)可以有不同的大小瞎领。

66.Window和Frame有什么區(qū)別泌辫?

Frame類(lèi)繼承了Window類(lèi),它定義了一個(gè)可以有菜單欄的主應(yīng)用窗口九默。

67.裁剪(clipping)和重繪(repainting)有什么聯(lián)系震放?

當(dāng)窗口被AWT重繪線(xiàn)程進(jìn)行重繪的時(shí)候,它會(huì)把裁剪區(qū)域設(shè)置成需要重繪的窗口的區(qū)域驼修。

68.事件監(jiān)聽(tīng)器接口(event-listener interface)和事件適配器(event-adapter)有什么關(guān)系殿遂?

事件監(jiān)聽(tīng)器接口定義了對(duì)特定的事件诈铛,事件處理器必須要實(shí)現(xiàn)的方法。事件適配器給事件監(jiān)聽(tīng)器接口提供了默認(rèn)的實(shí)現(xiàn)墨礁。

69.GUI組件如何來(lái)處理它自己的事件幢竹?

GUI組件可以處理它自己的事件,只要它實(shí)現(xiàn)相對(duì)應(yīng)的事件監(jiān)聽(tīng)器接口恩静,并且把自己作為事件監(jiān)聽(tīng)器焕毫。

70.Java的布局管理器比傳統(tǒng)的窗口系統(tǒng)有哪些優(yōu)勢(shì)?

Java使用布局管理器以一種一致的方式在所有的窗口平臺(tái)上擺放組件驶乾。因?yàn)椴季止芾砥鞑粫?huì)和組件的絕對(duì)大小和位置相綁定邑飒,所以他們能夠適應(yīng)跨窗口系統(tǒng)的特定平臺(tái)的不同。

71.Java的Swing組件使用了哪種設(shè)計(jì)模式级乐?

Java中的Swing組件使用了MVC(視圖-模型-控制器)設(shè)計(jì)模式疙咸。

JDBC

72.什么是JDBC?

JDBC是允許用戶(hù)在不同數(shù)據(jù)庫(kù)之間做選擇的一個(gè)抽象層唇牧。JDBC允許開(kāi)發(fā)者用JAVA寫(xiě)數(shù)據(jù)庫(kù)應(yīng)用程序罕扎,而不需要關(guān)心底層特定數(shù)據(jù)庫(kù)的細(xì)節(jié)。

73.解釋下驅(qū)動(dòng)(Driver)在JDBC中的角色丐重。

JDBC驅(qū)動(dòng)提供了特定廠(chǎng)商對(duì)JDBC API接口類(lèi)的實(shí)現(xiàn)腔召,驅(qū)動(dòng)必須要提供java.sql包下面這些類(lèi)的實(shí)現(xiàn):Connection, Statement, PreparedStatement,CallableStatement, ResultSet和Driver。

74.Class.forName()方法有什么作用扮惦?

這個(gè)方法用來(lái)載入跟數(shù)據(jù)庫(kù)建立連接的驅(qū)動(dòng)臀蛛。

75.PreparedStatement比Statement有什么優(yōu)勢(shì)?

PreparedStatements是預(yù)編譯的崖蜜,因此浊仆,性能會(huì)更好。同時(shí)豫领,不同的查詢(xún)參數(shù)值抡柿,PreparedStatement可以重用。

76.什么時(shí)候使用CallableStatement等恐?用來(lái)準(zhǔn)備CallableStatement的方法是什么洲劣?

CallableStatement用來(lái)執(zhí)行存儲(chǔ)過(guò)程。存儲(chǔ)過(guò)程是由數(shù)據(jù)庫(kù)存儲(chǔ)和提供的课蔬。存儲(chǔ)過(guò)程可以接受輸入?yún)?shù)囱稽,也可以有返回結(jié)果。非常鼓勵(lì)使用存儲(chǔ)過(guò)程二跋,因?yàn)樗峁┝税踩院湍K化战惊。準(zhǔn)備一個(gè)CallableStatement的方法是:

1

CallableStament.prepareCall();

77.數(shù)據(jù)庫(kù)連接池是什么意思?

像打開(kāi)關(guān)閉數(shù)據(jù)庫(kù)連接這種和數(shù)據(jù)庫(kù)的交互可能是很費(fèi)時(shí)的扎即,尤其是當(dāng)客戶(hù)端數(shù)量增加的時(shí)候吞获,會(huì)消耗大量的資源况凉,成本是非常高的∩栏纾可以在應(yīng)用服務(wù)器啟動(dòng)的時(shí)候建立很多個(gè)數(shù)據(jù)庫(kù)連接并維護(hù)在一個(gè)池中茎刚。連接請(qǐng)求由池中的連接提供。在連接使用完畢以后撤逢,把連接歸還到池中,以用于滿(mǎn)足將來(lái)更多的請(qǐng)求粮坞。

遠(yuǎn)程方法調(diào)用(RMI)

78.什么是RMI蚊荣?

Java遠(yuǎn)程方法調(diào)用(Java RMI)是Java API對(duì)遠(yuǎn)程過(guò)程調(diào)用(RPC)提供的面向?qū)ο蟮牡葍r(jià)形式,支持直接傳輸序列化的Java對(duì)象和分布式垃圾回收莫杈。遠(yuǎn)程方法調(diào)用可以看做是激活遠(yuǎn)程正在運(yùn)行的對(duì)象上的方法的步驟互例。RMI對(duì)調(diào)用者是位置透明的,因?yàn)檎{(diào)用者感覺(jué)方法是執(zhí)行在本地運(yùn)行的對(duì)象上的筝闹∠边叮看下RMI的一些注意事項(xiàng)。

79.RMI體系結(jié)構(gòu)的基本原則是什么关顷?

RMI體系結(jié)構(gòu)是基于一個(gè)非常重要的行為定義和行為實(shí)現(xiàn)相分離的原則糊秆。RMI允許定義行為的代碼和實(shí)現(xiàn)行為的代碼相分離,并且運(yùn)行在不同的JVM上议双。

80.RMI體系結(jié)構(gòu)分哪幾層痘番?

RMI體系結(jié)構(gòu)分以下幾層:

存根和骨架層(Stub and Skeleton layer):這一層對(duì)程序員是透明的,它主要負(fù)責(zé)攔截客戶(hù)端發(fā)出的方法調(diào)用請(qǐng)求平痰,然后把請(qǐng)求重定向給遠(yuǎn)程的RMI服務(wù)汞舱。

遠(yuǎn)程引用層(Remote Reference Layer):RMI體系結(jié)構(gòu)的第二層用來(lái)解析客戶(hù)端對(duì)服務(wù)端遠(yuǎn)程對(duì)象的引用。這一層解析并管理客戶(hù)端對(duì)服務(wù)端遠(yuǎn)程對(duì)象的引用宗雇。連接是點(diǎn)到點(diǎn)的昂芜。

傳輸層(Transport layer):這一層負(fù)責(zé)連接參與服務(wù)的兩個(gè)JVM。這一層是建立在網(wǎng)絡(luò)上機(jī)器間的TCP/IP連接之上的赔蒲。它提供了基本的連接服務(wù)泌神,還有一些防火墻穿透策略。

81.RMI中的遠(yuǎn)程接口(Remote Interface)扮演了什么樣的角色嘹履?

遠(yuǎn)程接口用來(lái)標(biāo)識(shí)哪些方法是可以被非本地虛擬機(jī)調(diào)用的接口腻扇。遠(yuǎn)程對(duì)象必須要直接或者是間接實(shí)現(xiàn)遠(yuǎn)程接口。實(shí)現(xiàn)了遠(yuǎn)程接口的類(lèi)應(yīng)該聲明被實(shí)現(xiàn)的遠(yuǎn)程接口砾嫉,給每一個(gè)遠(yuǎn)程對(duì)象定義構(gòu)造函數(shù)幼苛,給所有遠(yuǎn)程接口的方法提供實(shí)現(xiàn)。

82.java.rmi.Naming類(lèi)扮演了什么樣的角色焕刮?

java.rmi.Naming類(lèi)用來(lái)存儲(chǔ)和獲取在遠(yuǎn)程對(duì)象注冊(cè)表里面的遠(yuǎn)程對(duì)象的引用舶沿。Naming類(lèi)的每一個(gè)方法接收一個(gè)URL格式的String對(duì)象作為它的參數(shù)墙杯。

83.RMI的綁定(Binding)是什么意思?

綁定是為了查詢(xún)找遠(yuǎn)程對(duì)象而給遠(yuǎn)程對(duì)象關(guān)聯(lián)或者是注冊(cè)以后會(huì)用到的名稱(chēng)的過(guò)程括荡。遠(yuǎn)程對(duì)象可以使用Naming類(lèi)的bind()或者rebind()方法跟名稱(chēng)相關(guān)聯(lián)高镐。

84.Naming類(lèi)的bind()和rebind()方法有什么區(qū)別?

bind()方法負(fù)責(zé)把指定名稱(chēng)綁定給遠(yuǎn)程對(duì)象畸冲,rebind()方法負(fù)責(zé)把指定名稱(chēng)重新綁定到一個(gè)新的遠(yuǎn)程對(duì)象嫉髓。如果那個(gè)名稱(chēng)已經(jīng)綁定過(guò)了,先前的綁定會(huì)被替換掉邑闲。

85.讓RMI程序能正確運(yùn)行有哪些步驟算行?

為了讓RMI程序能正確運(yùn)行必須要包含以下幾個(gè)步驟:

編譯所有的源文件。

使用rmic生成stub苫耸。

啟動(dòng)rmiregistry州邢。

啟動(dòng)RMI服務(wù)器。

運(yùn)行客戶(hù)端程序褪子。

86.RMI的stub扮演了什么樣的角色量淌?

遠(yuǎn)程對(duì)象的stub扮演了遠(yuǎn)程對(duì)象的代表或者代理的角色。調(diào)用者在本地stub上調(diào)用方法嫌褪,它負(fù)責(zé)在遠(yuǎn)程對(duì)象上執(zhí)行方法呀枢。當(dāng)stub的方法被調(diào)用的時(shí)候,會(huì)經(jīng)歷以下幾個(gè)步驟:

初始化到包含了遠(yuǎn)程對(duì)象的JVM的連接渔扎。

序列化參數(shù)到遠(yuǎn)程的JVM硫狞。

等待方法調(diào)用和執(zhí)行的結(jié)果。

反序列化返回的值或者是方法沒(méi)有執(zhí)行成功情況下的異常晃痴。

把值返回給調(diào)用者残吩。

87.什么是分布式垃圾回收(DGC)?它是如何工作的倘核?

DGC叫做分布式垃圾回收泣侮。RMI使用DGC來(lái)做自動(dòng)垃圾回收。因?yàn)镽MI包含了跨虛擬機(jī)的遠(yuǎn)程對(duì)象的引用紧唱,垃圾回收是很困難的活尊。DGC使用引用計(jì)數(shù)算法來(lái)給遠(yuǎn)程對(duì)象提供自動(dòng)內(nèi)存管理。

88.RMI中使用RMI安全管理器(RMISecurityManager)的目的是什么漏益?

RMISecurityManager使用下載好的代碼提供可被RMI應(yīng)用程序使用的安全管理器蛹锰。如果沒(méi)有設(shè)置安全管理器,RMI的類(lèi)加載器就不會(huì)從遠(yuǎn)程下載任何的類(lèi)绰疤。

89.解釋下Marshalling和demarshalling铜犬。

當(dāng)應(yīng)用程序希望把內(nèi)存對(duì)象跨網(wǎng)絡(luò)傳遞到另一臺(tái)主機(jī)或者是持久化到存儲(chǔ)的時(shí)候,就必須要把對(duì)象在內(nèi)存里面的表示轉(zhuǎn)化成合適的格式。這個(gè)過(guò)程就叫做Marshalling癣猾,反之就是demarshalling敛劝。

90.解釋下Serialization和Deserialization。

Java提供了一種叫做對(duì)象序列化的機(jī)制纷宇,他把對(duì)象表示成一連串的字節(jié)夸盟,里面包含了對(duì)象的數(shù)據(jù),對(duì)象的類(lèi)型信息像捶,對(duì)象內(nèi)部的數(shù)據(jù)的類(lèi)型信息等等上陕。因此,序列化可以看成是為了把對(duì)象存儲(chǔ)在磁盤(pán)上或者是從磁盤(pán)上讀出來(lái)并重建對(duì)象而把對(duì)象扁平化的一種方式作岖。反序列化是把對(duì)象從扁平狀態(tài)轉(zhuǎn)化成活動(dòng)對(duì)象的相反的步驟唆垃。

Servlet

91.什么是Servlet?

Servlet是用來(lái)處理客戶(hù)端請(qǐng)求并產(chǎn)生動(dòng)態(tài)網(wǎng)頁(yè)內(nèi)容的Java類(lèi)痘儡。Servlet主要是用來(lái)處理或者是存儲(chǔ)HTML表單提交的數(shù)據(jù),產(chǎn)生動(dòng)態(tài)內(nèi)容枢步,在無(wú)狀態(tài)的HTTP協(xié)議下管理狀態(tài)信息沉删。

92.說(shuō)一下Servlet的體系結(jié)構(gòu)。

所有的Servlet都必須要實(shí)現(xiàn)的核心的接口是javax.servlet.Servlet醉途。每一個(gè)Servlet都必須要直接或者是間接實(shí)現(xiàn)這個(gè)接口矾瑰,或者是繼承javax.servlet.GenericServlet或者javax.servlet.http.HTTPServlet。最后隘擎,Servlet使用多線(xiàn)程可以并行的為多個(gè)請(qǐng)求服務(wù)殴穴。

93.Applet和Servlet有什么區(qū)別?

Applet是運(yùn)行在客戶(hù)端主機(jī)的瀏覽器上的客戶(hù)端Java程序货葬。而Servlet是運(yùn)行在web服務(wù)器上的服務(wù)端的組件采幌。applet可以使用用戶(hù)界面類(lèi),而Servlet沒(méi)有用戶(hù)界面震桶,相反休傍,Servlet是等待客戶(hù)端的HTTP請(qǐng)求,然后為請(qǐng)求產(chǎn)生響應(yīng)蹲姐。

94.GenericServlet和HttpServlet有什么區(qū)別磨取?

GenericServlet是一個(gè)通用的協(xié)議無(wú)關(guān)的Servlet,它實(shí)現(xiàn)了Servlet和ServletConfig接口柴墩。繼承自GenericServlet的Servlet應(yīng)該要覆蓋service()方法忙厌。最后,為了開(kāi)發(fā)一個(gè)能用在網(wǎng)頁(yè)上服務(wù)于使用HTTP協(xié)議請(qǐng)求的Servlet江咳,你的Servlet必須要繼承自HttpServlet逢净。這里有Servlet的例子。

95.解釋下Servlet的生命周期。

對(duì)每一個(gè)客戶(hù)端的請(qǐng)求汹胃,Servlet引擎載入Servlet婶芭,調(diào)用它的init()方法,完成Servlet的初始化着饥。然后犀农,Servlet對(duì)象通過(guò)為每一個(gè)請(qǐng)求單獨(dú)調(diào)用service()方法來(lái)處理所有隨后來(lái)自客戶(hù)端的請(qǐng)求,最后宰掉,調(diào)用Servlet(譯者注:這里應(yīng)該是Servlet而不是server)的destroy()方法把Servlet刪除掉呵哨。

96.doGet()方法和doPost()方法有什么區(qū)別?

doGet:GET方法會(huì)把名值對(duì)追加在請(qǐng)求的URL后面轨奄。因?yàn)閁RL對(duì)字符數(shù)目有限制孟害,進(jìn)而限制了用在客戶(hù)端請(qǐng)求的參數(shù)值的數(shù)目。并且請(qǐng)求中的參數(shù)值是可見(jiàn)的挪拟,因此挨务,敏感信息不能用這種方式傳遞。

doPOST:POST方法通過(guò)把請(qǐng)求參數(shù)值放在請(qǐng)求體中來(lái)克服GET方法的限制玉组,因此谎柄,可以發(fā)送的參數(shù)的數(shù)目是沒(méi)有限制的。最后惯雳,通過(guò)POST請(qǐng)求傳遞的敏感信息對(duì)外部客戶(hù)端是不可見(jiàn)的朝巫。

97.什么是Web應(yīng)用程序?

Web應(yīng)用程序是對(duì)Web或者是應(yīng)用服務(wù)器的動(dòng)態(tài)擴(kuò)展石景。有兩種類(lèi)型的Web應(yīng)用:面向表現(xiàn)的和面向服務(wù)的劈猿。面向表現(xiàn)的Web應(yīng)用程序會(huì)產(chǎn)生包含了很多種標(biāo)記語(yǔ)言和動(dòng)態(tài)內(nèi)容的交互的web頁(yè)面作為對(duì)請(qǐng)求的響應(yīng)。而面向服務(wù)的Web應(yīng)用實(shí)現(xiàn)了Web服務(wù)的端點(diǎn)(endpoint)潮孽。一般來(lái)說(shuō)揪荣,一個(gè)Web應(yīng)用可以看成是一組安裝在服務(wù)器URL名稱(chēng)空間的特定子集下面的Servlet的集合。

98.什么是服務(wù)端包含(Server Side Include)恩商?

服務(wù)端包含(SSI)是一種簡(jiǎn)單的解釋型服務(wù)端腳本語(yǔ)言变逃,大多數(shù)時(shí)候僅用在Web上,用servlet標(biāo)簽嵌入進(jìn)來(lái)怠堪。SSI最常用的場(chǎng)景把一個(gè)或多個(gè)文件包含到Web服務(wù)器的一個(gè)Web頁(yè)面中揽乱。當(dāng)瀏覽器訪(fǎng)問(wèn)Web頁(yè)面的時(shí)候,Web服務(wù)器會(huì)用對(duì)應(yīng)的servlet產(chǎn)生的文本來(lái)替換Web頁(yè)面中的servlet標(biāo)簽粟矿。

99.什么是Servlet鏈(Servlet Chaining)凰棉?

Servlet鏈?zhǔn)前岩粋€(gè)Servlet的輸出發(fā)送給另一個(gè)Servlet的方法。第二個(gè)Servlet的輸出可以發(fā)送給第三個(gè)Servlet陌粹,依次類(lèi)推撒犀。鏈條上最后一個(gè)Servlet負(fù)責(zé)把響應(yīng)發(fā)送給客戶(hù)端。

100.如何知道是哪一個(gè)客戶(hù)端的機(jī)器正在請(qǐng)求你的Servlet?

ServletRequest類(lèi)可以找出客戶(hù)端機(jī)器的IP地址或者是主機(jī)名或舞。getRemoteAddr()方法獲取客戶(hù)端主機(jī)的IP地址荆姆,getRemoteHost()可以獲取主機(jī)名∮车剩看下這里的例子胆筒。

101.HTTP響應(yīng)的結(jié)構(gòu)是怎么樣的?

HTTP響應(yīng)由三個(gè)部分組成:

狀態(tài)碼(Status Code):描述了響應(yīng)的狀態(tài)诈豌∑途龋可以用來(lái)檢查是否成功的完成了請(qǐng)求。請(qǐng)求失敗的情況下矫渔,狀態(tài)碼可用來(lái)找出失敗的原因彤蔽。如果Servlet沒(méi)有返回狀態(tài)碼,默認(rèn)會(huì)返回成功的狀態(tài)碼HttpServletResponse.SC_OK庙洼。

HTTP頭部(HTTP Header):它們包含了更多關(guān)于響應(yīng)的信息顿痪。比如:頭部可以指定認(rèn)為響應(yīng)過(guò)期的過(guò)期日期,或者是指定用來(lái)給用戶(hù)安全的傳輸實(shí)體內(nèi)容的編碼格式油够。如何在Serlet中檢索HTTP的頭部看這里员魏。

主體(Body):它包含了響應(yīng)的內(nèi)容。它可以包含HTML代碼叠聋,圖片,等等受裹。主體是由傳輸在HTTP消息中緊跟在頭部后面的數(shù)據(jù)字節(jié)組成的碌补。

102.什么是cookie?session和cookie有什么區(qū)別棉饶?

cookie是Web服務(wù)器發(fā)送給瀏覽器的一塊信息厦章。瀏覽器會(huì)在本地文件中給每一個(gè)Web服務(wù)器存儲(chǔ)cookie。以后瀏覽器在給特定的Web服務(wù)器發(fā)請(qǐng)求的時(shí)候照藻,同時(shí)會(huì)發(fā)送所有為該服務(wù)器存儲(chǔ)的cookie袜啃。下面列出了session和cookie的區(qū)別:

無(wú)論客戶(hù)端瀏覽器做怎么樣的設(shè)置,session都應(yīng)該能正常工作幸缕∪悍ⅲ客戶(hù)端可以選擇禁用cookie,但是发乔,session仍然是能夠工作的熟妓,因?yàn)榭蛻?hù)端無(wú)法禁用服務(wù)端的session。


在存儲(chǔ)的數(shù)據(jù)量方面session和cookies也是不一樣的栏尚。session能夠存儲(chǔ)任意的Java對(duì)象起愈,cookie只能存儲(chǔ)String類(lèi)型的對(duì)象。


103.瀏覽器和Servlet通信使用的是什么協(xié)議?

瀏覽器和Servlet通信使用的是HTTP協(xié)議抬虽。

104.什么是HTTP隧道官觅?

HTTP隧道是一種利用HTTP或者是HTTPS把多種網(wǎng)絡(luò)協(xié)議封裝起來(lái)進(jìn)行通信的技術(shù)。因此阐污,HTTP協(xié)議扮演了一個(gè)打通用于通信的網(wǎng)絡(luò)協(xié)議的管道的包裝器的角色休涤。把其他協(xié)議的請(qǐng)求掩蓋成HTTP的請(qǐng)求就是HTTP隧道。

105.sendRedirect()和forward()方法有什么區(qū)別疤剑?

sendRedirect()方法會(huì)創(chuàng)建一個(gè)新的請(qǐng)求滑绒,而forward()方法只是把請(qǐng)求轉(zhuǎn)發(fā)到一個(gè)新的目標(biāo)上。重定向(redirect)以后隘膘,之前請(qǐng)求作用域范圍以?xún)?nèi)的對(duì)象就失效了疑故,因?yàn)闀?huì)產(chǎn)生一個(gè)新的請(qǐng)求,而轉(zhuǎn)發(fā)(forwarding)以后弯菊,之前請(qǐng)求作用域范圍以?xún)?nèi)的對(duì)象還是能訪(fǎng)問(wèn)的纵势。一般認(rèn)為sendRedirect()比f(wàn)orward()要慢。

106.什么是URL編碼和URL解碼管钳?

URL編碼是負(fù)責(zé)把URL里面的空格和其他的特殊字符替換成對(duì)應(yīng)的十六進(jìn)制表示钦铁,反之就是解碼。

JSP

107.什么是JSP頁(yè)面才漆?

JSP頁(yè)面是一種包含了靜態(tài)數(shù)據(jù)和JSP元素兩種類(lèi)型的文本的文本文檔牛曹。靜態(tài)數(shù)據(jù)可以用任何基于文本的格式來(lái)表示,比如:HTML或者XML醇滥。JSP是一種混合了靜態(tài)內(nèi)容和動(dòng)態(tài)產(chǎn)生的內(nèi)容的技術(shù)黎比。這里看下JSP的例子。

108.JSP請(qǐng)求是如何被處理的鸳玩?

瀏覽器首先要請(qǐng)求一個(gè)以.jsp擴(kuò)展名結(jié)尾的頁(yè)面阅虫,發(fā)起JSP請(qǐng)求,然后不跟,Web服務(wù)器讀取這個(gè)請(qǐng)求颓帝,使用JSP編譯器把JSP頁(yè)面轉(zhuǎn)化成一個(gè)Servlet類(lèi)。需要注意的是窝革,只有當(dāng)?shù)谝淮握?qǐng)求頁(yè)面或者是JSP文件發(fā)生改變的時(shí)候JSP文件才會(huì)被編譯购城,然后服務(wù)器調(diào)用servlet類(lèi),處理瀏覽器的請(qǐng)求聊闯。一旦請(qǐng)求執(zhí)行結(jié)束工猜,servlet會(huì)把響應(yīng)發(fā)送給客戶(hù)端。這里看下如何在JSP中獲取請(qǐng)求參數(shù)菱蔬。

109.JSP有什么優(yōu)點(diǎn)篷帅?

下面列出了使用JSP的優(yōu)點(diǎn):

JSP頁(yè)面是被動(dòng)態(tài)編譯成Servlet的史侣,因此,開(kāi)發(fā)者可以很容易的更新展現(xiàn)代碼魏身。

JSP頁(yè)面可以被預(yù)編譯惊橱。

JSP頁(yè)面可以很容易的和靜態(tài)模板結(jié)合,包括:HTML或者XML箭昵,也可以很容易的和產(chǎn)生動(dòng)態(tài)內(nèi)容的代碼結(jié)合起來(lái)税朴。

開(kāi)發(fā)者可以提供讓頁(yè)面設(shè)計(jì)者以類(lèi)XML格式來(lái)訪(fǎng)問(wèn)的自定義的JSP標(biāo)簽庫(kù)。

開(kāi)發(fā)者可以在組件層做邏輯上的改變家制,而不需要編輯單獨(dú)使用了應(yīng)用層邏輯的頁(yè)面正林。

110.什么是JSP指令(Directive)?JSP中有哪些不同類(lèi)型的指令颤殴?

Directive是當(dāng)JSP頁(yè)面被編譯成Servlet的時(shí)候觅廓,JSP引擎要處理的指令。Directive用來(lái)設(shè)置頁(yè)面級(jí)別的指令涵但,從外部文件插入數(shù)據(jù)杈绸,指定自定義的標(biāo)簽庫(kù)。Directive是定義在<%@ 和 %>之間的矮瘟。下面列出了不同類(lèi)型的Directive:

包含指令(Include directive):用來(lái)包含文件和合并文件內(nèi)容到當(dāng)前的頁(yè)面瞳脓。

頁(yè)面指令(Page directive):用來(lái)定義JSP頁(yè)面中特定的屬性,比如錯(cuò)誤頁(yè)面和緩沖區(qū)澈侠。

Taglib指令: 用來(lái)聲明頁(yè)面中使用的自定義的標(biāo)簽庫(kù)劫侧。

111.什么是JSP動(dòng)作(JSP action)?

JSP動(dòng)作以XML語(yǔ)法的結(jié)構(gòu)來(lái)控制Servlet引擎的行為哨啃。當(dāng)JSP頁(yè)面被請(qǐng)求的時(shí)候板辽,JSP動(dòng)作會(huì)被執(zhí)行。它們可以被動(dòng)態(tài)的插入到文件中棘催,重用JavaBean組件,轉(zhuǎn)發(fā)用戶(hù)到其他的頁(yè)面耳标,或者是給Java插件產(chǎn)生HTML代碼醇坝。下面列出了可用的動(dòng)作:

jsp:include-當(dāng)JSP頁(yè)面被請(qǐng)求的時(shí)候包含一個(gè)文件。

jsp:useBean-找出或者是初始化Javabean次坡。

jsp:setProperty-設(shè)置JavaBean的屬性呼猪。

jsp:getProperty-獲取JavaBean的屬性。

jsp:forward-把請(qǐng)求轉(zhuǎn)發(fā)到新的頁(yè)面砸琅。

jsp:plugin-產(chǎn)生特定瀏覽器的代碼宋距。

112.什么是Scriptlets?

JSP技術(shù)中症脂,scriptlet是嵌入在JSP頁(yè)面中的一段Java代碼谚赎。scriptlet是位于標(biāo)簽內(nèi)部的所有的東西淫僻,在標(biāo)簽與標(biāo)簽之間,用戶(hù)可以添加任意有效的scriplet壶唤。

113.聲明(Decalaration)在哪里雳灵?

聲明跟Java中的變量聲明很相似,它用來(lái)聲明隨后要被表達(dá)式或者scriptlet使用的變量闸盔。添加的聲明必須要用開(kāi)始和結(jié)束標(biāo)簽包起來(lái)悯辙。

114.什么是表達(dá)式(Expression)?

【列表很長(zhǎng)迎吵,可以分上躲撰、中、下發(fā)布】

JSP表達(dá)式是Web服務(wù)器把腳本語(yǔ)言表達(dá)式的值轉(zhuǎn)化成一個(gè)String對(duì)象击费,插入到返回給客戶(hù)端的數(shù)據(jù)流中拢蛋。表達(dá)式是在<%=和%>這兩個(gè)標(biāo)簽之間定義的。

115.隱含對(duì)象是什么意思荡灾?有哪些隱含對(duì)象瓤狐?

JSP隱含對(duì)象是頁(yè)面中的一些Java對(duì)象,JSP容器讓這些Java對(duì)象可以為開(kāi)發(fā)者所使用批幌。開(kāi)發(fā)者不用明確的聲明就可以直接使用他們犁罩。JSP隱含對(duì)象也叫做預(yù)定義變量锥惋。下面列出了JSP頁(yè)面中的隱含對(duì)象:

application

page

request

response

session

exception

out

config

pageContext

你還在看么?哇,這可是一篇關(guān)于可用在Java面試中的各種類(lèi)型問(wèn)題的非常非常長(zhǎng)的文章再芋。


Web尋夢(mèng)獅博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市巨税,隨后出現(xiàn)的幾起案子达吞,更是在濱河造成了極大的恐慌,老刑警劉巖绸罗,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件意推,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡珊蟀,警方通過(guò)查閱死者的電腦和手機(jī)菊值,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)育灸,“玉大人腻窒,你說(shuō)我怎么就攤上這事“跽福” “怎么了儿子?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)砸喻。 經(jīng)常有香客問(wèn)我柔逼,道長(zhǎng)蒋譬,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任卒落,我火速辦了婚禮羡铲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘儡毕。我一直安慰自己也切,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布腰湾。 她就那樣靜靜地躺著雷恃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪费坊。 梳的紋絲不亂的頭發(fā)上倒槐,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音附井,去河邊找鬼讨越。 笑死,一個(gè)胖子當(dāng)著我的面吹牛永毅,可吹牛的內(nèi)容都是我干的把跨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼沼死,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼着逐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起意蛀,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤耸别,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后县钥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體秀姐,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年若贮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了囊扳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兜看,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狭瞎,到底是詐尸還是另有隱情细移,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布熊锭,位于F島的核電站弧轧,受9級(jí)特大地震影響雪侥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜精绎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一速缨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧代乃,春花似錦旬牲、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至堕仔,卻和暖如春擂橘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背摩骨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工通贞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恼五。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓昌罩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親唤冈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子峡迷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Java 面試題 整理自呕娓悖客網(wǎng) 什么是Java虛擬機(jī)?為什么Java被稱(chēng)作是“平臺(tái)無(wú)關(guān)的編程語(yǔ)言”傅物? Java虛擬...
    GuaKin_Huang閱讀 10,668評(píng)論 19 265
  • Java是一個(gè)支持并發(fā)夯辖、基于類(lèi)和面向?qū)ο蟮挠?jì)算機(jī)編程語(yǔ)言。下面列出了面向?qū)ο筌浖_(kāi)發(fā)的優(yōu)點(diǎn): 代碼開(kāi)發(fā)模塊化董饰,更易...
    安安靜靜寫(xiě)代碼閱讀 1,096評(píng)論 0 8
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法蒿褂,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法卒暂,繼承相關(guān)的語(yǔ)法啄栓,異常的語(yǔ)法,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,622評(píng)論 18 399
  • 面向?qū)ο缶幊蹋∣OP) Java是一個(gè)支持并發(fā)也祠、基于類(lèi)和面向?qū)ο蟮挠?jì)算機(jī)編程語(yǔ)言昙楚。下面列出了面向?qū)ο筌浖_(kāi)發(fā)的優(yōu)點(diǎn)...
    hutuxiaogui閱讀 939評(píng)論 0 2
  • 小編費(fèi)力收集:給你想要的面試集合 1.C++或Java中的異常處理機(jī)制的簡(jiǎn)單原理和應(yīng)用。 當(dāng)JAVA程序違反了JA...
    八爺君閱讀 4,587評(píng)論 1 114