下面是我整理下來(lái)的Servlet知識(shí)點(diǎn):
圖上的知識(shí)點(diǎn)都可以在我其他的文章內(nèi)找到相應(yīng)內(nèi)容。
Tomcat常見(jiàn)面試題
Tomcat的缺省端口是多少,怎么修改
Tomcat的缺省端口是多少,怎么修改
- 找到Tomcat目錄下的conf文件夾
- 進(jìn)入conf文件夾里面找到server.xml文件
- 打開(kāi)server.xml文件
- 在server.xml文件里面找到下列信息
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
- 把port=”8080″改成port=”8888″,并且保存
- 啟動(dòng)Tomcat,并且在IE瀏覽器里面的地址欄輸入http://127.0.0.1:8888/
到tomcat主目錄下的conf/server.xml文件中修改,把8080端口改成是8088或者是其他的

Tomcat 有哪幾種Connector 運(yùn)行模式(優(yōu)化)?
tomcat 有哪幾種Connector 運(yùn)行模式(優(yōu)化)?
- bio(blocking I/O)
- nio(non-blocking I/O)
- 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有幾種部署方式
- 直接把Web項(xiàng)目放在webapps下,Tomcat會(huì)自動(dòng)將其部署
- 在server.xml文件上配置
<Context>節(jié)點(diǎn),設(shè)置相關(guān)的屬性即可 - 通過(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文件。

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

- 在server.xml中的節(jié)點(diǎn)下添加如下代碼。path表示的是訪問(wèn)時(shí)輸入的web項(xiàng)目名,docBase表示的是站點(diǎn)目錄的絕對(duì)路徑
<Context path="/web1" docBase="D:\web1"/>

- 訪問(wèn)配置好的web站點(diǎn)

部署方式第三點(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資源
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è)步驟
- 加載Servlet。當(dāng)Tomcat第一次訪問(wèn)Servlet的時(shí)候,Tomcat會(huì)負(fù)責(zé)創(chuàng)建Servlet的實(shí)例
- 初始化。當(dāng)Servlet被實(shí)例化后,Tomcat會(huì)調(diào)用init()方法初始化這個(gè)對(duì)象
- 處理服務(wù)。當(dāng)瀏覽器訪問(wèn)Servlet的時(shí)候,Servlet 會(huì)調(diào)用service()方法處理請(qǐng)求
- 銷毀。當(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)銷毀
- 卸載。當(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ù)是什么
HttpServletRequest:封裝了與請(qǐng)求相關(guān)的信息
-
HttpServletResponse:封裝了與響應(yīng)相關(guān)的信息
image
獲取頁(yè)面的元素的值有幾種方式,分別說(shuō)一下
- request.getParameter() 返回客戶端的請(qǐng)求參數(shù)的值
- request.getParameterNames() 返回所有可用屬性名的枚舉
- 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)景:
- 轉(zhuǎn)發(fā): 訪問(wèn) Servlet 處理業(yè)務(wù)邏輯,然后 forward 到 jsp 顯示處理結(jié)果,瀏覽器里 URL 不變
- 重定向: 提交表單,處理成功后 redirect 到另一個(gè) jsp,防止表單重復(fù)提交,瀏覽器里 URL 變了
tomcat容器是如何創(chuàng)建servlet類實(shí)例?用到了什么原理?
tomcat容器是如何創(chuàng)建servlet類實(shí)例?用到了什么原理
- 當(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í)例化)
- 在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

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)題。
原則:
- 如果一個(gè)變量需要多個(gè)用戶共享,則應(yīng)當(dāng)在訪問(wèn)該變量的時(shí)候,加同步機(jī)制synchronized (對(duì)象){}
- 如果一個(gè)變量不需要共享,則直接在 doGet() 或者 doPost()定義.這樣不會(huì)存在線程安全問(wèn)題
如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章的同學(xué),可以關(guān)注微信公眾號(hào):Java3y
