Tomcat+Servlet面试题都在这里
下面是我整理下來(lái)的Servlet知識(shí)點(diǎn):

圖上的知識(shí)點(diǎn)都可以在我其他的文章內(nèi)找到相應(yīng)內(nèi)容。
Tomcat常見(jiàn)面試題
Tomcat的缺省端口是多少,怎么修改
Tomcat的缺省端口是多少,怎么修改
到tomcat主目錄下的conf/server.xml文件中修改,把8080端口改成是8088或者是其他的
Tomcat 有哪幾種Connector 運(yùn)行模式(優(yōu)化)?
tomcat 有哪幾種Connector 運(yùn)行模式(優(yōu)化)?
相關(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="8443maxThreads=“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有幾種部署方式
部署方式第二點(diǎn):
- 在其他盤(pán)符下創(chuàng)建一個(gè)web站點(diǎn)目錄,并創(chuàng)建WEB-INF目錄和一個(gè)html文件。
- 找到Tomcat目錄下/conf/server.xml文件
- 在server.xml中的節(jié)點(diǎn)下添加如下代碼。path表示的是訪問(wèn)時(shí)輸入的web項(xiàng)目名,docBase表示的是站點(diǎn)目錄的絕對(duì)路徑
- 訪問(wèn)配置好的web站點(diǎn)
部署方式第三點(diǎn):
進(jìn)入到conf\Catalina\localhost文件下,創(chuàng)建一個(gè)xml文件,該文件的名字就是站點(diǎn)的名字。
xml文件的代碼如下,docBase是你web站點(diǎn)的絕對(duì)路徑
- 訪問(wèn)web站點(diǎn)下的html資源
Servlet面試題
Servlet生命周期
Servlet生命周期?
- 第一次訪問(wèn)**Servlet,我們發(fā)現(xiàn)**init()和service()都被調(diào)用了
- 第二次訪問(wèn)**Servlet,**service()被調(diào)用了
- 第三次訪問(wèn)Servlet,還是service()被調(diào)用了
- 當(dāng)我們關(guān)閉Tomcat服務(wù)器的時(shí)候,destroy()被調(diào)用了!
Servlet生命周期可分為5個(gè)步驟
- 簡(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ù)是什么
HttpServletResponse:封裝了與響應(yīng)相關(guān)的信息
獲取頁(yè)面的元素的值有幾種方式,分別說(shuō)一下
request.getAttribute()和request.getParameter()區(qū)別
用途上:
- request.getAttribute(), 一般用于獲取request域?qū)ο蟮臄?shù)據(jù)(在跳轉(zhuǎn)之前把數(shù)據(jù)使用setAttribute來(lái)放到request對(duì)象上)
- request.getParameter(), 一般用于獲取客戶(hù)端提交的參數(shù)
存儲(chǔ)數(shù)據(jù)上:
- request.getAttribute()可以獲取Objcet對(duì)象
- request.getParameter()只能獲取字符串(這也是為什么它一般用于獲取客戶(hù)端提交的參數(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ā)是發(fā)生在服務(wù)器的
- 用法不同:
- 很多人都搞不清楚轉(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目錄
- 轉(zhuǎn)發(fā)時(shí)”/”代表的是本應(yīng)用程序的根目錄【zhongfucheng】
- 能夠去往的URL的范圍不一樣:
- 轉(zhuǎn)發(fā)是服務(wù)器跳轉(zhuǎn)只能去往當(dāng)前web應(yīng)用的資源
- 重定向是服務(wù)器跳轉(zhuǎn),可以去往任何的資源
- 傳遞數(shù)據(jù)的類(lèi)型不同
- 轉(zhuǎn)發(fā)的request對(duì)象可以傳遞各種類(lèi)型的數(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)景:
tomcat容器是如何創(chuàng)建servlet類(lèi)實(shí)例?用到了什么原理?
tomcat容器是如何創(chuàng)建servlet類(lèi)實(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)用戶(hù)的信息,于是乎,W3C就提出了:給每一個(gè)用戶(hù)都發(fā)一個(gè)通行證,無(wú)論誰(shuí)訪問(wèn)的時(shí)候都需要攜帶通行證,這樣服務(wù)器就可以從通行證上確認(rèn)用戶(hù)的信息。通行證就是Cookie
Session和cookie有什么區(qū)別?
從存儲(chǔ)方式上比較
- Cookie只能存儲(chǔ)字符串,如果要存儲(chǔ)非ASCII字符串還要對(duì)其編碼。
- Session可以存儲(chǔ)任何類(lèi)型的數(shù)據(jù),可以把Session看成是一個(gè)容器
從隱私安全上比較
- Cookie存儲(chǔ)在瀏覽器中,對(duì)客戶(hù)端是可見(jiàn)的。信息容易泄露出去。如果使用Cookie,最好將Cookie加密
- Session存儲(chǔ)在服務(wù)器上,對(duì)客戶(hù)端是透明的。不存在敏感信息泄露問(wèn)題。
從有效期上比較
- Cookie保存在硬盤(pán)中,只需要設(shè)置maxAge屬性為比較大的正整數(shù),即使關(guān)閉瀏覽器,Cookie還是存在的
- Session的保存在服務(wù)器中,設(shè)置maxInactiveInterval屬性值來(lái)確定Session的有效期。并且Session依賴(lài)于名為JSESSIONID的Cookie,該Cookie默認(rèn)的maxAge屬性為-1。如果關(guān)閉了瀏覽器,該Session雖然沒(méi)有從服務(wù)器中消亡,但也就失效了。
從對(duì)服務(wù)器的負(fù)擔(dān)比較
- Session是保存在服務(wù)器的,每個(gè)用戶(hù)都會(huì)產(chǎn)生一個(gè)Session,如果是并發(fā)訪問(wèn)的用戶(hù)非常多,是不能使用Session的,Session會(huì)消耗大量的內(nèi)存。
- Cookie是保存在客戶(hù)端的。不占用服務(wù)器的資源。像baidu、Sina這樣的大型網(wǎng)站,一般都是使用Cookie來(lái)進(jìn)行會(huì)話(huà)跟蹤。
從瀏覽器的支持上比較
- 如果瀏覽器禁用了Cookie,那么Cookie是無(wú)用的了!
- 如果瀏覽器禁用了Cookie,Session可以通過(guò)URL地址重寫(xiě)來(lái)進(jìn)行會(huì)話(huà)跟蹤。
從跨域名上比較
- Cookie可以設(shè)置domain屬性來(lái)實(shí)現(xiàn)跨域名
- Session只在當(dāng)前的域名內(nèi)有效,不可夸域名
Servlet安全性問(wèn)題
由于Servlet是單例的,當(dāng)多個(gè)用戶(hù)訪問(wèn)Servlet的時(shí)候,服務(wù)器會(huì)為每個(gè)用戶(hù)創(chuàng)建一個(gè)線程。當(dāng)多個(gè)用戶(hù)并發(fā)訪問(wèn)Servlet共享資源的時(shí)候就會(huì)出現(xiàn)線程安全問(wèn)題。
原則:
如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章的同學(xué),可以關(guān)注微信公眾號(hào):Java3y
總結(jié)
以上是生活随笔為你收集整理的Tomcat+Servlet面试题都在这里的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 别错过校招
- 下一篇: 乔布斯,影响了一个时代的人