什麼是Serlvet?
Servlet其實就是一個遵循Servlet開發的java類。Serlvet是由伺服器呼叫的,執行在伺服器端。
為什麼要用到Serlvet?
我們編寫java程式想要在網上實現 聊天、發帖、這樣一些的互動功能,普通的java技術是非常難完成的。sun公司就提供了Serlvet這種技術供我們使用。
HTTP協議
什麼是HTPP協議
超文字傳輸協議(HTTP,HyperText Transfer Protocol)是網際網路上應用最為廣泛的一種網路協議。所有的WWW檔案都必須遵守這個標準。它是TCP/IP協議的一個應用層協議
簡單來說,HTTP協議就是客戶端和伺服器互動的一種通迅的格式。
例子:在瀏覽器點選一個連結,瀏覽器就為我開啟這個連結的網頁。
原理:當在瀏覽器中點選這個連結的時候,瀏覽器會向伺服器傳送一段文字,**告訴伺服器請求開啟的是哪一個網頁。伺服器收到請求後,就返回一段文字給瀏覽器,瀏覽器會將該文字解析,然後顯示出來。**這段文字就是遵循HTTP協議規範的。
HTTP1.0和HTTP1.1的區別
HTTP1.0協議中,客戶端與web伺服器建立連線後,只能獲得一個web資源【短連線,獲取資源後就斷開連線】
HTTP1.1協議,允許客戶端與web伺服器建立連線後,在一個連線上獲取多個web資源【保持連線】
HTTP請求
瀏覽器向伺服器請求某個web資源時,稱之為瀏覽器向伺服器傳送了一個http請求。
一個完整http請求應該包含三個部分:
- 請求行【描述客戶端的請求方式、請求的資源名稱,以及使用的HTTP協議版本號】
- 多個訊息頭【描述客戶端請求哪臺主機,以及客戶端的一些環境資訊等】
- 一個空行
請求行
請求行:GET /java.html HTTP/1.1
請求行中的GET稱之為請求方式,請求方式有:POST,GET,HEAD,OPTIONS,DELETE,TRACE,PUT。
常用的有:POST,GET
一般來說,當我們點選超連結,通過位址列訪問都是get請求方式。通過表單提交的資料一般是post方式。
可以簡單理解GET方式用來查詢資料,POST方式用來提交資料,get的提交速度比post快
GET方式:在URL地址後附帶的引數是有限制的,其資料容量通常不能超過1K。
POST方式:可以在請求的實體內容中向伺服器傳送資料,傳送的資料量無限制。
請求頭
- Accept: text/html,image/* 【瀏覽器告訴伺服器,它支援的資料型別】
- Accept-Charset: ISO-8859-1 【瀏覽器告訴伺服器,它支援哪種字符集】
- Accept-Encoding: gzip,compress 【瀏覽器告訴伺服器,它支援的壓縮格式】
- Accept-Language: en-us,zh-cn 【瀏覽器告訴伺服器,它的語言環境】
- Host: www.it315.org:80【瀏覽器告訴伺服器,它的想訪問哪臺主機】
- If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT【瀏覽器告訴伺服器,快取資料的時間】
- Referer: http://www.it315.org/index.jsp【瀏覽器告訴伺服器,客戶機是從那個頁面來的---反盜鏈】
- 8.User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)【瀏覽器告訴伺服器,瀏覽器的核心是什麼】
- Cookie【瀏覽器告訴伺服器,帶來的Cookie是什麼】
- Connection: close/Keep-Alive 【瀏覽器告訴伺服器,請求完後是斷開連結還是保持連結】
- Date: Tue, 11 Jul 2000 18:23:51 GMT【瀏覽器告訴伺服器,請求的時間】
HTTP響應
一個HTTP響應代表著伺服器向瀏覽器回送資料
一個完整的HTTP響應應該包含四個部分:
- 一個狀態行【用於描述伺服器對請求的處理結果。】
- 多個訊息頭【用於描述伺服器的基本資訊,以及資料的描述,伺服器通過這些資料的描述資訊,可以通知客戶端如何處理等一會兒它回送的資料】
- 一個空行
- 實體內容【伺服器向客戶端回送的資料】
狀態行
格式: HTTP版本號 狀態碼 原因敘述
狀態行:HTTP/1.1 200 OK
狀態碼用於表示伺服器對請求的處理結果,它是一個三位的十進位制數。響應狀態碼分為5類
響應頭
- Location: http://www.it315.org/index.jsp 【伺服器告訴瀏覽器要跳轉到哪個頁面】
- Server:apache tomcat【伺服器告訴瀏覽器,伺服器的型號是什麼】
- Content-Encoding: gzip 【伺服器告訴瀏覽器資料壓縮的格式】
- Content-Length: 80 【伺服器告訴瀏覽器回送資料的長度】
- Content-Language: zh-cn 【伺服器告訴瀏覽器,伺服器的語言環境】
- Content-Type: text/html; charset=GB2312 【伺服器告訴瀏覽器,回送資料的型別】
- Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT【伺服器告訴瀏覽器該資源上次更新時間】
- Refresh: 1;url=http://www.it315.org【伺服器告訴瀏覽器要定時重新整理】
- Content-Disposition: attachment; filename=aaa.zip【伺服器告訴瀏覽器以下載方式開啟資料】
- Transfer-Encoding: chunked 【伺服器告訴瀏覽器資料以分塊方式回送】
- Set-Cookie:SS=Q0=5Lb_nQ; path=/search【伺服器告訴瀏覽器要儲存Cookie】
- Expires: -1【伺服器告訴瀏覽器不要設定快取】
- Cache-Control: no-cache 【伺服器告訴瀏覽器不要設定快取】
- Pragma: no-cache 【伺服器告訴瀏覽器不要設定快取】
- Connection: close/Keep-Alive 【伺服器告訴瀏覽器連線方式】
- Date: Tue, 11 Jul 2000 18:23:51 GMT【伺服器告訴瀏覽器回送資料的時間】
Servlet的作用
Servlet帶給我們最大的作用就是能夠處理瀏覽器帶來HTTP請求,並返回一個響應給瀏覽器,從而實現瀏覽器和伺服器的互動。
JAVAWEB目錄結構
以上圖說明:
- bbs目錄代表一個web應用
- bbs目錄下的html,jsp檔案可以直接被瀏覽器訪問
- WEB-INF目錄下的資源是不能直接被瀏覽器訪問的
- web.xml檔案是web程式的主要配置檔案
- 所有的classes檔案都放在classes目錄下
- jar檔案放在lib目錄下
實現Servlet介面編寫Servlet程式
程式我都是由idea下寫,首先要在idea上配置Tomcat,在我別的博文中有教程!
編寫Servlet程式的步驟
- 建立一個自定義類,實現Serlvet介面
-
我們發現有5個方法需要重寫,有init【初始化】,destroy【銷燬】,service【服務】,ServletConfig【Servlet配置】,getServletInfo【Serlvet資訊】。
-
在此一看,發現service()方法是最有可能是寫邏輯程式碼的地方。
-
首先寫一個hellword入門先
-
呼叫ServletResponse物件的方法向瀏覽器輸出HelloWorld
- 配置xml檔案,光寫了Servlet是不行的,Tomcat還要知道瀏覽器怎麼訪問這個Servlet。
- 訪問自己寫的Serlvet程式
Serlvet生命週期
-
下面我們看看Servlet的生命週期
-
第一次訪問Servlet,我們發現init()和service()都被呼叫了
- 第二次訪問Servlet,service()被呼叫了
- 第三次訪問Servlet,還是service()被呼叫了
- 當我們關閉Tomcat伺服器的時候,destroy()被呼叫了!
Servlet生命週期可分為5個步驟
- 載入Servlet。當Tomcat第一次訪問Servlet的時候,Tomcat會負責建立Servlet的例項
- 初始化。當Servlet被例項化後,Tomcat會呼叫init()方法初始化這個物件
- 處理服務。當瀏覽器訪問Servlet的時候,Servlet 會呼叫service()方法處理請求
- 銷燬。當Tomcat關閉時或者檢測到Servlet要從Tomcat刪除的時候會自動呼叫destroy()方法,讓該例項釋放掉所佔的資源。一個Servlet如果長時間不被使用的話,也會被Tomcat自動銷燬
- 解除安裝。當Servlet呼叫完destroy()方法後,等待垃圾回收。如果有需要再次使用這個Servlet,會重新呼叫init()方法進行初始化操作。
- 簡單總結:只要訪問Servlet,service()就會被呼叫。init()只有第一次訪問Servlet的時候才會被呼叫。 destroy()只有在Tomcat關閉的時候才會被呼叫。
繼承HttpServlet編寫Servlet程式
在上面我們實現Servlet介面,要實現5個方法。這樣太麻煩了!而HttpServlet類已經實現了Servlet介面的所有方法,編寫Servlet時,只需要繼承HttpServlet,重寫你需要的方法即可,並且它在原有Servlet介面上新增了一些與HTTP協議處理方法,它比Servlet介面的功能更為強大。
- 一般我們開發的時候,都是重寫doGet()和doPost()方法的。對於idea而言,建立Servlet的時候已經幫你重寫好了
如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章的同學,可以關注微信公眾號:Java3y