java面試-1(線程、jsp、servlet、xml)

線程編程方面

  1. java中有幾種方法可以實現一個線程?用什麼關鍵字修飾同步方法? stop()和suspend()方法爲何不推薦使用?

有兩種實現方法,分別是繼承Thread類、實現Runnable接口用synchronized關鍵字修飾同步方法。

反對使用stop(),是因爲它不安全。它會解除由線程獲取的所有鎖定,而且如果對象處於一種不連貫狀態,那麼其他線程能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。

suspend()方法容易發生死鎖。調用suspend()的時候,目標線程會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何線程都不能訪問鎖定的資源,除非被"掛起"的線程恢復運行。對任何線程來說,如果它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應該使用suspend(),而應在自己的Thread類中置入一個標誌,指出線程應該活動還是掛起。若標誌指出線程應該掛起,便用wait()命其進入等待狀態。若標誌指出線程應當恢復,則用一個notify()重新啓動線程

  1.  sleep() 和 wait() 有什麼區別?

sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,把執行機會給其他線程,但是監控狀態依然保持,到時後會自動恢復。調用sleep不會釋放對象鎖。

wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。

  1. 同步和異步有何異同,在什麼情況下分別使用他們?舉例說明。

例如正在寫的數據以後可能被另一個線程讀到,或者正在讀的數據可能已經被另一個線程寫過了,那麼這些數據就是共享數據,必須進行同步存取。當應用程序在對象上調用了一個需要花費很長時間來執行的方法,並且不希望讓程序等待方法的返回時,就應該使用異步編程,在很多情況下采用異步途徑往往更有效率。

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

 啓動一個線程是調用start()方法,使線程所代表的虛擬處理機處於可運行狀態,這意味着它可以由JVM調度並執行,但並不意味着線程就會立即運行。 run()方法可以產生必須退出的標誌來停止一個線程,並立即執行指定線程。

  1. 當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法?

不能,一個對象的一個synchronized方法只能由一個線程訪問。

  1. 請說出你所知道的線程同步的方法。

wait():使一個線程處於等待狀態,並且釋放所持有的對象的lock。
sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException異常。
notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且不是按優先級。
Allnotity():喚醒所有處入等待狀態的線程,注意並不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。

  1. 多線程有幾種實現方法,都是什麼?同步有幾種實現方法,都是什麼?

多線程有兩種實現方法,分別是繼承Thread類、實現Runnable接口
同步的實現方面有兩種,分別是synchronized,wait與notify

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

線程指在程序執行過程中,能夠執行程序代碼的一個執行單位,每個程序至少都有一個線程,也就是程序本身。Java中的線程有四種狀態分別是:運行、就緒、掛起、結束

  1. 簡述synchronized和java.util.concurrent.locks.Lock的異同?

主要相同點: Lock能完成synchronized所實現的所有功能 主要不同點: Lock有比synchronized更精確的線程語義和更好的性能。 synchronized會自動釋放鎖,而Lock一定要求程序員手工釋放,並且必須在finally從句中釋放。


Jsp方面

10. forward 和redirect的區別

forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,所以它的地址欄中還是原來的地址
redirect就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛纔請求的所有參數重新請求,所以session,request參數都可以獲取。

  1.  jsp有哪些內置對象?作用分別是什麼

JSP共有以下9種基本內置組件

request 用戶端請求,此請求會包含來自GET/POST請求的參數
response 網頁傳回用戶端的迴應
pageContext 網頁的屬性是在這裏管理
session 與請求有關的會話期
application servlet 正在執行的內容
out 用來傳送回應的輸出
config servlet的構架部件
page JSP網頁本身
exception 針對錯誤網頁異常

  1. jsp有哪些動作?作用分別是什麼

JSP共有以下6種基本動作

jsp:include:在頁面被請求的時候引入一個文件。
jsp:useBean:尋找或者實例化一個JavaBean。
jsp:setProperty:設置JavaBean的屬性。
jsp:getProperty:輸出某個JavaBean的屬性。
jsp:forward:把請求轉到一個新的頁面。
jsp:plugin:根據瀏覽器類型爲Java插件生成OBJECT或EMBED標記

  1.  JSP中動態INCLUDE與靜態INCLUDE的區別?

動態INCLUDE用jsp:include動作實現<jsp:include page="included.jsp" flush="true"/>它總是會檢查所含文件中的變化,適合用於包含動態頁面,並且可以帶參數靜態INCLUDE用include僞碼實現,定不會檢查所含文件的變化,適用於包含靜態頁面<%@ include file="included.htm" %>

  1. 兩種跳轉方式分別是什麼?有什麼區別?

有兩種,分別爲:<jsp:include page="included.jsp" flush="true">``<jsp:forward page= "nextpage.jsp"/>。前者頁面不會轉向include所指的頁面,只是顯示該頁的結果,主頁面還是原來的頁面。執行完後還會回來,相當於函數調用,可以帶參數。後者完全轉向新頁面,不會再回來。相當於go to 語句。 15. [pass] JSP的內置對象及方法 request表示HttpServletRequest對象。它包含了有關瀏覽器請求的信息,並且提供了幾個用於獲取cookie, header,和session數據的有用的方法。response表示HttpServletResponse對象,並提供了幾個用於設置送回瀏覽器的響應的方法(如cookies,頭信息等)out對象是javax.jsp.JspWriter的一個實例,並提供了幾個方法使你能用於向瀏覽器回送輸出結果。pageContext表示一個javax.servlet.jsp.PageContext對象。它是用於方便存取各種範圍的名字空間、 servlet相關的對象的API,並且包裝了通用的servlet相關功能的方法。session表示一個請求的javax.servlet.http.HttpSession對象。 Session可以存貯用戶的狀態信息applicaton 表示一個javax.servle.ServletContext對象。這有助於查找有關servlet引擎和servlet環境的信息config表示一個javax.servlet.ServletConfig對象。該對象用於存取servlet實例的初始化參數。page表示從該頁面產生的一個servlet實例


Servlet方面

  1. 說一說Servlet的生命週期

servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。Servlet被服務器實例化後,容器運行其init方法,請求到達時運行其service方法, service方法自動派遣運行與請求對應的doXXX方法(doGet, doPost)等,當服務器決定將實例銷燬的時候調用其destroy方法。
與cgi的區別在於servlet處於服務器進程中,它通過多線程方式運行其service方法,一個實例可以服務於多個請求,並且其實例一般不會銷燬,而CGI對每個請求都產生新的進程,服務完成後就銷燬,所以效率上低於servlet。

  1. JAVA SERVLET API中forward() 與redirect()的區別?

前者僅是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向後的地址
後者則是完全的跳轉,瀏覽器將會得到跳轉的地址,並重新發送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉後的鏈接地址
前者更加高效,在前者可以滿足需要時,儘量使用forward()方法,並且,這樣也有助於隱藏實際的鏈接。在有些情況下,比如,需要跳轉到一個其它服務器上的資源,則必須使用sendRedirect()方法。

  1.  Servlet的基本架構

public class ServletName extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {}public void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {}}

  1. 什麼情況下調用doGet()和doPost()?

Jsp頁面中的form標籤裏的method屬性爲get時調用doGet(),爲post時調用doPost()。

  1. servlet的生命週期

web容器加載servlet,生命週期開始。通過調用servlet的init()方法進行servlet的初始化。通過調用service()方法實現,根據請求的不同調用不同的do****()方法。結束服務, web容器調用servlet的destroy()方法。

  1. 如何現實servlet的單線程模式答: <%@ page isThreadSafe="false"%>
  2. 頁面間對象傳遞的方法答: request, session, application, cookie等 23. JSP和Servlet有哪些相同點和不同點,他們之間的聯繫是什麼?

JSP是Servlet技術的擴展,本質上是Servlet的簡易方式,更強調應用的外表表達。 JSP編譯後是"類servlet"。 Servlet和JSP最主要的不同點在於, Servlet的應用邏輯是在Java文件中,並且完全從表示層中的HTML裏分離開來。而JSP的情況是Java和HTML可以組合成一個擴展名爲.jsp的文件。 JSP側重於視圖, Servlet主要用於控制邏輯。

  1. 四種會話跟蹤技術

會話作用域ServletsJSP 頁面描述page代表與一個頁面相關的對象和屬性。一個頁面由一個編譯好的 Java servlet 類(可以帶有任何的 include 指令,但是沒有 include 動作)表示。這既包括 servlet 又包括被編譯成 servlet 的 JSP 頁面
request是代表與 Web 客戶機發出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個 Web 組件(由於 forward 指令和 include 動作的關係)
session是代表與用於某個 Web 客戶機的一個用戶體驗相關的對象和屬性。一個 Web 會話可以也經常會跨越多個客戶機請求
application是代表與整個 Web 應用程序相關的對象和屬性。這實質上是跨越整個 Web 應用程序,包括多個頁面、請求和會話的一個全局作用域

  1. Request對象的主要方法答:setAttribute(String name,Object):設置名字爲name的request的參數值getAttribute(String name):返回由name指定的屬性值getAttributeNames():返回request對象所有屬性的名字集合,結果是一個枚舉的實例getCookies():返回客戶端的所有Cookie對象,結果是一個Cookie數組getCharacterEncoding():返回請求中的字符編碼方式getContentLength():返回請求的Body的長度getHeader(String name):獲得HTTP協議定義的文件頭信息getHeaders(String name):返回指定名字的request Header的所有值,結果是一個枚舉的實例getHeaderNames():返回所以request Header的名字,結果是一個枚舉的實例getInputStream():返回請求的輸入流,用於獲得請求中的數據getMethod():獲得客戶端向服務器端傳送數據的方法getParameter(String name):獲得客戶端傳送給服務器端的有name指定的參數值getParameterNames():獲得客戶端傳送給服務器端的所有參數的名字,結果是一個枚舉的實例getParameterValues(String name):獲得有name指定的參數的所有值getProtocol():獲取客戶端向服務器端傳送數據所依據的協議名稱getQueryString():獲得查詢字符串getRequestURI():獲取發出請求字符串的客戶端地址getRemoteAddr():獲取客戶端的IP地址getRemoteHost():獲取客戶端的名字getSession([Boolean create]):返回和請求相關SessiongetServerName():獲取服務器的名字getServletPath():獲取客戶端所請求的腳本文件的路徑getServerPort():獲取服務器的端口號removeAttribute(String name):刪除請求中的一個屬性
  2. 我們在web應用開發過程中經常遇到輸出某種編碼的字符,如iso8859-1等,如何輸出一個某種編碼的字符串?答:Public String translate (String str) {String tempStr = "";try {tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");tempStr = tempStr.trim();}catch (Exception e) {System.err.println(e.getMessage());}return tempStr;}
  3. Servlet執行時一般實現哪幾個方法?答:public void init(ServletConfig config)public ServletConfig getServletConfig()public String getServletInfo()public void service(ServletRequest request,ServletResponse response)public void destroy()Jdbc、 Jdo方面 28. Class.forName的作用?爲什麼要用?答: 調用該訪問返回一個以字符串指定類名的類的對象。 29. Jdo是什麼?答: JDO是Java對象持久化的新的規範,爲java data object的簡稱,也是一個用於存取某種數據倉庫中的對象的標準化API。 JDO提供了透明的對象存儲,因此對開發人員來說,存儲數據對象完全不需要額外的代碼(如JDBC API的使用)。這些繁瑣的例行工作已經轉移到JDO產品提供商身上,使開發人員解脫出來,從而集中時間和精力在業務邏輯上。另外, JDO很靈活,因爲它可以在任何數據底層上運行。 JDBC只是面向關係數據庫(RDBMS)JDO更通用,提供到任何數據底層的存儲功能,比如關係數據庫、文件、 XML以及對象數據庫(ODBMS)等等,使得應用可移植性更強。
  4. 說出數據連接池的工作機制是什麼?

J2EE服務器啓動時會建立一定數量的池連接,並一直維持不少於此數目的池連接。客戶端程序需要連接時,池驅動程序會返回一個未使用的池連接並將其表記爲忙。如果當前沒有空閒連接,池驅動程序就新建一定數量的連接,新建連接的數量由配置參數決定。當使用的池連接調用完成後,池驅動程序將此連接表記爲空閒,其他調用就可以使用這個連接。 31. Jdo是什麼?答: JDO是Java對象持久化的新的規範,爲java data object的簡稱,也是一個用於存取某種數據倉庫中的對象的標準化API。 JDO提供了透明的對象存儲,因此對開發人員來說,存儲數據對象完全不需要額外的代碼(如JDBC API的使用)。這些繁瑣的例行工作已經轉移到JDO產品提供商身上,使開發人員解脫出來,從而集中時間和精力在業務邏輯上。另外, JDO很靈活,因爲它可以在任何數據底層上運行。 JDBC只是面向關係數據庫(RDBMS) JDO更通用,提供到任何數據底層的存儲功能,比如關係數據庫、文件、 XML以及對象數據庫(ODBMS)等等,使得應用可移植性更強。Xml方面 32. xml有哪些解析技術?區別是什麼? 有DOM,SAX,STAX等DOM:處理大型文件時其性能下降的非常厲害。這個問題是由DOM的樹結構所造成的,這種結構佔用的內存較多,而且DOM必須在解析文件之前把整個文檔裝入內存,適合對XML的隨機訪問
SAX:是事件驅動型的XML解析方式。它順序讀取XML文件,不需要一次全部裝載整個文件。當遇到像文件開頭,文檔結束,或者標籤開頭與標籤結束時,它會觸發一個事件,用戶通過在其回調事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問
STAX:Streaming API for XML (StAX)

  1. 你在項目中用到了xml技術的哪些方面?如何實現的?

用到了數據存貯,信息配置兩方面。在做數據交換平臺時,將不同數據源的數據組裝成XML文件,然後將XML文件壓縮打包加密後通過網絡傳送給接收者,接收解密與解壓縮後再同XML文件中還原相關信息進行處理。在做軟件配置時,利用XML可以很方便的進行,軟件的各種配置參數都存貯在XML文件中。 34. XML文檔定義有幾種形式?它們之間有何本質區別?解析XML文檔有哪幾種方式? a: 兩種形式 dtd schema
b: 本質區別:schema本身是xml的,可以被XML解析器解析(這也是從DTD上發展schema的根本目的)
c: 有DOM,SAX,STAX等

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