PS:以下僅為個人學習筆記
1. Servlet是什么?
sun公司制訂的一種用來擴展web服務器功能的組件規范。 (1)擴展web服務器功能 注: 早期的web服務器只能處理靜態資源的請求,即需要事先將 html文件准備好,並存放到web服務器上面。不能夠處理 動態資源的請求(需要計算,動態生成html)。 早期使用CGI(Common Gateway Interface)應用程序來擴展。 CGI程序使用perl,c/c++等語言來編寫,編寫繁瑣,不方便 移值,性能也不是很好,現在用得很少了。 瀏覽器將請求發送給web server,如果是動態資源的請求, web server會將請求轉交給servlet容器來處理,由容器來 處理網絡相關的問題,由servlet處理業務邏輯。 (2)組件規范 1)什么是組件? 符合規范,實現部分功能,並且需要部署到相應的容器里面才能 運行的軟件模塊。 servlet就是一個組件,需要部署到servlet容器里面才能運行。 2)什么是容器? 符合規范,提供組件運行環境的程序。 servlet容器為servlet提供運行環境。
2.如何寫一個Servlet?
step1. 寫一個java類,實現Servlet接口或者繼承 HttpServlet抽象類。 注:建議繼承HttpServlet抽象類。 step2.編譯。 step3.打包。 創建一個具有如下結構的文件夾: appname (應用名) WEB-INF classes (.class文件) lib (可選 .jar文件) web.xml (部署描述文件) step4.部署。 將step3創建的文件夾拷貝到容器里面。 注: 可以使用jar命令將step3創建的文件夾壓縮成 ".war"結尾的文件,然后再拷貝。 step5.啟動容器,訪問Servlet http://ip:port/appname/servlet-pattern 注: servlet-pattern在web.xml當中定義。
3.Servlet是如何運行的?
比如,在瀏覽器地址欄輸入 http://ip:port/servlet-day01/hello step1.瀏覽器依據ip,port建立連接(即與web服務器之間建立網絡連接)。 step2.瀏覽器需要將相關數據打包(即按照http協議要求,制作一個 請求數據包,包含了一些數據,比如請求資源路徑),並且將請求 數據包發送出去。 step3.web服務器會將請求數據包中數據解析出來,並且將這些數據添加 到request對象,同時,還會創建一個response對象。 step4.web服務器創建Servlet對象,然后調用該對象的service方法 (會將request和response作為參數)。 注: 在service方法里面,通過使用request獲得請求相關的數據, 比如請求參數值,然后將處理結果寫到response。 step5.web服務器將response中的數據取出來,制作響應數據包,然后 發送給瀏覽器。 step6. 瀏覽器解析響應數據包,然后展現。
4. 常見的錯誤
(1)500
注:500是狀態碼,表示系統錯誤。 1)產生的原因: a.web.xml文件配置錯誤。 比如將類名寫錯。 b.源代碼寫錯。 比如,沒有繼承HttpServlet。
(2)404
注:404是狀態碼,表示依據請求路徑找不到對應的資源。 1)產生的原因 a.沒有部署應用 b.訪問地址寫錯
(3)405
注:405是狀態碼,表示找不到處理方法。 1)產生的原因 a.service方法簽名錯誤(方法名,參數類型,異常類型,返回類型寫錯)
5. http協議 (簡述)
(1)什么是http協議?
是一種網絡應用層協議,規定了瀏覽器與web服務器之間如何 通信以及數據包的結構。 1)如何通信? step1. 先建立連接。 step2. 發送請求數據包。 step3. 發送響應數據包。 step4. 關閉連接。 即 一次請求,一次連接。
2) 優點
web服務器可以利用有限的連接為盡可能多的客戶請求服務。

(2)兩種數據包的結構
1)請求數據包 a.請求行 (請求類型 請求資源路徑 協議和版本) b.若干消息頭 注:消息頭是一些鍵值對(鍵和值之間使用": "分隔), 瀏覽器和服務器之間可以利用消息頭傳遞一些特殊的信息。 比如,瀏覽器可以發送"user-agent"告訴服務器,瀏覽器 的類型和版本。 c.實體內容 如果請求類型是get,實體內容為空。 2)響應數據包 a.狀態行 (協議和版本 狀態碼 狀態描述) 注:狀態碼是一個三位數字,表示服務器處理請求的狀態。 b.消息頭 服務器同樣也可以將一些消息頭發送給瀏覽器。比如 可以通過設置content-type消息頭,告訴瀏覽器,服務器 返回的數據類型。 c.實體內容 程序處理的結果。瀏覽器會解析實體內容中的數據,然后 展現。
(3)兩種請求類型
1)get請求 a.哪一些情況下,瀏覽器會發送get請求? a1.直接輸入某個地址 a2.點擊鏈接 a3.表單默認提交方式 b.特點 b1.會將請求參數放到請求行里面,只能提交少量的數據。 注:因為請求行大約只能存放2k左右的數據。 b2.會將請求參數顯示在瀏覽器地址欄,不安全。 注:比如有些網絡設備(路由器)會記錄這些地址。
6. Servlet輸出中文,應該如何處理?
(1)為什么會亂碼?
out在輸出時,默認使用iso-8859-1來編碼。
(2)如何解決?
response.setContentType("text/html;charset=utf-8"); 這行代碼的作用: 作用1.返回content-type消息頭,告訴 瀏覽器,服務器返回的數據類型。 作用2:另外,out在輸出時,會使用指定的 字符集來編碼。 練習: 計算一個人的bmi指數。 算法: bmi指數 = 體重(公斤) / 身高(米) /身高(米) 如果 bmi指數 < 19 過輕。 bmi指數 > 25 過重。 其它,正常。 http://ip:port/servlet-day01-lab/bmi?height=1.8&weight=90 返回 你的bmi指數是 24,正常。