Java -- Servlet面试题及答案(需更深入了解)
Servlet方面
1、說一說Servlet的生命周期?
Servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。 Servlet被服務器實例化后,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當服務器決定將實例銷毀的時候調用其destroy方法。
與cgi的區別在于Servlet處于服務器進程中,它通過多線程方式運行其service方法,一個實例可以服務于多個請求,并且其實例一般不會銷毀,而CGI對每個請求都產生新的進程,服務完成后就銷毀,所以效率上低于Servlet。
2、JAVA SERVLET API中forward() 與redirect()的區別?
forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然后把這些內容再發給瀏覽器,其實客戶端瀏覽器只發了一次請求,所以它的地址欄中還是原來的地址,session,request參數都可以獲取。
redirect就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址,相當于客戶端瀏覽器發送了兩次請求。
3、Servlet的基本架構
public class ServletName extends HttpServlet {
??public void doPost(HttpServletRequest request, HttpServletResponse response) throws
??????ServletException, IOException ?{
??????}
??public void doGet(HttpServletRequest request, HttpServletResponse response) throws
??????ServletException, IOException ?{
??????}
}
4、什么情況下調用doGet()和doPost()?
JSP頁面中的form標簽里的method屬性為get時調用doGet(),為post時調用doPost();超鏈接跳轉頁面時調用doGet()
5、servlet的生命周期
web容器加載servlet,生命周期開始。通過調用servlet的init()方法進行servlet的初始化。通過調用service()方法實現,根據請求的不同調用不同的do***()方法。結束服務,web容器調用servlet的destroy()方法。
6、頁面間對象傳遞的方法
request,session,application,cookie等
7、JSP和Servlet有哪些相同點和不同點,他們之間的聯系是什么?
JSP是Servlet技術的擴展,本質上是Servlet的簡易方式,更強調應用的外表表達。JSP編譯后是"類servlet"。Servlet和JSP最主要的不同點在于,Servlet的應用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來。而JSP的情況是Java和HTML可以組合成一個擴展名為.jsp的文件。JSP側重于視圖,Servlet主要用于控制邏輯。
8、四種會話跟蹤技術
會話作用域ServletsJSP 頁面描述
1)page否是代表與一個頁面相關的對象和屬性。一個頁面由一個編譯好的 Java servlet 類(可以帶有任何的 include 指令,但是沒有 include 動作)表示。這既包括 servlet 又包括被編譯成 servlet 的 JSP 頁面
2)request是是代表與 Web 客戶機發出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個 Web 組件(由于 forward 指令和 include 動作的關系)
3)session是是代表與用于某個 Web 客戶機的一個用戶體驗相關的對象和屬性。一個 Web 會話可以也經常會跨越多個客戶機請求
4)application是是代表與整個 Web 應用程序相關的對象和屬性。這實質上是跨越整個 Web 應用程序,包括多個頁面、請求和會話的一個全局作用域
9、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]):返回和請求相關Session
getServerName():獲取服務器的名字
getServletPath():獲取客戶端所請求的腳本文件的路徑
getServerPort():獲取服務器的端口號
removeAttribute(String name):刪除請求中的一個屬性
10、我們在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;
??}
11、Servlet執行時一般實現哪幾個方法?
public void init(ServletConfig config)
public ServletConfig getServletConfig()
public String getServletInfo()
public void service(ServletRequest request,ServletResponse response)
public void destroy()
12、描述Cookie和Session的作用,區別和各自的應用范圍,Session工作原理。
1)cookie 是一種發送到客戶瀏覽器的文本串句柄,并保存在客戶機硬盤上,可以用來在某個WEB站點會話間持久的保持數據。
2)session其實指的就是訪問者從到達某個特定主頁到離開為止的那段時間。 Session其實是利用Cookie進行信息處理的,當用戶首先進行了請求后,服務端就在用戶瀏覽器上創建了一個Cookie,當這個Session結束時,其實就是意味著這個Cookie就過期了。
注:為這個用戶創建的Cookie的名稱是aspsessionid。這個Cookie的唯一目的就是為每一個用戶提供不同的身份認證。
3)cookie和session的共同之處在于:cookie和session都是用來跟蹤瀏覽器用戶身份的會話方式。
4)cookie 和session的區別是:cookie數據保存在客戶端,session數據保存在服務器端。
5)session工作原理:session技術中所有的數據都保存在服務器上,客戶端每次請求服務器的時候會發送當前會話的sessionid,服務器根據當前sessionid判斷相應的用戶數據標志,以確定用戶是否登錄或具有某種權限。
13、什么是Servlet?
Servlet是用來處理客戶端請求并產生動態網頁內容的Java類。Servlet主要是用來處理或者是存儲HTML表單提交的數據,產生動態內容,在無狀態的HTTP協議下管理狀態信息。
14、說一下Servlet的體系結構。
所有的Servlet都必須要實現的核心的接口是javax.servlet.Servlet。每一個Servlet都必須要直接或者是間接實現這個接口,或者是繼承javax.servlet.GenericServlet或者javax.servlet.http.HTTPServlet。最后,Servlet使用多線程可以并行的為多個請求服務。
15、Applet和Servlet有什么區別?
Applet是運行在客戶端主機的瀏覽器上的客戶端Java程序。而Servlet是運行在web服務器上的服務端的組件。applet可以使用用戶界面類,而Servlet沒有用戶界面,相反,Servlet是等待客戶端的HTTP請求,然后為請求產生響應。
16、GenericServlet和HttpServlet有什么區別?
GenericServlet是一個通用的協議無關的Servlet,它實現了Servlet和ServletConfig接口。繼承自GenericServlet的Servlet應該要覆蓋service()方法。最后,為了開發一個能用在網頁上服務于使用HTTP協議請求的Servlet,你的Servlet必須要繼承自HttpServlet。這里有Servlet的例子。
17、解釋下Servlet的生命周期。
對每一個客戶端的請求,Servlet引擎載入Servlet,調用它的init()方法,完成Servlet的初始化。然后,Servlet對象通過為每一個請求單獨調用service()方法來處理所有隨后來自客戶端的請求,最后,調用Servlet(譯者注:這里應該是Servlet而不是server)的destroy()方法把Servlet刪除掉。
18、doGet()方法和doPost()方法有什么區別?
doGet:GET方法會把名值對追加在請求的URL后面。因為URL對字符數目有限制,進而限制了用在客戶端請求的參數值的數目。并且請求中的參數值是可見的,因此,敏感信息不能用這種方式傳遞。
doPOST:POST方法通過把請求參數值放在請求體中來克服GET方法的限制,因此,可以發送的參數的數目是沒有限制的。最后,通過POST請求傳遞的敏感信息對外部客戶端是不可見的。
19、什么是Web應用程序?
Web應用程序是對Web或者是應用服務器的動態擴展。有兩種類型的Web應用:面向表現的和面向服務的。面向表現的Web應用程序會產生包含了很多種標記語言和動態內容的交互的web頁面作為對請求的響應。而面向服務的Web應用實現了Web服務的端點(endpoint)。一般來說,一個Web應用可以看成是一組安裝在服務器URL名稱空間的特定子集下面的Servlet的集合。
20、什么是服務端包含(Server Side Include)?
服務端包含(SSI)是一種簡單的解釋型服務端腳本語言,大多數時候僅用在Web上,用servlet標簽嵌入進來。SSI最常用的場景把一個或多個文件包含到Web服務器的一個Web頁面中。當瀏覽器訪問Web頁面的時候,Web服務器會用對應的servlet產生的文本來替換Web頁面中的servlet標簽。
21、什么是Servlet鏈(Servlet Chaining)?
Servlet鏈是把一個Servlet的輸出發送給另一個Servlet的方法。第二個Servlet的輸出可以發送給第三個Servlet,依次類推。鏈條上最后一個Servlet負責把響應發送給客戶端。
22、如何知道是哪一個客戶端的機器正在請求你的Servlet?
ServletRequest類可以找出客戶端機器的IP地址或者是主機名。getRemoteAddr()方法獲取客戶端主機的IP地址,getRemoteHost()可以獲取主機名。看下這里的例子。
23、HTTP響應的結構是怎么樣的?
HTTP響應由三個部分組成:
狀態碼(Status Code):描述了響應的狀態??梢杂脕頇z查是否成功的完成了請求。請求失敗的情況下,狀態碼可用來找出失敗的原因。如果Servlet沒有返回狀態碼,默認會返回成功的狀態碼HttpServletResponse.SC_OK。
HTTP頭部(HTTP Header):它們包含了更多關于響應的信息。比如:頭部可以指定認為響應過期的過期日期,或者是指定用來給用戶安全的傳輸實體內容的編碼格式。如何在Serlet中檢索HTTP的頭部看這里。
主體(Body):它包含了響應的內容。它可以包含HTML代碼,圖片,等等。主體是由傳輸在HTTP消息中緊跟在頭部后面的數據字節組成的。
24、什么是cookie?session和cookie有什么區別?
cookie是Web服務器發送給瀏覽器的一塊信息。瀏覽器會在本地文件中給每一個Web服務器存儲cookie。以后瀏覽器在給特定的Web服務器發請求的時候,同時會發送所有為該服務器存儲的cookie。下面列出了session和cookie的區別:
? 無論客戶端瀏覽器做怎么樣的設置,session都應該能正常工作。客戶端可以選擇禁用cookie,但是,session仍然是能夠工作的,因為客戶端無法禁用服務端的session。
? 在存儲的數據量方面session和cookies也是不一樣的。session能夠存儲任意的Java對象,cookie只能存儲String類型的對象。
25、瀏覽器和Servlet通信使用的是什么協議?
瀏覽器和Servlet通信使用的是HTTP協議。
26、什么是HTTP隧道?
HTTP隧道是一種利用HTTP或者是HTTPS把多種網絡協議封裝起來進行通信的技術。因此,HTTP協議扮演了一個打通用于通信的網絡協議的管道的包裝器的角色。把其他協議的請求掩蓋成HTTP的請求就是HTTP隧道。
27、sendRedirect()和forward()方法有什么區別?
sendRedirect()方法會創建一個新的請求,而forward()方法只是把請求轉發到一個新的目標上。重定向(redirect)以后,之前請求作用域范圍以內的對象就失效了,因為會產生一個新的請求,而轉發(forwarding)以后,之前請求作用域范圍以內的對象還是能訪問的。一般認為sendRedirect()比forward()要慢。
28、什么是URL編碼和URL解碼?
URL編碼是負責把URL里面的空格和其他的特殊字符替換成對應的十六進制表示,反之就是解碼。
JSP
29、什么是Scriptlets?
JSP技術中,scriptlet是嵌入在JSP頁面中的一段Java代碼。scriptlet是位于標簽內部的所有的東西,在標簽與標簽之間,用戶可以添加任意有效的scriplet。
30、聲明(Decalaration)在哪里?
聲明跟Java中的變量聲明很相似,它用來聲明隨后要被表達式或者scriptlet使用的變量。添加的聲明必須要用開始和結束標簽包起來。
31、什么是表達式(Expression)?
【列表很長,可以分上、中、下發布】
JSP表達式是Web服務器把腳本語言表達式的值轉化成一個String對象,插入到返回給客戶端的數據流中。表達式是在<%=和%>這兩個標簽之間定義的。
32、隱含對象是什么意思?有哪些隱含對象?
JSP隱含對象是頁面中的一些Java對象,JSP容器讓這些Java對象可以為開發者所使用。開發者不用明確的聲明就可以直接使用他們。JSP隱含對象也叫做預定義變量。下面列出了JSP頁面中的隱含對象:
? application
? page
? request
? response
? session
? exception
? out
? config
? pageContext
?
總結
以上是生活随笔為你收集整理的Java -- Servlet面试题及答案(需更深入了解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目实战|100个蓝牙接收器发货了
- 下一篇: 基于Servlet面试题进行JavaWe