1、http
(1)什么是http?http協(xié)議的特點(diǎn)?http的數(shù)據(jù)包有哪幾部分組成?
http超文本傳輸協(xié)議,是應(yīng)用層的一個網(wǎng)絡(luò)協(xié)議。設(shè)計HTTP最初的目的是為 了提供一種發(fā)布和接收HTML頁面的方法
特點(diǎn)是:
短鏈接:是客戶端主動發(fā)送請求,服務(wù)器作出響應(yīng),服務(wù)器響應(yīng)之后,連接斷開。
單向連接:服務(wù)器不能主動向客戶端發(fā)送數(shù)據(jù)。

HTTP請求報文:

一個HTTP請求報文有請求行、請求頭、空行和請求數(shù)據(jù)4個部分組成。
請求行中規(guī)定了請求的方式(get/post),請求資源(url),請求的http協(xié)議版本
請求頭主要是客戶端發(fā)送給服務(wù)器端的一些信息,使用鍵值對表示key:value。常見的有cookie頭,存儲cookie信息,user-agent,表明客戶端信息。


HTTP響應(yīng)報文:

http響應(yīng)由三部分:響應(yīng)行,響應(yīng)頭,響應(yīng)體
響應(yīng)行組成:服務(wù)器協(xié)議版本、狀態(tài)碼、狀態(tài)描述。
狀態(tài)碼:
常用的狀態(tài)碼如下:
200 :請求成功。
302 :請求重定向。
304 :請求資源沒有改變,訪問本地緩存。
403:禁止訪問
404 :請求資源不存在。通常是用戶路徑編寫錯誤,也可能是服務(wù)器資源已刪除。
500 :服務(wù)器內(nèi)部錯誤。通常程序拋異常。【一般以2開頭的代表成功,以3開頭的代表重定向,4開頭的代表客戶端錯誤,5開頭的錯誤代表服務(wù)器端的錯誤】
狀態(tài)信息:狀態(tài)信息是根據(jù)狀態(tài)碼變化而變化的
響應(yīng)頭:響應(yīng)也都是鍵值對形式,服務(wù)器端將信息以鍵值對的形式返回給客戶端

響應(yīng)體
響應(yīng)體是服務(wù)器回寫給客戶端的頁面正文,瀏覽器將正文加載到內(nèi)存,然后解析渲染 顯示頁面內(nèi)容
HTTPS
HTTPS是安全超文本傳輸協(xié)議,是一個安全通信通道,基于http開發(fā),用于在客戶計算和服務(wù)器之間的交換信息。使用安全套接字層(SSI)進(jìn)行信息交換,簡單來說是http的安全版本。
2、請求方式
常用的請求方式是get、POST。但是還有options、head、put、delete、trace,一般很少用。
GET請求:參數(shù)在地址后拼接,請求數(shù)據(jù)區(qū)沒有請求數(shù)據(jù),不安全(因?yàn)樗械膮?shù)都拼接在地址后面),不適合傳輸大量數(shù)據(jù)(長度有限制)
POST請求:參數(shù)在請求數(shù)據(jù)區(qū)放著,相對get請求更安全,并且數(shù)據(jù)大小沒有限制,一般上傳文件使用。

3、什么是servlet?
{Servlet是什么?【一個普通的Java類,運(yùn)行在服務(wù)器端的Java代碼】
Servlet直意來說就是服務(wù)器端的一個小程序。其實(shí)是sun公司提供的一套規(guī)范,用來處理客戶端請求,響應(yīng)給瀏覽器的動態(tài)資源【作用】。其中包含三大組件:servlet技術(shù)、filter技術(shù)【過濾器】、listener技術(shù)【監(jiān)聽器】


【在springMVC中,“一個中心,三大組件”中的一個中心就是前端控制器(DispatcherServlet),需要在web.xml中進(jìn)行配置】
4、闡述servlet和CGI的區(qū)別
Servlet與CGI的區(qū)別在于Servlet處于服務(wù)器進(jìn)程中,它通過多線程方式運(yùn)行其service()方法,一個實(shí)例可以服務(wù)于多個請求,并且其實(shí)例一般不會銷毀,而CGI對每個請求都產(chǎn)生新的進(jìn)程,服務(wù)完成后就銷毀,所以效率上低于Servlet。
5、servlet生命周期?
Servlet的生命周期(面試題)
【servlet對象的生命周期介紹:生命周期就是何時創(chuàng)建何時銷毀,
servlet對象默認(rèn)第一次訪問的時候創(chuàng)建,服務(wù)器關(guān)閉的時候銷毀。
當(dāng)這個servlet對象創(chuàng)建的時候會調(diào)用init方法,
當(dāng)這個對象銷毀的時候調(diào)用destroy方法,
每次訪問servlet時都會調(diào)用service方法】
1)Servlet何時創(chuàng)建
默認(rèn)第一次訪問servlet時創(chuàng)建該對象【強(qiáng)調(diào)默認(rèn),因?yàn)榭梢酝ㄟ^配置使servlet不是第一次訪問時創(chuàng)建,讓服務(wù)器一啟動就創(chuàng)建】【問,如何設(shè)置服務(wù)器一啟動就創(chuàng)建servlet】
2)Servlet何時銷毀
服務(wù)器關(guān)閉servlet就銷毀了【servlet對象在tomcat服務(wù)器開辟的內(nèi)存中,servlet銷毀也就是把servlet對象在內(nèi)存中干掉,服務(wù)器已關(guān)閉,開辟的內(nèi)存也就沒有了,所以servlet就銷毀了】
3)每次訪問必然執(zhí)行的方法
service(ServletRequest req, ServletResponse res)方法
6、Servlet接口中有哪些方法?

7、HttpServlet類中有哪些方法?誰調(diào)用了doPost()、doGet()方法?doPost()、doGet()方法分別在什么時候使用?
6.1
但在實(shí)際開發(fā)中,我們不會直接去實(shí)現(xiàn)Servlet接口,因?yàn)槟菢有枰采w的方法太多, 我們一般創(chuàng)建類繼承HttpServlet
實(shí)現(xiàn)步驟:
1)創(chuàng)建類繼承HttpServlet類
2)覆蓋doGet和doPost
3)在web.xml中進(jìn)行servlet的配置
創(chuàng)建類繼承HttpServlet,HttpServlet繼承GenericServlet,而GenericServlet實(shí)現(xiàn)Servlet接口,所以我們可以用繼承HttpServlet來創(chuàng)建一個Servlet。

HttpServlet重寫service()方法
HttpServlet重寫service()方法:
1.在該方法中先將ServletRequest和ServletResponse
強(qiáng)轉(zhuǎn)為了HttpServletRequest和HttpServletResponse。
2.然后調(diào)用重載的service()方法,并將剛剛強(qiáng)轉(zhuǎn)得到對象傳遞到重載的方法中。

重載service(HttpServletRequest request , HttpServletResponse response)
1.在方法中獲取請求的方式(get或post)
2.在根據(jù)不同的請求方式去調(diào)用不同的方法:
如果是GET請求,則調(diào)用doGet(HttpServletRequest request , HttpServletResponse response)
如果是post請求,則調(diào)用doPost(HttpServletRequest request , HttpServletResponse response)

結(jié)論:
當(dāng)通過繼承HttpServlet來創(chuàng)建一個Servlet時,我們只需要根據(jù)要處理的請求的類型,來重寫不同的方法。
處理get請求,則重寫doGet()
處理post請求,則重寫doPost()
綜上我們來總結(jié)最后答案:
1、HttpServlet類中有哪些方法?
a)重寫的service(ServletRequest req,ServletResponse res)方法
【1、在該方法中先將ServletRequest和ServletResponse強(qiáng)轉(zhuǎn)為了HttpServletRequest和HttpServletResponse;2、然后調(diào)用重載的service()方法,并將剛剛強(qiáng)轉(zhuǎn)得到對象傳遞到重載的方法中】
b) 重載的service(HttpServletRequest request , HttpServletResponse response)方法
【 1.在方法中獲取請求的方式(get或post)
2.在根據(jù)不同的請求方式去調(diào)用不同的方法:
如果是GET請求,則調(diào)用doGet(HttpServletRequest request , HttpServletResponse response)
如果是post請求,則調(diào)用doPost(HttpServletRequest request , HttpServletResponse response)】
c) init()方法
d) doGet(HttpServletRequest request,HttpServletResponse response)方法
e)doPost(HttpServletRequest request,HttpServletResponse response)方法
f) destroy()方法
2、誰調(diào)用了doPost()、doGet()方法?
HttpServlet類中的重載的service(HttpServletRequest request,HttpServletResponse response)中會調(diào)用這兩個方法
3、doPost()、doGet()方法分別在什么時候使用
處理get請求,則重寫doGet()
處理post請求,則重寫doPost()
8、web.xml中的配置
5.1 web.xml配置詳解
1、啟動一個WEB項(xiàng)目的時候,WEB容器會去讀取它的配置文件web.xml,讀取<listener>和<context-param>兩個結(jié)點(diǎn)。
2、緊接著,容創(chuàng)建一個ServletContext(servlet上下文),這個web項(xiàng)目的所有部分都將共享這個上下文。
3、容器將<context-param>轉(zhuǎn)換為鍵值對,并交給servletContext。
4、容器創(chuàng)建<listener>中的類實(shí)例,創(chuàng)建監(jiān)聽器。
5.2 web.xml配置
1、配置監(jiān)聽器

3、配置servlet【springMVC的前端控制器就是在這配置的】
servlet基本配置:
【客戶端發(fā)送http請求(內(nèi)部有請求頭請求體)到服務(wù)器,服務(wù)器接收之后會分析我的請求,服務(wù)器會根據(jù)請求地址查找配置文件web.xml,根據(jù)servlet虛擬路徑配置找到servlet的類的全包名,<servlet-class>
com.itheima.servlet.QuickStratServlet</servlet-class>
根據(jù)全包名找到對應(yīng)的servlet類,調(diào)用類中的service方法】

其中url-pattern的配置方式:
1)完全匹配 訪問的資源與配置的資源完全相同才能訪問到

2)目錄匹配 格式:/虛擬的目錄../* 代表任意
【表示的是只要是訪問的aaa/bbb/ccc下邊的任何資源都能夠訪問到我們這個東西】

3)擴(kuò)展名匹配 格式:.擴(kuò)展名


9、轉(zhuǎn)發(fā)和重定向的區(qū)別?
什么是重定向?
【重定向敘述:客戶端發(fā)送請求,服務(wù)器端對應(yīng)的servlet做出業(yè)務(wù)邏輯處理,但是所訪問的這個servlet中沒有請求想要的資源,這個時候所訪問的這個servlet會調(diào)用response.sendReadirect()方法,把要訪問的目標(biāo)資源作為response響應(yīng)頭信息發(fā)送給客戶端瀏覽器??蛻舳藶g覽器根據(jù)響應(yīng)的結(jié)果重新訪問服務(wù)器資源,服務(wù)器再次對客戶端作出響應(yīng)】【這個servlet怎么知道目標(biāo)資源在何處?】
【
重定向有哪些特點(diǎn):
1、客戶端從服務(wù)器拿到資源的過程一共訪問兩次服務(wù)器。
2、第一次訪問時人為訪問,第二次是自動訪問,客戶端地址欄地址已經(jīng)發(fā)生變化】

這邊是客戶端,那邊是服務(wù)器端。服務(wù)器端servlet資源很多,客戶端通過http請求去訪問服務(wù)器端的資源,訪問到其中一個servlet資源要資源,但是這個servlet資源沒有請求想要的資源,但是這個servlet資源告訴客戶端雖然我沒有這個資源但是另外一個servlet資源有想要的資源,這個時候客戶端會去訪問有它想要資源的那個servlet】
重定向有哪些特點(diǎn):
1、客戶端從服務(wù)器拿到資源的過程訪問服務(wù)器一共訪問兩次。
2、第一次訪問時人為訪問,第二次是自動訪問,客戶端地址欄地址已經(jīng)發(fā)生變化
request完成請求轉(zhuǎn)發(fā)
【轉(zhuǎn)發(fā)概述:客戶端發(fā)送請求,服務(wù)器端servlet作出業(yè)務(wù)邏輯處理。此時servlet會調(diào)用forword()方法,服務(wù)器servlet把目標(biāo)資源返回給客戶端瀏覽器】


【注意:轉(zhuǎn)發(fā)與重定向的區(qū)別?
1)客戶端從服務(wù)器端拿到資源的過程中,重定向兩次請求兩次訪問服務(wù)器,轉(zhuǎn)發(fā)一次請求訪問服務(wù)器一次
2)客戶端從服務(wù)器端拿到資源的過程中,重定向地址欄的地址變化,轉(zhuǎn)發(fā)地址不變
3)重新定向可以訪問外部網(wǎng)站 轉(zhuǎn)發(fā)只能訪問內(nèi)部資源
4)轉(zhuǎn)發(fā)的性能要優(yōu)于重定向】
request.getRequestDispatcher()是容器中控制權(quán)的轉(zhuǎn)向,在客戶端瀏覽器地址欄中不會顯示出轉(zhuǎn)向后的地址;服務(wù)器內(nèi)部轉(zhuǎn)發(fā),整個過程處于同一個請求當(dāng)中。response.sendRedirect()則是完全的跳轉(zhuǎn),瀏覽器將會得到跳轉(zhuǎn)的地址,并重新發(fā)送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的鏈接地址。不在同一個請求。重定向,實(shí)際上客戶端會向服務(wù)器端發(fā)送兩個請求。
所以轉(zhuǎn)發(fā)中數(shù)據(jù)的存取可以用request作用域:request.setAttribute(), request.getAttribute(),重定向是取不到request中的數(shù)據(jù)的。只能用session。
重定向可以跨域訪問,而轉(zhuǎn)發(fā)是在web服務(wù)器內(nèi)部進(jìn)行的,不能跨域訪問。
10、JSP有哪些內(nèi)置對象?作用分別是什么?

9大內(nèi)置對象:
pageContext【當(dāng)前jsp頁面中】 :JSP頁面容器
Request【一次請求中】 得到用戶請求信息
Session【一次會話】 :用來保存用戶信息
application(ServletContext)【整個web應(yīng)用中】:所有用戶的共享信息
response:服務(wù)器向客戶端回應(yīng)信息
***************
out:用于頁面輸出
exception:表示JSP頁面所發(fā)生的異常,在錯誤的頁面中才起作用
page:指當(dāng)前頁面轉(zhuǎn)換后的servlet類的實(shí)例
config:服務(wù)器配置??梢匀〉贸跏蓟瘏?shù)
11、講解JSP中的四種作用域。




【如何確認(rèn)服務(wù)器端是否有該客戶端的session區(qū)域】
(1)ServletContext對象





12、JSP和Servlet是什么關(guān)系?
Servlet
{Servlet是什么?【一個普通的Java類,運(yùn)行在服務(wù)器端的Java代碼】
Servlet直意來說就是服務(wù)器端的一個小程序。其實(shí)是sun公司提供的一套規(guī)范,用來處理客戶端請求,響應(yīng)給瀏覽器的動態(tài)資源【作用】。其中包含三大組件:servlet技術(shù)、filter技術(shù)【過濾器】、listener技術(shù)【監(jiān)聽器】
}
JSP:
JSP叫Java服務(wù)器頁面,是一種動態(tài)頁面設(shè)計,它的主要目的是將表示邏輯從servlet中分離出來。
其根本就是一個簡化的servlet設(shè)計。

servlet技術(shù)擅長編寫Java代碼。
實(shí)際開發(fā)過程中就是結(jié)合著jsp技術(shù)和servlet技術(shù)一起使用。
jsp運(yùn)行原理-----jsp本質(zhì)就是servlet(面試JSP的運(yùn)行過程)
【當(dāng)我們訪問服務(wù)端某個jsp文件時,這個jsp如果是第一次訪問的話它會去tomcat容器下的work文件下找,看有沒有和它對應(yīng)的servlet Java文件,如果有就直接用此Java文件進(jìn)行響應(yīng),沒有的話就將這個jsp文件翻譯成相應(yīng)的servlet Java文件】
jsp在第一次被訪問時會被Web容器翻譯成servlet,在執(zhí)行
過程:(服務(wù)器做的)
第一次訪問---->helloServlet.jsp---->helloServlet_jsp.java---->編譯運(yùn)行
PS:被翻譯后的servlet在Tomcat的work目錄中可以找到
13、靜態(tài)包含與動態(tài)包含的區(qū)別

靜態(tài)包含:將被包含的頁面引入合成一個jsp文件,然后再編譯運(yùn)行?!就ㄟ^jsp的include指令完成

】
動態(tài)包含:運(yùn)行一個jsp文件,編譯運(yùn)行后需要另一個jsp文件,就會去找這個頁面,然后被引入的頁面進(jìn)行編譯運(yùn)行后加入頁面中【通過jsp標(biāo)簽完成
】
區(qū)別:動態(tài)包含只在運(yùn)行的階段,輸出的內(nèi)容合并在一起。靜態(tài)包含是起初把內(nèi)容合并在一起然后編譯運(yùn)行。表面看,動態(tài)包含有兩個Java文件,靜態(tài)包含有一個Java文件
14、說一下表達(dá)式語言(EL)的隱式對象及其作用。(簡單了解,記住一兩個即可)

15、表達(dá)式語言(EL)支持哪些運(yùn)算符?

16、你的項(xiàng)目中使用過哪些JSTL標(biāo)簽?
項(xiàng)目中主要使用了JSTL的核心標(biāo)簽庫,包括<c:if>、<c:choose>、<c: when>、<c: otherwise>、<c:forEach>等,主要用于構(gòu)造循環(huán)和分支結(jié)構(gòu)以控制顯示邏輯。
17、使用標(biāo)簽庫有什么好處?如何自定義JSP標(biāo)簽?
使用標(biāo)簽庫的好處包括以下幾個方面:
- 分離JSP頁面的內(nèi)容和邏輯,簡化了Web開發(fā);
- 開發(fā)者可以創(chuàng)建自定義標(biāo)簽來封裝業(yè)務(wù)邏輯和顯示邏輯;
- 標(biāo)簽具有很好的可移植性、可維護(hù)性和可重用性;
- 避免了對Scriptlet(小腳本)的使用(很多公司的項(xiàng)目開發(fā)都不允許在JSP中書寫小腳本)
18、Servlet中如何獲取用戶提交的查詢參數(shù)或表單數(shù)據(jù)?
可以通過請求對象(HttpServletRequest)的getParameter()方法通過參數(shù)名獲得參數(shù)值。如果有包含多個值的參數(shù)(例如復(fù)選框),可以通過請求對象的getParameterValues()方法獲得。當(dāng)然也可以通過請求對象的getParameterMap()獲得一個參數(shù)名和參數(shù)值的映射(Map)。
19、Servlet中如何獲取用戶配置的初始化參數(shù)以及服務(wù)器上下文參數(shù)?
可以通過重寫Servlet接口的init(ServletConfig)方法并通過ServletConfig對象的getInitParameter()方法來獲取Servlet的初始化參數(shù)。
可以通過ServletConfig對象的getServletContext()方法獲取ServletContext對象,并通過該對象的getInitParameter()方法來獲取服務(wù)器上下文參數(shù)。當(dāng)然,ServletContext對象也可以在處理用戶請求的方法(如doGet()方法)中通過請求對象的getServletContext()方法來獲得。
20、如何設(shè)置請求的編碼以及響應(yīng)內(nèi)容的類型?
通過請求對象(ServletRequest)的setCharacterEncoding(String)方法可以設(shè)置請求的編碼,其實(shí)要徹底解決亂碼問題就應(yīng)該讓頁面、服務(wù)器、請求和響應(yīng)、Java程序都使用統(tǒng)一的編碼,最好的選擇當(dāng)然是UTF-8;通過響應(yīng)對象(ServletResponse)的setContentType(String)方法可以設(shè)置響應(yīng)內(nèi)容的類型,當(dāng)然也可以通過HttpServletResponse對象的setHeader(String, String)方法來設(shè)置。
21、常用的Web服務(wù)器有哪些?
經(jīng)過系統(tǒng)的學(xué)習(xí)web服務(wù)器,現(xiàn)在知道常用的web服務(wù)器的優(yōu)缺點(diǎn),這對搭建網(wǎng)站架構(gòu)時選擇使用web服務(wù)器很有幫助,現(xiàn)在我簡單總結(jié)一下:
1. Apache:屬于重量級web服務(wù)器(重量級主要是在軟件包的大小上比較大,軟件的耦合度大),但是速度、性能不及其他輕量級web服務(wù)器,并且消費(fèi)內(nèi)存較高。使用傳統(tǒng)的select模型,比較穩(wěn)定的Prefork模式為多進(jìn)程模式,需要經(jīng)常派生子進(jìn)程。所以消耗的cpu等服務(wù)器資源比較大。
2. Lighttpd:輕量級web服務(wù)器,cpu占用低,效能好,模塊豐富。
3. Tomcat:運(yùn)行:Servlet和Jsp web的應(yīng)用軟件的容器,靜態(tài)和高并發(fā)處理弱。
4. Nginx:輕量級,高性能http和反向代理服務(wù)器。高并發(fā)連接達(dá)到2-4萬個,內(nèi)存、cpu等系統(tǒng)資源消耗低。Rewrite重寫規(guī)則(根據(jù)域名,URL的不同將HTTP請求分到不同的后端服務(wù)器群組),內(nèi)置的健康檢查功能(Nginx Proxy 后端的某臺web服務(wù)器宕機(jī)也不會影響前端訪問),節(jié)省帶寬(支持GZIP壓縮,可以添加瀏覽器本地緩存的Header頭)。
22、getAttribute與getParameter的區(qū)別
這部分是對JSP的擴(kuò)展,經(jīng)常在JSP或者Servlet中獲取數(shù)據(jù),那么getAttribute與getParameter有什么區(qū)別呢?
1 從獲取到數(shù)據(jù)的來源來說:
getAttribtue獲取到的是web容器中的值,比如:
我們在Servlet中通過setAttribute設(shè)定某個值,這個值存在于容器中,就可以通過getAttribute方法獲?。?/p>
getParameter獲取到的是通過http傳來的值,比如這樣一個http請求:
http:localhost:8080/test/test.html?username=xingoo
還有其他的GET和POST方式,都可以通過getParameter來獲取。
2 從獲取到的數(shù)據(jù)類型來說:
getAttribute返回的是一個對象,Object。
getParameter返回的是,前面頁面中某個表單或者h(yuǎn)ttp后面參數(shù)傳遞的值,是個字符串。