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)效果分別為:

