Tomcat+Servlet面試題都在這里

下面是我整理下來(lái)的Servlet知識(shí)點(diǎn):


這里寫(xiě)圖片描述

圖上的知識(shí)點(diǎn)都可以在我其他的文章內(nèi)找到相應(yīng)內(nèi)容。

Tomcat常見(jiàn)面試題

Tomcat的缺省端口是多少,怎么修改

Tomcat的缺省端口是多少,怎么修改

  1. 找到Tomcat目錄下的conf文件夾
  2. 進(jìn)入conf文件夾里面找到server.xml文件
  3. 打開(kāi)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. 啟動(dòng)Tomcat,并且在IE瀏覽器里面的地址欄輸入http://127.0.0.1:8888/

到tomcat主目錄下的conf/server.xml文件中修改,把8080端口改成是8088或者是其他的

image

Tomcat 有哪幾種Connector 運(yùn)行模式(優(yōu)化)?

tomcat 有哪幾種Connector 運(yùn)行模式(優(yōu)化)?

  1. bio(blocking I/O)
  2. nio(non-blocking I/O)
  3. apr(Apache Portable Runtime/Apache可移植運(yùn)行庫(kù))

相關(guān)解釋:

  • bio: 傳統(tǒng)的Java I/O操作,同步且阻塞IO。
  • nio: JDK1.4開(kāi)始支持,同步阻塞或同步非阻塞IO
  • aio(nio.2): JDK7開(kāi)始支持,異步非阻塞IO
  • apr: Tomcat將以JNI的形式調(diào)用Apache HTTP服務(wù)器的核心動(dòng)態(tài)鏈接庫(kù)來(lái)處理文件讀取或網(wǎng)絡(luò)傳輸操作,從而大大地 提高Tomcat對(duì)靜態(tài)文件的處理性能

下面是配置Tomcat運(yùn)行模式改成是NIO模式,并配置連接池相關(guān)參數(shù)來(lái)進(jìn)行優(yōu)化:

    <!--
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
    <!-- protocol 啟用 nio模式,(tomcat8默認(rèn)使用的是nio)(apr模式利用系統(tǒng)級(jí)異步io) -->
    <!-- minProcessors最小空閑連接線程數(shù)-->
    <!-- maxProcessors最大連接線程數(shù)-->
    <!-- acceptCount允許的最大連接數(shù),應(yīng)大于等于maxProcessors-->
    <!-- enableLookups 如果為true,requst.getRemoteHost會(huì)執(zhí)行DNS查找,反向解析ip對(duì)應(yīng)域名或主機(jī)名-->
    <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" 
        connectionTimeout="20000"
        redirectPort="8443

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

apr模式啟動(dòng)起來(lái)是比較復(fù)雜的,詳情可參考:http://blog.csdn.net/wanglei_storage/article/details/50225779

對(duì)于bio,nio,nio.2的理解可參考:http://blog.csdn.net/itismelzp/article/details/50886009

Tomcat有幾種部署方式

  1. 直接把Web項(xiàng)目放在webapps下,Tomcat會(huì)自動(dòng)將其部署
  2. 在server.xml文件上配置<Context>節(jié)點(diǎn),設(shè)置相關(guān)的屬性即可
  3. 通過(guò)Catalina來(lái)進(jìn)行配置:進(jìn)入到conf\Catalina\localhost文件下,創(chuàng)建一個(gè)xml文件,該文件的名字就是站點(diǎn)的名字。編寫(xiě)XML的方式來(lái)進(jìn)行設(shè)置。

部署方式第二點(diǎn):

  • 在其他盤(pán)符下創(chuàng)建一個(gè)web站點(diǎn)目錄,并創(chuàng)建WEB-INF目錄和一個(gè)html文件。
image
  • 找到Tomcat目錄下/conf/server.xml文件
image
  • 在server.xml中的節(jié)點(diǎn)下添加如下代碼。path表示的是訪問(wèn)時(shí)輸入的web項(xiàng)目名,docBase表示的是站點(diǎn)目錄的絕對(duì)路徑

        <Context path="/web1" docBase="D:\web1"/>
image
  • 訪問(wèn)配置好的web站點(diǎn)
image

部署方式第三點(diǎn):

  • 進(jìn)入到conf\Catalina\localhost文件下,創(chuàng)建一個(gè)xml文件,該文件的名字就是站點(diǎn)的名字。

    這里寫(xiě)圖片描述

  • xml文件的代碼如下,docBase是你web站點(diǎn)的絕對(duì)路徑

<?xml version="1.0" encoding="UTF-8"?> 
<Context 
    docBase="D:\web1" 
    reloadable="true"> 
</Context> 
  • 訪問(wèn)web站點(diǎn)下的html資源
這里寫(xiě)圖片描述

Servlet面試題

Servlet生命周期

Servlet生命周期?

image
  • 第一次訪問(wèn)Servlet,我們發(fā)現(xiàn)init()和service()都被調(diào)用了
image
  • 第二次訪問(wèn)Servlet,service()被調(diào)用了
image
  • 第三次訪問(wèn)Servlet,還是service()被調(diào)用了
image
  • 當(dāng)我們關(guān)閉Tomcat服務(wù)器的時(shí)候,destroy()被調(diào)用了!
image

Servlet生命周期可分為5個(gè)步驟

  1. 加載Servlet。當(dāng)Tomcat第一次訪問(wèn)Servlet的時(shí)候,Tomcat會(huì)負(fù)責(zé)創(chuàng)建Servlet的實(shí)例
  2. 初始化。當(dāng)Servlet被實(shí)例化后,Tomcat會(huì)調(diào)用init()方法初始化這個(gè)對(duì)象
  3. 處理服務(wù)。當(dāng)瀏覽器訪問(wèn)Servlet的時(shí)候,Servlet 會(huì)調(diào)用service()方法處理請(qǐng)求
  4. 銷毀。當(dāng)Tomcat關(guān)閉時(shí)或者檢測(cè)到Servlet要從Tomcat刪除的時(shí)候會(huì)自動(dòng)調(diào)用destroy()方法,讓該實(shí)例釋放掉所占的資源。一個(gè)Servlet如果長(zhǎng)時(shí)間不被使用的話,也會(huì)被Tomcat自動(dòng)銷毀
  5. 卸載。當(dāng)Servlet調(diào)用完destroy()方法后,等待垃圾回收。如果有需要再次使用這個(gè)Servlet,會(huì)重新調(diào)用init()方法進(jìn)行初始化操作。

  • 簡(jiǎn)單總結(jié):只要訪問(wèn)Servlet,service()就會(huì)被調(diào)用。init()只有第一次訪問(wèn)Servlet的時(shí)候才會(huì)被調(diào)用。destroy()只有在Tomcat關(guān)閉的時(shí)候才會(huì)被調(diào)用。

get方式和post方式有何區(qū)別

get方式和post方式有何區(qū)別

數(shù)據(jù)攜帶上:

  • GET方式:在URL地址后附帶的參數(shù)是有限制的,其數(shù)據(jù)容量通常不能超過(guò)1K。
  • POST方式:可以在請(qǐng)求的實(shí)體內(nèi)容中向服務(wù)器發(fā)送數(shù)據(jù),傳送的數(shù)據(jù)量無(wú)限制。

請(qǐng)求參數(shù)的位置上:

  • GET方式:請(qǐng)求參數(shù)放在URL地址后面,以?的方式來(lái)進(jìn)行拼接
  • POST方式:請(qǐng)求參數(shù)放在HTTP請(qǐng)求包中

用途上:

  • GET方式一般用來(lái)獲取數(shù)據(jù)

  • POST方式一般用來(lái)提交數(shù)據(jù)

    • 原因:

      • 首先是因?yàn)镚ET方式攜帶的數(shù)據(jù)量比較小,無(wú)法帶過(guò)去很大的數(shù)量
      • POST方式提交的參數(shù)后臺(tái)更加容易解析(使用POST方式提交的中文數(shù)據(jù),后臺(tái)也更加容易解決)
      • GET方式比POST方式要快
        GET方式比POST方式要快,詳情可看:https://www.cnblogs.com/strayling/p/3580048.html

Servlet相關(guān) API

doGet與doPost方法的兩個(gè)參數(shù)是什么

  1. HttpServletRequest:封裝了與請(qǐng)求相關(guān)的信息

  2. HttpServletResponse:封裝了與響應(yīng)相關(guān)的信息

    image

獲取頁(yè)面的元素的值有幾種方式,分別說(shuō)一下

  1. request.getParameter() 返回客戶端的請(qǐng)求參數(shù)的值
  2. request.getParameterNames() 返回所有可用屬性名的枚舉
  3. request.getParameterValues() 返回包含參數(shù)的所有值的數(shù)組

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

用途上:

  • request.getAttribute(), 一般用于獲取request域?qū)ο蟮臄?shù)據(jù)(在跳轉(zhuǎn)之前把數(shù)據(jù)使用setAttribute來(lái)放到request對(duì)象上)
  • request.getParameter(), 一般用于獲取客戶端提交的參數(shù)

存儲(chǔ)數(shù)據(jù)上:

  • request.getAttribute()可以獲取Objcet對(duì)象
  • request.getParameter()只能獲取字符串(這也是為什么它一般用于獲取客戶端提交的參數(shù))

forward和redirect的區(qū)別

forward和redirect的區(qū)別

  • 實(shí)際發(fā)生位置不同,地址欄不同

    • 轉(zhuǎn)發(fā)是發(fā)生在服務(wù)器的

      • 轉(zhuǎn)發(fā)是由服務(wù)器進(jìn)行跳轉(zhuǎn)的,細(xì)心的朋友會(huì)發(fā)現(xiàn),在轉(zhuǎn)發(fā)的時(shí)候,瀏覽器的地址欄是沒(méi)有發(fā)生變化的,在我訪問(wèn)Servlet111的時(shí)候,即使跳轉(zhuǎn)到了Servlet222的頁(yè)面,瀏覽器的地址還是Servlet111的。也就是說(shuō)瀏覽器是不知道該跳轉(zhuǎn)的動(dòng)作,轉(zhuǎn)發(fā)是對(duì)瀏覽器透明的。通過(guò)上面的轉(zhuǎn)發(fā)時(shí)序圖我們也可以發(fā)現(xiàn),實(shí)現(xiàn)轉(zhuǎn)發(fā)只是一次的http請(qǐng)求一次轉(zhuǎn)發(fā)中request和response對(duì)象都是同一個(gè)。這也解釋了,為什么可以使用request作為域?qū)ο筮M(jìn)行Servlet之間的通訊。
    • 重定向是發(fā)生在瀏覽器的

      • 重定向是由瀏覽器進(jìn)行跳轉(zhuǎn)的,進(jìn)行重定向跳轉(zhuǎn)的時(shí)候,瀏覽器的地址會(huì)發(fā)生變化的。曾經(jīng)介紹過(guò):實(shí)現(xiàn)重定向的原理是由response的狀態(tài)碼和Location頭組合而實(shí)現(xiàn)的。這是由瀏覽器進(jìn)行的頁(yè)面跳轉(zhuǎn)實(shí)現(xiàn)重定向會(huì)發(fā)出兩個(gè)http請(qǐng)求,request域?qū)ο笫菬o(wú)效的,因?yàn)樗皇峭粋€(gè)request對(duì)象
  • 用法不同:

    • 很多人都搞不清楚轉(zhuǎn)發(fā)和重定向的時(shí)候,資源地址究竟怎么寫(xiě)。有的時(shí)候要把應(yīng)用名寫(xiě)上,有的時(shí)候不用把應(yīng)用名寫(xiě)上。很容易把人搞暈。記住一個(gè)原則: 給服務(wù)器用的直接從資源名開(kāi)始寫(xiě),給瀏覽器用的要把應(yīng)用名寫(xiě)上
    • request.getRequestDispatcher(“/資源名 URI”).forward(request,response)
      • 轉(zhuǎn)發(fā)時(shí)”/”代表的是本應(yīng)用程序的根目錄【zhongfucheng】
    • response.send(“/web應(yīng)用/資源名 URI”);
      • 重定向時(shí)”/”代表的是webapps目錄
  • 能夠去往的URL的范圍不一樣:

    • 轉(zhuǎn)發(fā)是服務(wù)器跳轉(zhuǎn)只能去往當(dāng)前web應(yīng)用的資源
    • 重定向是服務(wù)器跳轉(zhuǎn),可以去往任何的資源
  • 傳遞數(shù)據(jù)的類型不同

    • 轉(zhuǎn)發(fā)的request對(duì)象可以傳遞各種類型的數(shù)據(jù),包括對(duì)象
    • 重定向只能傳遞字符串
  • 跳轉(zhuǎn)的時(shí)間不同

    • 轉(zhuǎn)發(fā)時(shí):執(zhí)行到跳轉(zhuǎn)語(yǔ)句時(shí)就會(huì)立刻跳轉(zhuǎn)
    • 重定向:整個(gè)頁(yè)面執(zhí)行完之后才執(zhí)行跳轉(zhuǎn)

那么轉(zhuǎn)發(fā)(forward)和重定向(redirect)使用哪一個(gè)?

  • 根據(jù)上面說(shuō)明了轉(zhuǎn)發(fā)和重定向的區(qū)別也可以很容易概括出來(lái)。轉(zhuǎn)發(fā)是帶著轉(zhuǎn)發(fā)前的請(qǐng)求的參數(shù)的。重定向是新的請(qǐng)求。

典型的應(yīng)用場(chǎng)景:

  1. 轉(zhuǎn)發(fā): 訪問(wèn) Servlet 處理業(yè)務(wù)邏輯,然后 forward 到 jsp 顯示處理結(jié)果,瀏覽器里 URL 不變
  2. 重定向: 提交表單,處理成功后 redirect 到另一個(gè) jsp,防止表單重復(fù)提交,瀏覽器里 URL 變了

tomcat容器是如何創(chuàng)建servlet類實(shí)例?用到了什么原理?

tomcat容器是如何創(chuàng)建servlet類實(shí)例?用到了什么原理

  1. 當(dāng)容器啟動(dòng)時(shí),會(huì)讀取在webapps目錄下所有的web應(yīng)用中的web.xml文件,然后對(duì) xml文件進(jìn)行解析,并讀取servlet注冊(cè)信息。然后,將每個(gè)應(yīng)用中注冊(cè)的servlet類都進(jìn)行加載,并通過(guò) 反射的方式實(shí)例化。(有時(shí)候也是在第一次請(qǐng)求時(shí)實(shí)例化)
  2. 在servlet注冊(cè)時(shí)加上1如果為正數(shù),則在一開(kāi)始就實(shí)例化,如果不寫(xiě)或?yàn)樨?fù)數(shù),則第一次請(qǐng)求實(shí)例化。

什么是cookie?Session和cookie有什么區(qū)別?

什么是cookie?

Cookie是由W3C組織提出,最早由netscape社區(qū)發(fā)展的一種機(jī)制

  • 網(wǎng)頁(yè)之間的交互是通過(guò)HTTP協(xié)議傳輸數(shù)據(jù)的,而Http協(xié)議是無(wú)狀態(tài)的協(xié)議。無(wú)狀態(tài)的協(xié)議是什么意思呢?一旦數(shù)據(jù)提交完后,瀏覽器和服務(wù)器的連接就會(huì)關(guān)閉,再次交互的時(shí)候需要重新建立新的連接
  • 服務(wù)器無(wú)法確認(rèn)用戶的信息,于是乎,W3C就提出了:給每一個(gè)用戶都發(fā)一個(gè)通行證,無(wú)論誰(shuí)訪問(wèn)的時(shí)候都需要攜帶通行證,這樣服務(wù)器就可以從通行證上確認(rèn)用戶的信息。通行證就是Cookie
image

Session和cookie有什么區(qū)別?

  • 從存儲(chǔ)方式上比較

    • Cookie只能存儲(chǔ)字符串,如果要存儲(chǔ)非ASCII字符串還要對(duì)其編碼。
    • Session可以存儲(chǔ)任何類型的數(shù)據(jù),可以把Session看成是一個(gè)容器
  • 從隱私安全上比較

    • Cookie存儲(chǔ)在瀏覽器中,對(duì)客戶端是可見(jiàn)的。信息容易泄露出去。如果使用Cookie,最好將Cookie加密
    • Session存儲(chǔ)在服務(wù)器上,對(duì)客戶端是透明的。不存在敏感信息泄露問(wèn)題。
  • 從有效期上比較

    • Cookie保存在硬盤(pán)中,只需要設(shè)置maxAge屬性為比較大的正整數(shù),即使關(guān)閉瀏覽器,Cookie還是存在的
    • Session的保存在服務(wù)器中,設(shè)置maxInactiveInterval屬性值來(lái)確定Session的有效期。并且Session依賴于名為JSESSIONID的Cookie,該Cookie默認(rèn)的maxAge屬性為-1。如果關(guān)閉了瀏覽器,該Session雖然沒(méi)有從服務(wù)器中消亡,但也就失效了。
  • 從對(duì)服務(wù)器的負(fù)擔(dān)比較

    • Session是保存在服務(wù)器的,每個(gè)用戶都會(huì)產(chǎn)生一個(gè)Session,如果是并發(fā)訪問(wèn)的用戶非常多,是不能使用Session的,Session會(huì)消耗大量的內(nèi)存。
    • Cookie是保存在客戶端的。不占用服務(wù)器的資源。像baidu、Sina這樣的大型網(wǎng)站,一般都是使用Cookie來(lái)進(jìn)行會(huì)話跟蹤。
  • 從瀏覽器的支持上比較

    • 如果瀏覽器禁用了Cookie,那么Cookie是無(wú)用的了!
    • 如果瀏覽器禁用了Cookie,Session可以通過(guò)URL地址重寫(xiě)來(lái)進(jìn)行會(huì)話跟蹤。
  • 從跨域名上比較

    • Cookie可以設(shè)置domain屬性來(lái)實(shí)現(xiàn)跨域名
    • Session只在當(dāng)前的域名內(nèi)有效,不可夸域名

Servlet安全性問(wèn)題

由于Servlet是單例的,當(dāng)多個(gè)用戶訪問(wèn)Servlet的時(shí)候,服務(wù)器會(huì)為每個(gè)用戶創(chuàng)建一個(gè)線程。當(dāng)多個(gè)用戶并發(fā)訪問(wèn)Servlet共享資源的時(shí)候就會(huì)出現(xiàn)線程安全問(wèn)題

原則:

  1. 如果一個(gè)變量需要多個(gè)用戶共享,則應(yīng)當(dāng)在訪問(wèn)該變量的時(shí)候,加同步機(jī)制synchronized (對(duì)象){}
  2. 如果一個(gè)變量不需要共享,則直接在 doGet() 或者 doPost()定義.這樣不會(huì)存在線程安全問(wèn)題

如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章的同學(xué),可以關(guān)注微信公眾號(hào):Java3y

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容