Java基礎面試題詳解3(拒絕死記硬背八股文)
一、JavaWeb專題
1.HTTP響應碼有哪些
1、1xx(臨時響應) 2、2xx(成功) 3、3xx(重定向):表示要完成請求需要進一步操作 4、4xx(錯誤):表示請求可能出錯,妨礙了服務器的處理
舉例:
200:成功,Web服務器成功處理了客戶端的請求。 301:永久重定向,當客戶端請求一個網(wǎng)址的時候,Web服務器會將當前請求重定向到另一個網(wǎng)址,搜索引擎會抓取重定向后網(wǎng)頁的內(nèi)容并且將舊的網(wǎng)址替換為重定向后的網(wǎng)址。 302:臨時重定向,搜索引擎會抓取重定向后網(wǎng)頁的內(nèi)容而保留舊的網(wǎng)址,因為搜索引擎認為重定向后的網(wǎng)址是暫時的。 400:客戶端請求錯誤,多為參數(shù)不合法導致Web服務器驗參失敗。 404:未找到,Web服務器找不到資源。 500:Web服務器錯誤,服務器處理客戶端請求的時候發(fā)生錯誤。 503:服務不可用,服務器停機。 504:網(wǎng)關超時
2.Forward和Redirect的區(qū)別?
瀏覽器URL地址:Forward是服務器內(nèi)部的重定向,服務器內(nèi)部請求某個servlet,然后獲取響應的內(nèi)容,瀏覽器的URL地址是不會變化的;Redirect是客戶端請求服務器,然后服務器給客戶端返回了一個302狀態(tài)碼和新的location,客戶端重新發(fā)起HTTP請求,服務器給客戶端響應location對應的URL地址,瀏覽器的URL地址發(fā)生了變化。
數(shù)據(jù)的共享:Forward是服務器內(nèi)部的重定向,request在整個重定向過程中是不變的,request中的信息在servlet間是共享的。Redirect發(fā)起了兩次HTTP請求分別使用不同的request。
請求的次數(shù):Forward只有一次請求;Redirect有兩次請求。

3.Get和Post請求的區(qū)別
用途:
get請求用來從服務器獲取資源
post請求用來向服務器提交數(shù)據(jù)
表單的提交方式:
get請求直接將表單數(shù)據(jù)以name1=value1&name2=value2的形式拼接到URL上(http://www.baidu.com/action?name1=value1&name2=value2),多個參數(shù)參數(shù)值需要用&連接起來并且用?拼接到action后面;
post請求將表單數(shù)據(jù)放到請求頭或者請求的消息體中。
傳輸數(shù)據(jù)的大小限制:
get請求傳輸?shù)臄?shù)據(jù)受到URL長度的限制,而URL長度是由瀏覽器決定的;
post請求傳輸數(shù)據(jù)的大小理論上來說是沒有限制的。
參數(shù)的編碼:
get請求的參數(shù)會在地址欄明文顯示,使用URL編碼的文本格式傳遞參數(shù);
post請求使用二進制數(shù)據(jù)多重編碼傳遞參數(shù)。
緩存處理:
get請求可以被瀏覽器緩存被收藏為標簽;
post請求不會被緩存也不能被收藏為標簽
4.介紹下OSI七層和TCP/IP四層的關系
為了更好地促進互聯(lián)網(wǎng)的研究和發(fā)展,國際標準化組織ISO在1985 年指定了網(wǎng)絡互聯(lián)模型。OSI 參考模型(Open System Interconnect Reference
),具有 7 層結構
應用層:各種應用程序協(xié)議,比如HTTP、HTTPS、FTP、SOCKS安全套接字協(xié)議、DNS域名系統(tǒng)、GDP網(wǎng)關發(fā)現(xiàn)協(xié)議等等。 表示層:加密解密、轉(zhuǎn)換翻譯、壓縮解壓縮,比如LPP輕量級表示協(xié)議。 會話層:不同機器上的用戶建立和管理會話,比如SSL安全套接字層協(xié)議、TLS傳輸層安全協(xié)議、RPC遠程過程調(diào)用協(xié)議等等。
傳輸層:接受上一層的數(shù)據(jù),在必要的時候?qū)?shù)據(jù)進行分割,并將這些數(shù)據(jù)交給網(wǎng)絡層,保證這些數(shù)據(jù)段有效到達對端,比如TCP傳輸控制協(xié)議、UDP數(shù)據(jù)報協(xié)議。 網(wǎng)絡層:控制子網(wǎng)的運行:邏輯編址、分組傳輸、路由選擇,比如IP、IPV6、SLIP等等。 數(shù)據(jù)鏈路層:物理尋址,同時將原始比特流轉(zhuǎn)變?yōu)檫壿媯鬏斅肪€,比如XTP壓縮傳輸協(xié)議、PPTP點對點隧道協(xié)議等等。 物理層:機械、電子、定時接口通信信道上的原始比特流傳輸,比如IEEE802.2等等。
而且在消息通信的過程中具體的執(zhí)行流程為:


網(wǎng)絡傳輸?shù)臄?shù)據(jù)其實會通過這七層協(xié)議來進行數(shù)據(jù)的封裝和拆解
5.說說TCP和UDP的區(qū)別
1、TCP面向連接(如打電話要先撥號建立連接):UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接。 2、TCP提供可靠的服務。也就是說,通過TCP連接傳送的數(shù)據(jù),無差錯,不丟失,不重復,且按序到達;UDP盡最大努力交付,即不保證可靠交付。tcp通過校驗和,重傳控制,序號標識,滑動窗口、確認應答實現(xiàn)可靠傳輸。如丟包時的重發(fā)控制,還可以對次序亂掉的分包進行順序控制。 3、UDP具有較好的實時性,工作效率比TCP高,適用于對高速傳輸和實時性有較高的通信或廣播通信。 4.每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
5、TCP對系統(tǒng)資源要求較多,UDP對系統(tǒng)資源要求較少。
6. 說下HTTP和HTTPS的區(qū)別
端口不同:HTTP和HTTPS的連接方式不同沒用的端口也不一樣,HTTP是80,HTTPS用的是443 消耗資源:和HTTP相比,HTTPS通信會因為加解密的處理消耗更多的CPU和內(nèi)存資源。 開銷:HTTPS通信需要證書,這類證書通常需要向認證機構申請或者付費購買。
7.說下HTTP、TCP、Socket的關系是什么?
TCP/IP代表傳輸控制協(xié)議/網(wǎng)際協(xié)議,指的是一系列協(xié)議族。
HTTP本身就是一個協(xié)議,是從Web服務器傳輸超文本到本地瀏覽器的傳送協(xié)議。
Socket是TCP/IP網(wǎng)絡的API,其實就是一個門面模式,它把復雜的TCP/IP協(xié)議族隱藏在Socket接口后面。對用戶來說,一組簡單的接口就是全部,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議。
綜上所述:
需要IP協(xié)議來連接網(wǎng)絡
TCP是一種允許我們安全傳輸數(shù)據(jù)的機制,使用TCP協(xié)議來傳輸數(shù)據(jù)的HTTP是Web服務器和客戶端使用的特殊協(xié)議。
HTTP基于TCP協(xié)議,所以可以使用Socket去建立一個TCP連接。
8. 說下HTTP的長鏈接和短連接的區(qū)別
HTTP協(xié)議的長連接和短連接,實質(zhì)上是TCP協(xié)議的長連接和短連接。
短連接 ??在HTTP/1.0中默認使用短鏈接,也就是說,瀏覽器和服務器每進行一次HTTP操作,就建立一次連接,但任務結束就中斷連接。如果客戶端訪問的某個HTML或其他類型的Web資源,如JavaScript文件、圖像文件、CSS文件等。當瀏覽器每遇到這樣一個Web資源,就會建立一個HTTP會話. 長連接 ??從HTTP/1.1起,默認使用長連接,用以保持連接特性。在使用長連接的情況下,當一個網(wǎng)頁打開完成后,客戶端和服務器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會關閉。如果客戶端再次訪問這個服務器上的網(wǎng)頁,會繼續(xù)使用這一條已經(jīng)建立的連接。Keep-Alive不會永久保持連接,它有一個保持時間,可以在不同的服務器軟件(如Apache)中設定這個時間。
9.TCP原理

三次握手:
1.第一次握手:客戶端將標志位syn重置為1,隨機產(chǎn)生seq=a,并將數(shù)據(jù)包發(fā)送給服務端 2.第二次握手:服務端收到syn=1知道客戶端請求連接,服務端將syn和ACK都重置為1,ack=a+1,隨機產(chǎn)一個值seq=b,并將數(shù)據(jù)包發(fā)送給客戶端,服務端進入syn_RCVD狀態(tài)。 3.第三次握手:客戶端收到確認后,檢查ack是否為a+1,ACK是否為1,若正確將ACK重置為1,將ack改為b+1,然后將數(shù)據(jù)包發(fā)送給服務端服務端檢查ack與ACK,若都正確,就建立連接,進入ESTABLISHEN.
四次揮手:
1.開始雙方都處于連接狀態(tài) 2.客戶端進程發(fā)出FIN報文,并停止發(fā)送數(shù)據(jù),在報文中FIN結束標志為1,seq為a連接狀態(tài)下發(fā)送給服務器的最后一個字節(jié)的序號+1,報文發(fā)送結束后,客戶端進入FIN-WIT1狀態(tài)。 3.服務端收到報文,向客戶端發(fā)送確認報文,ACK=1,seq為b服務端給客戶端發(fā)送的最后字節(jié)的序號+1,ack=a+1,發(fā)送后客戶端進入close-wait狀態(tài),不再發(fā)送數(shù)據(jù),但服務端發(fā)送數(shù)據(jù)客戶端一九可以收到(城為半關閉狀態(tài))。 4.客戶端收到服務器的確認報文后,客戶端進入fin-wait2狀態(tài)進行等待服務器發(fā)送第三次的揮手報文。 5.服務端向fin報文FIN=1ACK=1,seq=c(服務器向客戶端發(fā)送最后一個字節(jié)序號+1),ack=b+1,發(fā)送結束后服務器進入last-ack狀態(tài)等待最后的確認。 6.客戶端收到是釋放報文后,向服務器發(fā)送確認報文進入time-wait狀態(tài),后進入close 7.服務端收到確認報文進入close狀態(tài)。
10. Cookie和Session的區(qū)別
??cookie是由Web服務器保存在用戶瀏覽器上的文件(key-value格式),可以包含用戶相關的信息??蛻舳讼蚍掌靼l(fā)起請求,就提取瀏覽器中的用戶信息由http發(fā)送給服務器
??session是瀏覽器和服務器會話過程中,服務器會分配的一塊儲存空間給session。服務器默認為客戶瀏覽器的cookie中設置sessionid,這個sessionid就和cookie對應,瀏覽器在向服務器請求過程中傳輸?shù)腸ookie包含sessionid,服務器根據(jù)傳輸cookie中的sessionid獲取出會話中存儲的信息,然后確定會話的身份信息。
1、Cookie數(shù)據(jù)存放在客戶端上,安全性較差,Session數(shù)據(jù)放在服務器上,安全性相對更高 2、單個cookie保存的數(shù)據(jù)不能超過4K,session無此限制 3、session一定時間內(nèi)保存在服務器上,當訪問增多,占用服務器性能,考慮到服務器性能方面,應當 使用cookie。
11.Tomcat是什么?
Tomcat服務器Apache軟件基金會項目中的一個核心項目,是一個免費的開放源代碼的Web應用服 務器(Servlet容器),屬于輕量級應用服務器,在中小型系統(tǒng)和并發(fā)訪問用戶不是很多的場合下被 普遍使用,是開發(fā)和調(diào)試JSP程序的首選。

12.Tomcat有幾種部署方式
利用Tomcat的自動部署:把web應用拷貝到webapps目錄(生產(chǎn)環(huán)境不建議放在該目錄中)。Tomcat在啟動時會加載目錄下的應用,并將編譯后的結果放入work目錄下。
使用Manager App控制臺部署:在tomcat主頁點擊“Manager App”進入應用管理控制臺,可以指定一個web應用的路徑或war文件。
修改conf/server.xml文件部署:在server.xml文件中,增加Context節(jié)點可以部署應用。
增加自定義的Web部署文件:在conf/Catalina/localhost/路徑下增加xyz.xml文件,內(nèi)容是Context節(jié)點,可以部署應用。
13.什么是Servlet
??Servlet是JavaEE規(guī)范的一種,主要是為了擴展Java作為Web服務的功能,統(tǒng)一接口。由其他內(nèi)部廠 商如tomcat,jetty內(nèi)部實現(xiàn)web的功能。如一個http請求到來:容器將請求封裝為servlet中的 HttpServletRequest對象,調(diào)用init(),service()等方法輸出response,由容器包裝為httpresponse 返回給客戶端的過程。

14. 什么是Servlet規(guī)范?
從Jar包上來說,Servlet規(guī)范就是兩個Jar文件。servlet-api.jar和jsp-api.jar,Jsp也是一種Servlet。
從package上來說,就是javax.servlet和javax.servlet.http兩個包。
從接口來說,就是規(guī)范了Servlet接口、Filter接口、Listener接口、ServletRequest接口、ServletResponse接口等。類圖如下:

15.為什么我們將tomcat稱為Web容器或者Servlet容器?
我們用一張圖來表示他們之間的關系:

簡單的理解:啟動一個ServerSocket,監(jiān)聽8080端口。Servlet容器用來裝我們開發(fā)的Servlet。
16.Servlet的生命周期

17. jsp和Servlet的區(qū)別
本質(zhì)都是servlet
servlet側(cè)重于邏輯處理
jsp側(cè)重于視圖顯示
18. 九大內(nèi)置對象
page頁面對象
config配置對象
request請求對象
response響應對象
session會話對象
application全局對象
out輸出對象
pageContext頁面上下文對象
exception異常對象
19. JSP的四大作用域
page:
只在當前頁面有效
request:
它在當前請求中有效
session:
它在當前會話中有效
application:
他在所有的應用程序中都有效
注意:當4個作用域?qū)ο蠖加邢嗤膎ame屬性時,默認按照最小的順序查找
20. GenericServlet和HttpServlet有什么區(qū)別?
GenericServlet 為抽象類,定義了一個通用的、獨立于底層協(xié)議的servlet,實現(xiàn)了Servlet 和 ServletConfig接口,ServletConfig接口定義了在Servlet初始化的過程中由Servlet容器傳遞給Servlet得配置信息對象。OK,這個類可能我們不是那么熟悉,但是他的子類相信大家都知道,也就是HttpServlet,HttpServlet 繼承自抽象類GenericServlet 具有其所有的特性并拓展了一些其他的方法,如doGet、doPost等