Tomcat+Servlet面試題都在這裡

Java3y發表於2018-02-03

下面是我整理下來的Servlet知識點:

Tomcat+Servlet面試題都在這裡

圖上的知識點都可以在我其他的文章內找到相應內容。

Tomcat常見面試題

Tomcat的預設埠是多少,怎麼修改

Tomcat的預設埠是多少,怎麼修改

  1. 找到Tomcat目錄下的conf資料夾
  2. 進入conf資料夾裡面找到server.xml檔案
  3. 開啟server.xml檔案
  4. 在server.xml檔案裡面找到下列資訊
  <Service name="Catalina">
  

    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />
複製程式碼
  1. 把port=”8080″改成port=”8888″,並且儲存
  2. 啟動Tomcat,並且在IE瀏覽器裡面的位址列輸入http://127.0.0.1:8888/

到tomcat主目錄下的conf/server.xml檔案中修改,把8080埠改成是8088或者是其他的

Tomcat+Servlet面試題都在這裡

Tomcat 有哪幾種Connector 執行模式(優化)?

tomcat 有哪幾種Connector 執行模式(優化)?

  1. bio(blocking I/O)
  2. nio(non-blocking I/O)
  3. apr(Apache Portable Runtime/Apache可移植執行庫)

相關解釋:

  • bio: 傳統的Java I/O操作,同步且阻塞IO。
  • nio: JDK1.4開始支援,同步阻塞或同步非阻塞IO
  • aio(nio.2): JDK7開始支援,非同步非阻塞IO
  • apr: Tomcat將以JNI的形式呼叫Apache HTTP伺服器的核心動態連結庫來處理檔案讀取或網路傳輸操作,從而大大地 提高Tomcat對靜態檔案的處理效能

下面是配置Tomcat執行模式改成是NIO模式,並配置連線池相關引數來進行優化:

    <!--
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
    <!-- protocol 啟用 nio模式,(tomcat8預設使用的是nio)(apr模式利用系統級非同步io) -->
    <!-- minProcessors最小空閒連線執行緒數-->
    <!-- maxProcessors最大連線執行緒數-->
    <!-- acceptCount允許的最大連線數,應大於等於maxProcessors-->
    <!-- enableLookups 如果為true,requst.getRemoteHost會執行DNS查詢,反向解析ip對應域名或主機名-->
    <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" 
        connectionTimeout="20000"
        redirectPort="8443

        maxThreads=“500” 
        minSpareThreads=“100” 
        maxSpareThreads=“200”
        acceptCount="200"
        enableLookups="false"       
    />

複製程式碼

apr模式啟動起來是比較複雜的,詳情可參考:blog.csdn.net/wanglei_sto…

對於bio,nio,nio.2的理解可參考:blog.csdn.net/itismelzp/a…

Tomcat有幾種部署方式

  1. 直接把Web專案放在webapps下,Tomcat會自動將其部署
  2. 在server.xml檔案上配置<Context>節點,設定相關的屬性即可
  3. 通過Catalina來進行配置:進入到conf\Catalina\localhost檔案下,建立一個xml檔案,該檔案的名字就是站點的名字。編寫XML的方式來進行設定。

部署方式第二點:

  • 在其他碟符下建立一個web站點目錄,並建立WEB-INF目錄和一個html檔案。

Tomcat+Servlet面試題都在這裡

  • 找到Tomcat目錄下/conf/server.xml檔案

Tomcat+Servlet面試題都在這裡

  • 在server.xml中的節點下新增如下程式碼。path表示的是訪問時輸入的web專案名,docBase表示的是站點目錄的絕對路徑

		<Context path="/web1" docBase="D:\web1"/>
複製程式碼

Tomcat+Servlet面試題都在這裡

  • 訪問配置好的web站點

Tomcat+Servlet面試題都在這裡


部署方式第三點:

  • 進入到conf\Catalina\localhost檔案下,建立一個xml檔案,該檔案的名字就是站點的名字。

    這裡寫圖片描述

  • xml檔案的程式碼如下,docBase是你web站點的絕對路徑

<?xml version="1.0" encoding="UTF-8"?> 
<Context 
    docBase="D:\web1" 
    reloadable="true"> 
</Context> 
複製程式碼
  • 訪問web站點下的html資源

這裡寫圖片描述

Servlet面試題

Servlet生命週期

Servlet生命週期?

Tomcat+Servlet面試題都在這裡

  • 第一次訪問Servlet,我們發現init()和service()都被呼叫了

Tomcat+Servlet面試題都在這裡

  • 第二次訪問Servlet,service()被呼叫了

Tomcat+Servlet面試題都在這裡

  • 第三次訪問Servlet,還是service()被呼叫了

Tomcat+Servlet面試題都在這裡

  • 當我們關閉Tomcat伺服器的時候,destroy()被呼叫了!

Tomcat+Servlet面試題都在這裡

Servlet生命週期可分為5個步驟

  1. 載入Servlet。當Tomcat第一次訪問Servlet的時候,Tomcat會負責建立Servlet的例項
  2. 初始化。當Servlet被例項化後,Tomcat會呼叫init()方法初始化這個物件
  3. 處理服務。當瀏覽器訪問Servlet的時候,Servlet 會呼叫service()方法處理請求
  4. 銷燬。當Tomcat關閉時或者檢測到Servlet要從Tomcat刪除的時候會自動呼叫destroy()方法,讓該例項釋放掉所佔的資源。一個Servlet如果長時間不被使用的話,也會被Tomcat自動銷燬
  5. 解除安裝。當Servlet呼叫完destroy()方法後,等待垃圾回收。如果有需要再次使用這個Servlet,會重新呼叫init()方法進行初始化操作
  • 簡單總結:只要訪問Servlet,service()就會被呼叫。init()只有第一次訪問Servlet的時候才會被呼叫。destroy()只有在Tomcat關閉的時候才會被呼叫。

get方式和post方式有何區別

get方式和post方式有何區別

資料攜帶上:

  • GET方式:在URL地址後附帶的引數是有限制的,其資料容量通常不能超過1K。
  • POST方式:可以在請求的實體內容中向伺服器傳送資料,傳送的資料量無限制。

請求引數的位置上:

  • GET方式:請求引數放在URL地址後面,以?的方式來進行拼接
  • POST方式:請求引數放在HTTP請求包中

用途上:

  • GET方式一般用來獲取資料
  • POST方式一般用來提交資料
    • 原因:
      • 首先是因為GET方式攜帶的資料量比較小,無法帶過去很大的數量
      • POST方式提交的引數後臺更加容易解析(使用POST方式提交的中文資料,後臺也更加容易解決)
      • GET方式比POST方式要快 GET方式比POST方式要快,詳情可看:www.cnblogs.com/strayling/p…

Servlet相關 API

doGet與doPost方法的兩個引數是什麼

  1. HttpServletRequest:封裝了與請求相關的資訊
  2. HttpServletResponse:封裝了與響應相關的資訊

Tomcat+Servlet面試題都在這裡

獲取頁面的元素的值有幾種方式,分別說一下

  1. request.getParameter() 返回客戶端的請求引數的值
  2. request.getParameterNames() 返回所有可用屬性名的列舉
  3. request.getParameterValues() 返回包含引數的所有值的陣列

request.getAttribute()和request.getParameter()區別

用途上:

  • request.getAttribute(), 一般用於獲取request域物件的資料(在跳轉之前把資料使用setAttribute來放到request物件上)
  • request.getParameter(), 一般用於獲取客戶端提交的引數

儲存資料上:

  • request.getAttribute()可以獲取Objcet物件
  • request.getParameter()只能獲取字串(這也是為什麼它一般用於獲取客戶端提交的引數)

forward和redirect的區別

forward和redirect的區別

  • 實際發生位置不同,位址列不同
    • 轉發是發生在伺服器的
      • 轉發是由伺服器進行跳轉的,細心的朋友會發現,在轉發的時候,瀏覽器的位址列是沒有發生變化的,在我訪問Servlet111的時候,即使跳轉到了Servlet222的頁面,瀏覽器的地址還是Servlet111的。也就是說瀏覽器是不知道該跳轉的動作,轉發是對瀏覽器透明的。通過上面的轉發時序圖我們也可以發現,實現轉發只是一次的http請求一次轉發中request和response物件都是同一個。這也解釋了,為什麼可以使用request作為域物件進行Servlet之間的通訊。
    • 重定向是發生在瀏覽器的
      • 重定向是由瀏覽器進行跳轉的,進行重定向跳轉的時候,瀏覽器的地址會發生變化的。曾經介紹過:實現重定向的原理是由response的狀態碼和Location頭組合而實現的。這是由瀏覽器進行的頁面跳轉實現重定向會發出兩個http請求request域物件是無效的,因為它不是同一個request物件
  • 用法不同:
    • 很多人都搞不清楚轉發和重定向的時候,資源地址究竟怎麼寫。有的時候要把應用名寫上,有的時候不用把應用名寫上。很容易把人搞暈。記住一個原則: 給伺服器用的直接從資源名開始寫,給瀏覽器用的要把應用名寫上
      • request.getRequestDispatcher("/資源名 URI").forward(request,response)
        • 轉發時"/"代表的是本應用程式的根目錄【zhongfucheng】
      • response.send("/web應用/資源名 URI");
        • 重定向時"/"代表的是webapps目錄
  • 能夠去往的URL的範圍不一樣:
    • 轉發是伺服器跳轉只能去往當前web應用的資源
    • 重定向是伺服器跳轉,可以去往任何的資源
  • 傳遞資料的型別不同
    • 轉發的request物件可以傳遞各種型別的資料,包括物件
    • 重定向只能傳遞字串
  • 跳轉的時間不同
    • 轉發時:執行到跳轉語句時就會立刻跳轉
    • 重定向:整個頁面執行完之後才執行跳轉

那麼轉發(forward)和重定向(redirect)使用哪一個?

  • 根據上面說明了轉發和重定向的區別也可以很容易概括出來。轉發是帶著轉發前的請求的引數的。重定向是新的請求

典型的應用場景:

  1. 轉發: 訪問 Servlet 處理業務邏輯,然後 forward 到 jsp 顯示處理結果,瀏覽器裡 URL 不變
  2. 重定向: 提交表單,處理成功後 redirect 到另一個 jsp,防止表單重複提交,瀏覽器裡 URL 變了

tomcat容器是如何建立servlet類例項?用到了什麼原理?

tomcat容器是如何建立servlet類例項?用到了什麼原理

  1. 當容器啟動時,會讀取在webapps目錄下所有的web應用中的web.xml檔案,然後對 xml檔案進行解析,並讀取servlet註冊資訊。然後,將每個應用中註冊的servlet類都進行載入,並通過 反射的方式例項化。(有時候也是在第一次請求時例項化)
  2. 在servlet註冊時加上1如果為正數,則在一開始就例項化,如果不寫或為負數,則第一次請求例項化。

什麼是cookie?Session和cookie有什麼區別 ?

什麼是cookie?

Cookie是由W3C組織提出,最早由netscape社群發展的一種機制

  • 網頁之間的互動是通過HTTP協議傳輸資料的,而Http協議是無狀態的協議。無狀態的協議是什麼意思呢?一旦資料提交完後,瀏覽器和伺服器的連線就會關閉,再次互動的時候需要重新建立新的連線
  • 伺服器無法確認使用者的資訊,於是乎,W3C就提出了:給每一個使用者都發一個通行證,無論誰訪問的時候都需要攜帶通行證,這樣伺服器就可以從通行證上確認使用者的資訊。通行證就是Cookie

Tomcat+Servlet面試題都在這裡

Session和cookie有什麼區別?

  • 從儲存方式上比較

    • Cookie只能儲存字串,如果要儲存非ASCII字串還要對其編碼。
    • Session可以儲存任何型別的資料,可以把Session看成是一個容器
  • 從隱私安全上比較

    • Cookie儲存在瀏覽器中,對客戶端是可見的。資訊容易洩露出去。如果使用Cookie,最好將Cookie加密
    • Session儲存在伺服器上,對客戶端是透明的。不存在敏感資訊洩露問題。
  • 從有效期上比較

    • Cookie儲存在硬碟中,只需要設定maxAge屬性為比較大的正整數,即使關閉瀏覽器,Cookie還是存在的
    • Session的儲存在伺服器中,設定maxInactiveInterval屬性值來確定Session的有效期。並且Session依賴於名為JSESSIONID的Cookie,該Cookie預設的maxAge屬性為-1。如果關閉了瀏覽器,該Session雖然沒有從伺服器中消亡,但也就失效了。
  • 從對伺服器的負擔比較

    • Session是儲存在伺服器的,每個使用者都會產生一個Session,如果是併發訪問的使用者非常多,是不能使用Session的,Session會消耗大量的記憶體。
    • Cookie是儲存在客戶端的。不佔用伺服器的資源。像baidu、Sina這樣的大型網站,一般都是使用Cookie來進行會話跟蹤。
  • 從瀏覽器的支援上比較

    • 如果瀏覽器禁用了Cookie,那麼Cookie是無用的了!
    • 如果瀏覽器禁用了Cookie,Session可以通過URL地址重寫來進行會話跟蹤。
  • 從跨域名上比較

    • Cookie可以設定domain屬性來實現跨域名
    • Session只在當前的域名內有效,不可誇域名

Servlet安全性問題

由於Servlet是單例的,當多個使用者訪問Servlet的時候,伺服器會為每個使用者建立一個執行緒當多個使用者併發訪問Servlet共享資源的時候就會出現執行緒安全問題

原則:

  1. 如果一個變數需要多個使用者共享,則應當在訪問該變數的時候,加同步機制synchronized (物件){}
  2. 如果一個變數不需要共享,則直接在 doGet() 或者 doPost()定義.這樣不會存線上程安全問題

如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章的同學,可以關注微信公眾號:Java3y

相關文章