JAVA面試資料整理(JavaWeb)

1、 理解javax.servlet.http.HttpSession

HttpSession是Java平臺對session機制的實現規範,因爲它僅僅是個接口,具體到每個web應用服務器的提供商,除了對規範支持之外,仍然會有一些規範裏沒有規定的細微差異。這裏我們以BEA的Weblogic Server8.1作爲例子來演示。

首先,Weblogic Server提供了一系列的參數來控制它的HttpSession的實現,包括使用cookie的開關選項,使用URL重寫的開關選項,session持久化的設置,session失效時間的設置,以及針對cookie的各種設置,比如設置cookie的名字、路徑、域, cookie的生存時間等。

一般情況下,session都是存儲在內存裏,當服務器進程被停止或者重啓的時候,內存裏的session也會被清空,如果設置了session的持久化特性,服務器就會把session保存到硬盤上,當服務器進程重新啓動或這些信息將能夠被再次使用, Weblogic Server支持的持久性方式包括文件、數據庫、客戶端cookie保存和複製。

複製嚴格說來不算持久化保存,因爲session實際上還是保存在內存裏,不過同樣的信息被複制到各個cluster內的服務器進程中,這樣即使某個服務器進程停止工作也仍然可以從其他進程中取得session。

cookie生存時間的設置則會影響瀏覽器生成的cookie是否是一個會話cookie。默認是使用會話cookie。有興趣的可以用它來試驗我們在第四節裏提到的那個誤解。

cookie的路徑對於web應用程序來說是一個非常重要的選項,Weblogic Server對這個選項的默認處理方式使得它與其他服務器有明顯的區別。後面我們會專題討論。

HttpSession類它提供了setAttribute()和getAttribute()方法存儲和檢索對象。HttpSession提供了一個會話ID關鍵字,一個參與會話行爲的客戶端在同一會話的請求中存儲和返回它。servlet引擎查找適當的會話對象,並使之對當前請求可用。HttpServletRequest 接口提供了以下方法來獲取HttpSession實例。

publicHttpSession getSession() :該方法取得請求所在的會話。

public HttpSession getSession(Booleancreate):返回當前請求的會話。如果當前請求不屬於任何會話,而且create參數爲true,則創建一個會話,否則返回null。此後所有來自同一個的請求都屬於這個會話,通過它的getSession返回的是當前會話。

2、 SOAP協議是什麼?

簡單對象訪問協議(Simple Object Access Protocol,SOAP),是一種輕量的、簡單的、基於XML的協議,它被設計成在WEB上交換結構化的和固化的信息。webService三要素(SOAP, WSDL (Web ServicesDescription Language),UDDI( Universal Description Discovery and Integration ))之一, soap用來傳遞信息的格式, WSDL 用來描述如何訪問具體的接口, uddi用來管理,分發,查詢webService 具體實現可以搜索 Web Services簡單實例 ; SOAP 可以和現存的許多因特網協議和格式結合使用,包括超文本傳輸協議(HTTP),簡單郵件傳輸協議(SMTP),多用途網際郵件擴充協議(MIME)。它還支持從消息系統到遠程過程調用(RPC)等大量的應用程序。SOAP使用基於XML的數據結構和超文本傳輸協議(HTTP)的組合定義了一個標準的方法來使用Internet上各種不同操作環境中的分佈式對象。

SOAP消息格式:<SOAP-ENV: Envelope Attributes><SOAP:HEADER></SOAP:HEADER><SOAP:Body></SOAP:Body></SOAP-ENV:Envelope>目前主要在web服務中運用。

3、如何使用jar命令對Class文件打成jar包(其實一般用eclipse打包,因爲用命令的時候經常會出錯)

Jar –cvf xx.jar /path/*.Class

4、Spring mvc的工作原理

spring mvc請所有的請求都提交給DispatcherServlet,它會委託應用系統的其他模塊負責負責對請求進行真正的處理工作。

DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.

DispatcherServlet請請求提交到目標Controller

Controller進行業務邏輯處理後,會返回一個ModelAndView

Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象

視圖對象負責渲染返回給客戶端。

5、Java的垃圾收集機制

       通常,我們把分配出去後,卻無法回收的內存空間稱爲"內存滲漏體(Memory Leaks)"。

  以上這種程序設計的潛在危險性在Java這樣以嚴謹、安全著稱的語言中是不允許的。但是Java語言既不能限制程序員編寫程序的自由性,又不能把聲明對象的部分去除(否則就不是面向對象的程序語言了),那麼最好的解決辦法就是從Java程序語言本身的特性入手。於是,Java技術提供了一個系統級的線程(Thread),即垃圾收集器線程(Garbage Collection Thread),來跟蹤每一塊分配出去的內存空間,當Java 虛擬機(Java Virtual Machine)處於空閒循環時,垃圾收集器線程會自動檢查每一快分配出去的內存空間,然後自動回收每一快可以回收的無用的內存塊。

  垃圾收集器線程是一種低優先級的線程,在一個Java程序的生命週期中,它只有在內存空閒的時候纔有機會運行。它有效地防止了內存滲漏體的出現,並極大可能地節省了寶貴的內存資源。但是,通過Java虛擬機來執行垃圾收集器的方案可以是多種多樣的。

  下面介紹垃圾收集器的特點和它的執行機制:

  垃圾收集器系統有自己的一套方案來判斷哪個內存塊是應該被回收的,哪個是不符合要求暫不回收的。垃圾收集器在一個Java程序中的執行是自動的,不能強制執行,即使程序員能明確地判斷出有一塊內存已經無用了,是應該回收的,程序員也不能強制垃圾收集器回收該內存塊。程序員唯一能做的就是通過調用System. gc 方法來"建議"執行垃圾收集器,但其是否可以執行,什麼時候執行卻都是不可知的。這也是垃圾收集器的最主要的缺點。當然相對於它給程序員帶來的巨大方便性而言,這個缺點是瑕不掩瑜的。

  垃圾收集器的主要特點

  1.垃圾收集器的工作目標是回收已經無用的對象的內存空間,從而避免內存滲漏體的產生,節省內存資源,避免程序代碼的崩潰。

  2.垃圾收集器判斷一個對象的內存空間是否無用的標準是:如果該對象不能再被程序中任何一個"活動的部分"所引用,此時我們就說,該對象的內存空間已經無用。所謂"活動的部分",是指程序中某部分參與程序的調用,正在執行過程中,尚未執行完畢。

  3.垃圾收集器線程雖然是作爲低優先級的線程運行,但在系統可用內存量過低的時候,它可能會突發地執行來挽救內存資源。當然其執行與否也是不可預知的。

  4.垃圾收集器不可以被強制執行,但程序員可以通過調用System. gc方法來建議執行垃圾收集器。

  5.不能保證一個無用的對象一定會被垃圾收集器收集,也不能保證垃圾收集器在一段Java語言代碼中一定會執行。因此在程序執行過程中被分配出去的內存空間可能會一直保留到該程序執行完畢,除非該空間被重新分配或被其他方法回收。由此可見,完全徹底地根絕內存滲漏體的產生也是不可能的。但是請不要忘記,Java的垃圾收集器畢竟使程序員從手工回收內存空間的繁重工作中解脫了出來。設想一個程序員要用C或C++來編寫一段10萬行語句的代碼,那麼他一定會充分體會到Java的垃圾收集器的優點!

  6.同樣沒有辦法預知在一組均符合垃圾收集器收集標準的對象中,哪一個會被首先收集。

  7.循環引用對象不會影響其被垃圾收集器收集。

  8.可以通過將對象的引用變量(reference variables,即句柄handles)初始化爲null值,來暗示垃圾收集器來收集該對象。但此時,如果該對象連接有事件監聽器(典型的 AWT組件),那它還是不可以被收集。所以在設一個引用變量爲null值之前,應注意該引用變量指向的對象是否被監聽,若有,要首先除去監聽器,然後纔可以賦空值。

  9.每一個對象都有一個finalize( )方法,這個方法是從Object類繼承來的。

  10.finalize( )方法用來回收內存以外的系統資源,就像是文件處理器和網絡連接器。該方法的調用順序和用來調用該方法的對象的創建順序是無關的。換句話說,書寫程序時該方法的順序和方法的實際調用順序是不相干的。請注意這只是finalize( )方法的特點。

  11.每個對象只能調用finalize( )方法一次。如果在finalize( )方法執行時產生異常(exception),則該對象仍可以被垃圾收集器收集。

  12.垃圾收集器跟蹤每一個對象,收集那些不可到達的對象(即該對象沒有被程序的任何"活的部分"所調用),回收其佔有的內存空間。但在進行垃圾收集的時候,垃圾收集器會調用finalize()方法,通過讓其他對象知道它的存在,而使不可到達的對象再次"復甦"爲可到達的對象。既然每個對象只能調用一次finalize( )方法,所以每個對象也只可能"復甦"一次。

  13.finalize( )方法可以明確地被調用,但它卻不能進行垃圾收集。

  14.finalize( )方法可以被重載(overload),但只有具備初始的finalize( )方法特點的方法纔可以被垃圾收集器調用。

  15.子類的finalize( )方法可以明確地調用父類的finalize( )方法,作爲該子類對象的最後一次適當的操作。但Java編譯器卻不認爲這是一次覆蓋操作(overriding),所以也不會對其調用進行檢查。

  16.當finalize( )方法尚未被調用時,System. runFinalization( )方法可以用來調用finalize()方法,並實現相同的效果,對無用對象進行垃圾收集。

  17.當一個方法執行完畢,其中的局部變量就會超出使用範圍,此時可以被當作垃圾收集,但以後每當該方法再次被調用時,其中的局部變量便會被重新創建。

  18.Java語言使用了一種"標記交換區的垃圾收集算法"。該算法會遍歷程序中每一個對象的句柄,爲被引用的對象做標記,然後回收尚未做標記的對象。所謂遍歷可以簡單地理解爲"檢查每一個"。

  19.Java語言允許程序員爲任何方法添加finalize( )方法,該方法會在垃圾收集器交換回收對象之前被調用。但不要過分依賴該方法對系統資源進行回收和再利用,因爲該方法調用後的執行結果是不可預知的。

  通過以上對垃圾收集器特點的瞭解,你應該可以明確垃圾收集器的作用,和垃圾收集器判斷一塊內存空間是否無用的標準。簡單地說,當你爲一個對象賦值爲null並且重新定向了該對象的引用者,此時該對象就符合垃圾收集器的收集標準。

  判斷一個對象是否符合垃圾收集器的收集標準,這是SUN公司程序員認證考試中垃圾收集器部分的重要考點(可以說,這是唯一的考點)。所以,考生在一段給定的代碼中,應該能夠判斷出哪個對象符合垃圾收集器收集的標準,哪個不符合。下面結合幾種認證考試中可能出現的題型來具體講解:

  Object obj = new Object ( ) ;

  我們知道,obj爲Object的一個句柄。當出現new關鍵字時,就給新建的對象分配內存空間,而obj的值就是新分配的內存空間的首地址,即該對象的值(請特別注意,對象的值和對象的內容是不同含義的兩個概念:對象的值就是指其內存塊的首地址,即對象的句柄;而對象的內容則是其具體的內存塊)。此時如果有 obj = null; 則obj指向的內存塊此時就無用了,因爲下面再沒有調用該變量了。

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