Tomcat+Servlet面試題都在這里

下面是我整理下來的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或者是其他的

image

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/50886009

Tomcat有幾種部署方式

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

部署方式第二點:

  • 在其他盤符下創建一個web站點目錄,并創建WEB-INF目錄和一個html文件。
image
  • 找到Tomcat目錄下/conf/server.xml文件
image
  • 在server.xml中的節點下添加如下代碼。path表示的是訪問時輸入的web項目名,docBase表示的是站點目錄的絕對路徑

        <Context path="/web1" docBase="D:\web1"/>
image
  • 訪問配置好的web站點
image

部署方式第三點:

  • 進入到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生命周期?

image
  • 第一次訪問Servlet,我們發現init()和service()都被調用了
image
  • 第二次訪問Servlet,service()被調用了
image
  • 第三次訪問Servlet,還是service()被調用了
image
  • 當我們關閉Tomcat服務器的時候,destroy()被調用了!
image

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方式要快,詳情可看:https://www.cnblogs.com/strayling/p/3580048.html

Servlet相關 API

doGet與doPost方法的兩個參數是什么

  1. HttpServletRequest:封裝了與請求相關的信息

  2. HttpServletResponse:封裝了與響應相關的信息

    image

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

  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
image

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,238評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,430評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,134評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,893評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,653評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,136評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,212評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,372評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,888評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,738評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,482評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,179評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,588評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,829評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,610評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,916評論 2 372

推薦閱讀更多精彩內容

  • 從三月份找實習到現在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發崗...
    時芥藍閱讀 42,319評論 11 349
  • Servlet:Sun公司制訂的一種用來擴展Web服務器功能的組件規范。當瀏覽器將請求發送給Web服務器(比如:a...
    南山伐木閱讀 591評論 0 4
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,781評論 18 139
  • 樓尖斑舊雕圖美,哥特房屋塞滿歐。 百歲民宅風味厚,教堂肅穆史悠悠。 街石磚瓦風霜長,無損無凹信步溜。 文化傳承城市...
    徐一村閱讀 400評論 0 5
  • 注:不知何時眼花手抖,驚呼小號的第一篇文章不見liao,再重寫一篇也不是當時的心情,就借別人的文緬懷下吧。 最后一...
    周雨聊管理閱讀 438評論 1 2