NO.63 servlet基礎(chǔ)

1. Servlet是什么?

sun公司制訂的一種用來擴(kuò)展web服務(wù)器功能的組件規(guī)范。

(1)擴(kuò)展web服務(wù)器功能

注:早期的web服務(wù)器只能處理靜態(tài)資源的請(qǐng)求,即需要事先將html文件準(zhǔn)備好,并存放到web服務(wù)器上面。不能夠處理動(dòng)態(tài)資源的請(qǐng)求(需要計(jì)算,動(dòng)態(tài)生成html)。

早期使用CGI(Common Gateway Interface)應(yīng)用程序來擴(kuò)展。CGI程序使用perl,c/c++等語(yǔ)言來編寫,編寫繁瑣,不方便移值,性能也不是很好,現(xiàn)在用得很少了。

瀏覽器將請(qǐng)求發(fā)送給web server,如果是動(dòng)態(tài)資源的請(qǐng)求,web server會(huì)將請(qǐng)求轉(zhuǎn)交給servlet容器來處理,由容器來處理網(wǎng)絡(luò)相關(guān)的問題,由servlet處理業(yè)務(wù)邏輯。

(2)組件規(guī)范

1)什么是組件?

符合規(guī)范,實(shí)現(xiàn)部分功能,并且需要部署到相應(yīng)的容器里面才能運(yùn)行的軟件模塊。

servlet就是一個(gè)組件,需要部署到servlet容器里面才能運(yùn)行。

2)什么是容器?

符合規(guī)范,提供組件運(yùn)行環(huán)境的程序。

servlet容器為servlet提供運(yùn)行環(huán)境。

2.如何寫一個(gè)Servlet?

step1. 寫一個(gè)java類,實(shí)現(xiàn)Servlet接口或者繼承HttpServlet抽象類。

? 注:建議繼承HttpServlet抽象類。

step2.編譯。

step3.打包。創(chuàng)建一個(gè)具有如下結(jié)構(gòu)的文件夾:

appname? (應(yīng)用名)

WEB-INF

classes? (.class文件)

lib? ? ? (可選? .jar文件)

web.xml? (部署描述文件)

step4.部署。將step3創(chuàng)建的文件夾拷貝到容器里面。

? 注:可以使用jar命令將step3創(chuàng)建的文件夾壓縮成".war"結(jié)尾的文件,然后再拷貝。

step5.啟動(dòng)容器,訪問Servlet----http://ip:port/appname/servlet-pattern

? 注: servlet-pattern在web.xml當(dāng)中定義。

3.Servlet是如何運(yùn)行的?

比如,在瀏覽器地址欄輸入 http://ip:port/servlet-day01/hello

step1.瀏覽器依據(jù)ip,port建立連接(即與web服務(wù)器之間建立網(wǎng)絡(luò)連接)。

step2.瀏覽器需要將相關(guān)數(shù)據(jù)打包(即按照http協(xié)議要求,制作一個(gè)請(qǐng)求數(shù)據(jù)包,包含了一些數(shù)據(jù),比如請(qǐng)求資源路徑),并且將請(qǐng)求數(shù)據(jù)包發(fā)送出去。

step3.web服務(wù)器會(huì)將請(qǐng)求數(shù)據(jù)包中數(shù)據(jù)解析出來,并且將這些數(shù)據(jù)添加到request對(duì)象,同時(shí),還會(huì)創(chuàng)建一個(gè)response對(duì)象。

step4.web服務(wù)器創(chuàng)建Servlet對(duì)象,然后調(diào)用該對(duì)象的service方法(會(huì)將request和response作為參數(shù))。

? 注:在service方法里面,通過使用request獲得請(qǐng)求相關(guān)的數(shù)據(jù),比如請(qǐng)求參數(shù)值,然后將處理結(jié)果寫到response。

step5.web服務(wù)器將response中的數(shù)據(jù)取出來,制作響應(yīng)數(shù)據(jù)包,然后發(fā)送給瀏覽器。

step6. 瀏覽器解析響應(yīng)數(shù)據(jù)包,然后展現(xiàn)。

4. 常見的錯(cuò)誤

(1)500

注:500是狀態(tài)碼,表示系統(tǒng)錯(cuò)誤。

1)產(chǎn)生的原因:

a.web.xml文件配置錯(cuò)誤。比如,將類名寫錯(cuò)。

b.源代碼寫錯(cuò)。比如,沒有繼承HttpServlet。

(2)404

注:404是狀態(tài)碼,表示依據(jù)請(qǐng)求路徑找不到對(duì)應(yīng)的資源。

1)產(chǎn)生的原因

a.沒有部署應(yīng)用

b.訪問地址寫錯(cuò)

(3)405

注:405是狀態(tài)碼,表示找不到處理方法。

1)產(chǎn)生的原因

a.service方法簽名錯(cuò)誤(方法名,參數(shù)類型,異常類型,返回類型寫錯(cuò))

5. http協(xié)議 (了解)

(1)什么是http協(xié)議?

是一種網(wǎng)絡(luò)應(yīng)用層協(xié)議,規(guī)定了瀏覽器與web服務(wù)器之間如何通信以及數(shù)據(jù)包的結(jié)構(gòu)。

1)如何通信?

step1. 先建立連接。

step2. 發(fā)送請(qǐng)求數(shù)據(jù)包。

step3. 發(fā)送響應(yīng)數(shù)據(jù)包。

step4. 關(guān)閉連接。

即 一次請(qǐng)求,一次連接。

2) 優(yōu)點(diǎn)

web服務(wù)器可以利用有限的連接為盡可能多的客戶請(qǐng)求服務(wù)。

(2)兩種數(shù)據(jù)包的結(jié)構(gòu)

1)請(qǐng)求數(shù)據(jù)包

a.請(qǐng)求行? (請(qǐng)求類型 請(qǐng)求資源路徑 協(xié)議和版本)

b.若干消息頭

注:消息頭是一些鍵值對(duì)(鍵和值之間使用": "分隔),瀏覽器和服務(wù)器之間可以利用消息頭傳遞一些特殊的信息。比如,瀏覽器可以發(fā)送"user-agent"告訴服務(wù)器,瀏覽器的類型和版本。

c.實(shí)體內(nèi)容

如果請(qǐng)求類型是get,實(shí)體內(nèi)容為空。

2)響應(yīng)數(shù)據(jù)包

a.狀態(tài)行 (協(xié)議和版本 狀態(tài)碼 狀態(tài)描述)

注:狀態(tài)碼是一個(gè)三位數(shù)字,表示服務(wù)器處理請(qǐng)求的狀態(tài)。

b.消息頭

服務(wù)器同樣也可以將一些消息頭發(fā)送給瀏覽器。比如可以通過設(shè)置content-type消息頭,告訴瀏覽器,服務(wù)器返回的數(shù)據(jù)類型。

c.實(shí)體內(nèi)容

程序處理的結(jié)果。瀏覽器會(huì)解析實(shí)體內(nèi)容中的數(shù)據(jù),然后展現(xiàn)。

(3)兩種請(qǐng)求類型

1)get請(qǐng)求

a.哪一些情況下,瀏覽器會(huì)發(fā)送get請(qǐng)求?

a1.直接輸入某個(gè)地址

a2.點(diǎn)擊鏈接

a3.表單默認(rèn)提交方式

b.特點(diǎn)

b1.會(huì)將請(qǐng)求參數(shù)放到請(qǐng)求行里面,只能提交少量的數(shù)據(jù)。

? 注:因?yàn)檎?qǐng)求行大約只能存放2k左右的數(shù)據(jù)。

b2.會(huì)將請(qǐng)求參數(shù)顯示在瀏覽器地址欄,不安全。

? 注:比如有些網(wǎng)絡(luò)設(shè)備(路由器)會(huì)記錄這些地址。

6. Servlet輸出中文,應(yīng)該如何處理?

(1)為什么會(huì)亂碼?

out在輸出時(shí),默認(rèn)使用iso-8859-1來編碼。

(2)如何解決?

response.setContentType("text/html;charset=utf-8");

這行代碼的作用:

作用1.返回content-type消息頭,告訴瀏覽器,服務(wù)器返回的數(shù)據(jù)類型。

作用2:另外,out在輸出時(shí),會(huì)使用指定的字符集來編碼。


代碼演示:

邏輯代碼
邏輯代碼

部署文件:

部署到服務(wù)器啟動(dòng)效果分別為:

瀏覽器網(wǎng)址欄鍵入http://localhost:8080/servlet-day01/hello?uname=smallNumber


瀏覽器網(wǎng)址欄鍵入http://localhost:8080/servlet-day01/date
最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,796評(píng)論 11 349
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,272評(píng)論 6 342
  • 0 系列目錄# WEB請(qǐng)求處理 WEB請(qǐng)求處理一:瀏覽器請(qǐng)求發(fā)起處理 WEB請(qǐng)求處理二:Nginx請(qǐng)求反向代理 本...
    七寸知架構(gòu)閱讀 14,243評(píng)論 22 189
  • 我們很多時(shí)候都在以節(jié)約之名行浪費(fèi)之實(shí)。為什么這樣說?你看看自己有沒買了沒穿的衣服鞋子很少背的包包?看到便宜的就買買...
    底氣自帶香氣閱讀 274評(píng)論 0 1

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