Tomcat+Servlet面試題都在這裏

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

圖片描述
web

圖上的知識點均可以在我其餘的文章內找到相應內容。面試

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或者是其餘的
apache

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模式啓動起來是比較複雜的,詳情可參考:http://blog.csdn.net/wanglei_storage/article/details/50225779瀏覽器

對於bio,nio,nio.2的理解可參考:http://blog.csdn.net/itismelzp/article/details/50886009tomcat

Tomcat有幾種部署方式

  1. 直接把Web項目放在webapps下,Tomcat會自動將其部署
  2. 在server.xml文件上配置<Context>節點,設置相關的屬性便可
  3. 經過Catalina來進行配置:進入到confCatalinalocalhost文件下,建立一個xml文件,該文件的名字就是站點的名字。編寫XML的方式來進行設置。

部署方式第二點:

  • 在其餘盤符下建立一個web站點目錄,並建立WEB-INF目錄和一個html文件。

  • 找到Tomcat目錄下/conf/server.xml文件

  • 在server.xml中的<Host>節點下添加以下代碼。path表示的是訪問時輸入的web項目名,docBase表示的是站點目錄的絕對路徑
<Context path="/web1" docBase="D:\web1"/>

  • 訪問配置好的web站點


部署方式第三點:

  • 進入到confCatalinalocalhost文件下,建立一個xml文件,該文件的名字就是站點的名字。

這裏寫圖片描述

  • xml文件的代碼以下,docBase是你web站點的絕對路徑
<?xml version="1.0" encoding="UTF-8"?> 
<Context 
    docBase="D:\web1" 
    reloadable="true"> 
</Context>
  • 訪問web站點下的html資源

這裏寫圖片描述

Servlet面試題

Servlet生命週期

Servlet生命週期?

  • 第一次訪問Servlet,咱們發現init()和service()都被調用了

  • 第二次訪問Servlet,service()被調用了

  • 第三次訪問Servlet,仍是service()被調用了

  • 當咱們關閉Tomcat服務器的時候,destroy()被調用了!

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方式有何區別

2018年9月14日12:15:12更新:下面的區別主要在HTML/瀏覽器的環境下討論(由於HTTP協議的使用不僅僅只有瀏覽器能用)服務器

參考資料:

get方式和post方式有何區別

數據攜帶上:

  • GET方式:在URL地址後附帶的參數是有限制的,其數據容量一般不能超過1K。
  • POST方式:能夠在請求的實體內容中向服務器發送數據,傳送的數據量無限制。

請求參數的位置上:

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

用途上:

  • GET方式通常用來獲取數據
  • POST方式通常用來提交數據

    • 緣由:

      • 首先是由於GET方式攜帶的數據量比較小,沒法帶過去很大的數量
      • POST方式提交的參數後臺更加容易解析(使用POST方式提交的中文數據,後臺也更加容易解決)
      • GET方式比POST方式要快

GET方式比POST方式要快,詳情可看:http://www.javashuo.com/article/p-vjpmnfvi-br.html

Servlet相關 API

doGet與doPost方法的兩個參數是什麼
  1. HttpServletRequest:封裝了與請求相關的信息
  2. HttpServletResponse:封裝了與響應相關的信息

獲取頁面的元素的值有幾種方式,分別說一下
  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註冊時加上<load-on-startup>1</load-on-startup>若是爲正數,則在一開始就實例化,若是不寫或爲負數,則第一次請求實例化。

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

什麼是cookie?

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

  • 網頁之間的交互是經過HTTP協議傳輸數據的,而Http協議是無狀態的協議。無狀態的協議是什麼意思呢?一旦數據提交完後,瀏覽器和服務器的鏈接就會關閉,再次交互的時候須要從新創建新的鏈接
  • 服務器沒法確認用戶的信息,因而乎,W3C就提出了:給每個用戶都發一個通行證,不管誰訪問的時候都須要攜帶通行證,這樣服務器就能夠從通行證上確認用戶的信息。通行證就是Cookie

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
相關文章
相關標籤/搜索