基礎面試題20-2017年11月25日
所有的Servlet都必須要實現的核心的介面是javax.servlet.Servlet。每一個Servlet都必須要直接或者是間接實現這個介面,或者是繼承javax.servlet.GenericServlet或者javax.servlet.http.HTTPServlet。最後,Servlet使用多執行緒可以並行的為多個請求服務。
71、GenericServlet和HttpServlet有什麼區別?
GenericServlet是一個通用的協議無關的Servlet,它實現了Servlet和ServletConfig介面。繼承自GenericServlet的Servlet應該要覆蓋service()方法。最後,為了開發一個能用在網頁上服務於使用HTTP協議請求的Servlet,你的Servlet必須要繼承自HttpServlet。
72.解釋下Servlet的生命週期。
對每一個客戶端的請求,Servlet引擎載入Servlet,呼叫它的init()方法,完成Servlet的初始化。然後,Servlet物件通過為每一個請求單獨呼叫service()方法來處理所有隨後來自客戶端的請求,最後,呼叫Servlet(譯者注:這裡應該是Servlet而不是server)的destroy()方法把Servlet刪除掉。
73.doGet()方法和doPost()方法有什麼區別?
doGet:GET方法會把名值對追加在請求的URL後面。因為URL對字元數目有限制,進而限制了用在客戶端請求的引數值的數目。並且請求中的引數值是可見的,因此,敏感資訊不能用這種方式傳遞。
doPOST:POST方法通過把請求引數值放在請求體中來克服GET方法的限制,因此,可以傳送的引數的數目是沒有限制的。最後,通過POST請求傳遞的敏感資訊對外部客戶端是不可見的。
74.Class.forName()方法有什麼作用?
這個方法用來載入跟資料庫建立連線的驅動。
75.PreparedStatement比Statement有什麼優勢?
PreparedStatements是預編譯的,因此,效能會更好。同時,不同的查詢引數值,PreparedStatement可以重用。
76.什麼時候使用CallableStatement?用來準備CallableStatement的方法是什麼?
CallableStatement用來執行儲存過程。儲存過程是由資料庫儲存和提供的。儲存過程可以接受輸入引數,也可以有返回結果。非常鼓勵使用儲存過程,因為它提供了安全性和模組化。準備一個CallableStatement的方法是:
1
CallableStament.prepareCall();
77.資料庫連線池是什麼意思?
像開啟關閉資料庫連線這種和資料庫的互動可能是很費時的,尤其是當客戶端數量增加的時候,會消耗大量的資源,成本是非常高的。可以在應用伺服器啟動的時候建立很多個數據庫連線並維護在一個池中。連線請求由池中的連線提供。在連線使用完畢以後,把連線歸還到池中,以用於滿足將來更多的請求。
78.如何知道是哪一個客戶端的機器正在請求你的Servlet?
ServletRequest類可以找出客戶端機器的IP地址或者是主機名。getRemoteAddr()方法獲取客戶端主機的IP地址,getRemoteHost()可以獲取主機名
79.HTTP響應的結構是怎麼樣的?
HTTP響應由三個部分組成:
狀態碼(Status Code):描述了響應的狀態。可以用來檢查是否成功的完成了請求。請求失敗的情況下,狀態碼可用來找出失敗的原因。如果Servlet沒有返回狀態碼,預設會返回成功的狀態碼HttpServletResponse.SC_OK。
HTTP頭部(HTTP Header):它們包含了更多關於響應的資訊。比如:頭部可以指定認為響應過期的過期日期,或者是指定用來給使用者安全的傳輸實體內容的編碼格式。如何在Serlet中檢索HTTP的頭部看這裡。
主體(Body):它包含了響應的內容。它可以包含HTML程式碼,圖片,等等。主體是由傳輸在HTTP訊息中緊跟在頭部後面的資料位元組組成的。
80.什麼是cookie?session和cookie有什麼區別?
cookie是Web伺服器傳送給瀏覽器的一塊資訊。瀏覽器會在本地檔案中給每一個Web伺服器儲存cookie。以後瀏覽器在給特定的Web伺服器發請求的時候,同時會發送所有為該伺服器儲存的cookie。下面列出了session和cookie的區別:
無論客戶端瀏覽器做怎麼樣的設定,session都應該能正常工作。客戶端可以選擇禁用cookie,但是,session仍然是能夠工作的,因為客戶端無法禁用服務端的session。
在儲存的資料量方面session和cookies也是不一樣的。session能夠儲存任意的Java物件,cookie只能儲存String型別的物件。
81.瀏覽器和Servlet通訊使用的是什麼協議?
瀏覽器和Servlet通訊使用的是HTTP協議。
82.sendRedirect()和forward()方法有什麼區別?
sendRedirect()方法會建立一個新的請求,而forward()方法只是把請求轉發到一個新的目標上。重定向(redirect)以後,之前請求作用域範圍以內的物件就失效了,因為會產生一個新的請求,而轉發(forwarding)以後,之前請求作用域範圍以內的物件還是能訪問的。一般認為sendRedirect()比forward()要慢。
83.什麼是URL編碼和URL解碼?
URL編碼是負責把URL裡面的空格和其他的特殊字元替換成對應的十六進位制表示,反之就是解碼。
84.JSP請求是如何被處理的?
瀏覽器首先要請求一個以.jsp副檔名結尾的頁面,發起JSP請求,然後,Web伺服器讀取這個請求,使用JSP編譯器把JSP頁面轉化成一個Servlet類。需要注意的是,只有當第一次請求頁面或者是JSP檔案發生改變的時候JSP檔案才會被編譯,然後伺服器呼叫servlet類,處理瀏覽器的請求。一旦請求執行結束,servlet會把響應傳送給客戶端。
85.JSP有什麼優點?
下面列出了使用JSP的優點:
JSP頁面是被動態編譯成Servlet的,因此,開發者可以很容易的更新展現程式碼。
JSP頁面可以被預編譯。
JSP頁面可以很容易的和靜態模板結合,包括:HTML或者XML,也可以很容易的和產生動態內容的程式碼結合起來。
開發者可以提供讓頁面設計者以類XML格式來訪問的自定義的JSP標籤庫。
開發者可以在元件層做邏輯上的改變,而不需要編輯單獨使用了應用層邏輯的頁面。
86.什麼是JSP指令(Directive)?JSP中有哪些不同型別的指令?
Directive是當JSP頁面被編譯成Servlet的時候,JSP引擎要處理的指令。Directive用來設定頁面級別的指令,從外部檔案插入資料,指定自定義的標籤庫。Directive是定義在<%@ 和 %>之間的。下面列出了不同型別的Directive:
包含指令(Include directive):用來包含檔案和合並檔案內容到當前的頁面。
頁面指令(Page directive):用來定義JSP頁面中特定的屬性,比如錯誤頁面和緩衝區。
Taglib指令: 用來宣告頁面中使用的自定義的標籤庫。
87.什麼是JSP動作(JSP action)?
JSP動作以XML語法的結構來控制Servlet引擎的行為。當JSP頁面被請求的時候,JSP動作會被執行。它們可以被動態的插入到檔案中,重用JavaBean元件,轉發使用者到其他的頁面,或者是給Java外掛產生HTML程式碼。下面列出了可用的動作:
jsp:include-當JSP頁面被請求的時候包含一個檔案。
jsp:useBean-找出或者是初始化Javabean。
jsp:setProperty-設定JavaBean的屬性。
jsp:getProperty-獲取JavaBean的屬性。
jsp:forward-把請求轉發到新的頁面。
jsp:plugin-產生特定瀏覽器的程式碼。
88.隱含物件是什麼意思?有哪些隱含物件?
JSP隱含物件是頁面中的一些Java物件,JSP容器讓這些Java物件可以為開發者所使用。開發者不用明確的宣告就可以直接使用他們。JSP隱含物件也叫做預定義變數。下面列出了JSP頁面中的隱含物件:
application
page
request
response
session
exception
out
config
pageContext
89.說出你常用的五個異常類.
90.解釋下Serialization和Deserialization。
Java提供了一種叫做物件序列化的機制,他把物件表示成一連串的位元組,裡面包含了物件的資料,物件的型別資訊,物件內部的資料的型別資訊等等。因此,序列化可以看成是為了把物件儲存在磁碟上或者是從磁碟上讀出來並重建物件而把物件扁平化的一種方式。反序列化是把物件從扁平狀態轉化成活動物件的相反的步驟。
91.什麼是Servlet?
Servlet是用來處理客戶端請求併產生動態網頁內容的Java類。Servlet主要是用來處理或者是儲存HTML表單提交的資料,產生動態內容,在無狀態的HTTP協議下管理狀態資訊。