拿下BAT的offer,這篇彙總的Servlet常見面試題正適合你

這篇文章主要是對servlet的運行過程進行一個分析。涉及了一些基本的用法和常見的面試題。

一、什麼是servlet

我們使用電腦在天貓商城買東西的時候,商品往往都有相應的圖片,當我們點擊不同的商品就會顯示不同的圖片。這個過程其實是請求服務器資源的過程。在很久以前還是使用的servlet技術的時候,服務器的處理機制就是通過servlet來完成的。現在我們給servlet一個標準的定義:

servlet是運行在web服務器中的小型java程序,通常通過HTTP協議接受和相應來自web客戶端的請求。

它的特點如下:

(1)Servlet對像,由Servlet容器創建。通常這個容器就是tomcat。

(2)Servlet是一個接口:位於javax.servlet包中。

我們直接通過案例來分析會更加的清晰。

二、servlet案例

畢竟不是專門介紹servlet的使用的,我們直接通過案例來分析。在這裏我使用的的IDE是Myeclipse,首先新建了一個ServletTest項目,根路徑就是項目名字,然後在com.fdd.servlet包下,建了一個MyServlet1類,內容如下:

public class MyServlet1 implements Servlet{
	public ServletConfig getServletConfig() {
		System.out.println("getServletConfig");
		return null;
	}
	public String getServletInfo() {
		System.out.println("getServletInfo");
		return null;
	}
	public void init(ServletConfig arg0) throws ServletException {
		System.out.println("init");
	}
	public void service(ServletRequest arg0, ServletResponse arg1)
			throws ServletException, IOException {
		System.out.println("service");
	}
	public void destroy() {
		System.out.println("destroy");
	}
}

現在我們已經創建了一個Servlet,但是如何去使用呢?我們還需要去註冊一下這個Servlet。註冊好了,客戶端才能訪問。註冊的時候就是在web.xml裏面註冊,內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <!-- 創建一個servlet實例 -->
  <servlet>
  		<servlet-name>servletDemo</servlet-name>
  		<servlet-class>com.fdd.servlet.MyServlet1</servlet-class>
  </servlet>
  <!-- 給剛剛的servlet實例, 提供一個外界可以訪問的地址-->
  <servlet-mapping>
  		<servlet-name>servletDemo</servlet-name>
  		<url-pattern>/demo1</url-pattern>
  </servlet-mapping>
</web-app>

註冊的時候分爲了兩步:

(1)把MyServlet1作爲一個實例注入進來

(2)給這個實例提供一個外界可以訪問的地址,目前的地址是/demo1。

此時我們訪問http://localhost:8080/ServletTest/demo1就相當於訪問了我們的Servlet。這個案例很簡單。下面我們分析一下這個整體的訪問過程是什麼樣的。

三、請求過程

上面通過案例演示了整體的效果,但是整個流程是怎麼樣的呢?我們給出一張圖就明白了

在這裏插入圖片描述

上面這張圖基本上把整個流程算是交代清楚了。現在我們梳理一遍。

(0)Tomcat容器中通過web.xml加載所有的Servlet。

(1)用戶在瀏覽器輸入不同的地址,向Tomcat容器請求資源。

(2)Tomcat容器根據地址首先在容器內找到應用ServletTest。

(3)Tomcat容器再根據地址去web.xml找到相應的servlet地址(/demo1)。

(4)Tomcat容器根據找到的servlet地址(/demo1)去web.xml找到相應的Servlet類,並實例化。

(5)Tomcat容器實例化相應的Servlet,首先調用init方法。

(6)Tomcat容器實例化相應的Servlet,首先調用service方法處理用戶請求,比如post或者是get。

(7)Servlet處理完成之後,現將數據給Tomcat容器,Tomcat容器再把處理結果給瀏覽器客戶端。

(8)Tomcat容器調用servlet實例的destory方法銷燬這個實例。

步驟比較容易理解。可以對比着上面的過程圖來記憶。下面我們看看其生命週期。

四、生命週期(重點)

如果你理解了上面的執行過程,對於其生命週期想必也有了一個大概的瞭解,比如說init方法、service方法、destory方法。其實也就是這三個方法:

(1)init:第一次請求資源的時候,執行且只執行一次init方法。

(2)service:第二次往後,執行service方法,執行多次。在這個方法內部,根據請求方式的不同,進而繼續調用不同的doGet和doPost方法。

(3)destory:當Servlet服務器正常關閉時,執行destroy方法,只執行一次。

五、常見面試題

在一開始舉的例子中我們直接繼承的是Servlet接口,這個類比較原始。需要我們自己處理各種事件。其實java已經我們提供了很多封裝好的Servlet類,比如GenericServlet。

1、GenericServlet和HttpServlet有什麼區別?

GenericServlet 爲抽象類,定義了一個通用的、獨立於底層協議的servlet,實現了 Servlet 和 ServletConfig 接口,ServletConfig接口定義了在Servlet初始化的過程中由Servlet容器傳遞給Servlet得配置信息對象。OK,這個類可能我們不是那麼熟悉,但是他的子類相信大家都知道,也就是HttpServlet ,HttpServlet 繼承自抽象類GenericServlet 具有其所有的特性並拓展了一些其他的方法,如doGet、doPost等。現在看到這倆方法都熟悉了吧。

2、什麼情況下調用doGet()和doPost()呢?

也就是在前端代碼中,如果我們的請求方式是get那就是doGet處理。同理post是doPost方法處理。

(1)doGet:GET方法會把名值對追加在請求的URL後面。因爲URL對字符數目有限制,進而限制了用在客戶端請求的參數值的數目。並且請求中的參數值是可見的,因此,敏感信息不能用這種方式傳遞。

(2)doPOST:POST方法通過把請求參數值放在請求體中來克服GET方法的限制,因此,可以發送的參數的數目是沒有限制的。最後,通過POST請求傳遞的敏感信息對外部客戶端是不可見的。

3、在這裏沒有提前端是jsp,是因爲目前的前後端分離技術基本上jsp已經被淘汰了,JSP和Servlet有哪些相同點和不同點,他們之間的聯繫是什麼?

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

客戶端打開與服務器的連接發出請求到服務器響應客戶端請求的全過程稱之爲會話 。瀏覽器與服務器之間的通信是通過HTTP協議進行通信的,而HTTP協議是”無狀態”的協議,它不能保存客戶的信息,即一次響應完成之後連接就斷開了,下一次的請求需要重新連接,這樣就需要判斷是否是同一個用戶,所以才應會話跟蹤技術來實現這種要求。

(1)Cookie

(2)Session

(3)URL複寫:把會話ID編碼在URL中。

(4)隱藏表單域

5、會話作用域

(1)page域:數據在一個頁面範圍內有效,通過pageContext對象訪問

(2)request域:數據在一個服務器請求範圍內有效,通過request對象訪問

(3)session域:數據在一次會話範圍內容有效,通過session對象訪問

(4)application域:數據在一個應用服務器範圍內有效,通過application對象訪問

6、Cookie和Session的作用和區別

(1)cookie 是一種發送到客戶瀏覽器的文本串句柄,數據保存在客戶端,可以用來在某個WEB站點會話間持久的保持數據。

(2)session技術中所有的數據都保存在服務器上,客戶端每次請求服務器的時候會發送當前會話的sessionid,服務器根據當前sessionid判斷相應的用戶數據標誌,以確定用戶是否登錄或具有某種權限。

(3)cookie和session的共同之處在於:cookie和session都是用來跟蹤瀏覽器用戶身份的會話方式。

(4)cookie 和session的區別是:cookie數據保存在客戶端,session數據保存在服務器端。

7、如何知道是哪一個客戶端的機器正在請求你的Servlet

ServletRequest類可以找出客戶端機器的IP地址或者是主機名。getRemoteAddr()方法獲取客戶端主機的IP地址,getRemoteHost()可以獲取主機名。

8、HTTP響應的結構是怎麼樣的?

HTTP響應由三個部分組成:

(1)狀態碼(Status Code):描述了響應的狀態。可以用來檢查是否成功的完成了請求。請求失敗的情況下,狀態碼可用來找出失敗的原因。如果Servlet沒有返回狀態碼,默認會返回成功的狀態碼HttpServletResponse.SC_OK。

(2)HTTP頭部(HTTP Header):它們包含了更多關於響應的信息。比如:頭部可以指定認爲響應過期的過期日期,或者是指定用來給用戶安全的傳輸實體內容的編碼格式。如何在Serlet中檢索HTTP的頭部看這裏。

(3)主體(Body):它包含了響應的內容。它可以包含HTML代碼,圖片,等等。主體是由傳輸在HTTP消息中緊跟在頭部後面的數據字節組成的。

9、sendRedirect()和forward()方法有什麼區別?

sendRedirect()方法會創建一個新的請求,而forward()方法只是把請求轉發到一個新的目標上。重定向(redirect)以後,之前請求作用域範圍以內的對象就失效了,因爲會產生一個新的請求,而轉發(forwarding)以後,之前請求作用域範圍以內的對象還是能訪問的。一般認爲sendRedirect()比forward()要慢。

10、隱含對象是什麼意思?有哪些隱含對象?

JSP隱含對象是頁面中的一些Java對象,JSP容器讓這些Java對象可以爲開發者所使用。開發者不用明確的聲明就可以直接使用他們。JSP隱含對象也叫做預定義變量。下面列出了JSP頁面中的隱含對象:application、page、request、response、session、exception、out、config、pageContext。

此外,我在網上找了幾套Servlet常見的面試題,基本上就是這些。

喜歡的可以關注我的公衆號:java的架構師技術棧,獲取更多文章和教程資源

發佈了255 篇原創文章 · 獲贊 74 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章