第一篇討論了面向?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)的文章再芋。