對于Java Web程序的學習已經有一段時間了,也正在跟做一個項目——DRP分銷資源計劃。
DRP這段時間已經看了不少了,把相關代碼也實現了。但是還是沒有搞清楚一些關系。大概知道是哪里調用了那里,整體上和.net一致。細說就不知道了。為了能更好的理解Java程序,所以在網上也了些資料來促進理解。
在web程序中不太容易搞清楚的就是客戶端和服務器。這也是B/S結構的一大特點,C/S結構的客戶端和服務器非常明了,沒有其他的輔助技術。在B/S中將很多技術都分離出來成為獨立的技術,讓其變得更加靈活。(像 js、jsp、ajax等等)
為了搞清楚他們這些相關技術之間的關系,首先來了解一下Java Web程序客戶端和服務器端是如何進行交互的。
說起來其實很簡單,web程序客戶端和服務器的交互主要依賴于Http協議的。先來了解一下什么是個HTTP協議吧!
A、HTTP是一種超文本傳送協議(Hyper Text Transport Protocol)是一套計算機在網絡中通信的一種規則。在TCP/IP體系結構中,HTTP屬于應用層協議,位于TCP/IP協議的頂層。
B、HTTP是一種無狀態的協議,意思是指在Web 瀏覽器(客戶端)和 Web 服務器之間不需要建立持久的連接。整個過程就是當一個客戶端向服務器端發送一個請求(request),然后Web服務器返回一個響應 (response),之后連接就關閉了,在服務端此時是沒有保留連接的信息。
C、HTTP 遵循 請求/響應(request/response) 模型的,所有的通信交互都被構造在一套請求和響應模型中。
D、瀏覽WEB時,瀏覽器通過HTTP協議與WEB服務器交換信息,Web服務器向Web瀏覽器返回的文件都有與之相關的類型,這些信息類型的格式由MIME定義。
HTTP定義的事物處理有以下四個步驟:1、建立鏈接 2、客戶端發送HTTP請求報文(request) 3、服務器響應請求生成結果并回發(response) 4、服務器端關閉連接,客戶端解析回發響應報文,恢復頁面
1、 建立連接
我們在瀏覽器地址欄中輸入URL地址,例如:http://blog.csdn.net/lidonglong121。客戶端請求這個地址的時候即打開了web服務器HTTP端口的一個套接字。
2、 客戶端發送HTTP請求報文(request)
一旦建立了TCP連接,Web瀏覽器就會向Web服務器發送請求命令,是一個ASCII文本請求行,后跟0個或多個HTTP頭標(即報頭),一個空行和實現請求的任意數據。
請求報文共含四部分,詳見博文:http://blog.csdn.net/lidonglong121/article/details/7719405
請求報文總結:
我們可以這樣寫出一個標準的 HTTP請求:
POST /lidonglong121 HTTP1.1
HOST: blog.csdn.net/
User-Agent: Mozilla/4.0
Accpt: image/gif,text/html,application/pdf,image/png...
(CRLF)
viewmode=contents (POST()請求的數據)
這上面的一個例子意思是:
我要去訪問的服務器端的地址是:blog.csdn.net/ 它下面的資源: /lidonglong121
連起來就是:blog.csdn.net/lidonglong121
這個頁面用的是 HTTP1.1 規范,我的瀏覽器版本是Mozilla/4.0
可以支持的MIME格式為 image/gif,text/html,application/pdf,image/png.....
GET 和 POST 最直觀的區別就是:GET方法將數據的請求跟在了所請求的URL后面,也就是在請求行里面我們是這么樣來做的:
GET /lidonglong121?key=value&key=value&key=value......HTTP1.1
實際上用 GET 是這樣傳遞數據的:http://blog.csdn.net/lidonglong121?viewmode=contents
POST是不會將調用的參數在URL中顯示的。
3.服務器端響應請求生成結果并回發(response)
Web 服務器解析請求,定位指定的資源 http://blog.csdn.net/lidonglong121/article/details/7718663
1)根據請求時的 GET/POST 對應的用servlet里的 doGet() / doPost()方法來處理(有可能是一些業務邏輯,也有可能是一些驗證等等,也有可能是一些數據查詢,提交等等)其有效的數據就來源于key=value&key=value&key=value......,以及其它的一些封裝在request 對象中的數據資源。
2)處理請求之后,由 response 對象得到 java.io.PrintWriter 輸出流對象out,通過 out.println(); 將數據以指定的格式,如按照response.setcontentType("text/html;charset=gb2312");的格式輸出到輸出流。
它的響應報文與請求報文非常類似,其區別就在于:我們在請求階段的請求行被狀態行給替換了,再來看響應報文:
3)一個響應報文由四個部分組成:狀態行、響應頭標、空行、響應數據:
詳見博文:http://blog.csdn.net/lidonglong121/article/details/7719109
4、服務器端關閉連接,客戶端解析回發響應報文,恢復頁面
1)瀏覽器先解析狀態行,查看請求是否成功的狀態代碼。
2)解析每一個響應頭標,如:
ContentType.text/html;charset=gb2312
Content-Lengh:122 ---響應中的字節數
3)讀取響應數據HTML,根據標簽<html></html>中的內容恢復標準的HTML格式頁面或者其他。
4)一個HTML文檔可能包含其它的需要被載入的資源,瀏覽器會識別,并對這些資源再進行額外的請求,這個過程可以是循環的方式一直到所有的數據都按照響應頭標中規定的格式恢復到頁面中。
5)數據傳送完畢,服務器端關閉連接,即無狀態協議。
web客戶端和服務器的一個交互主要流程如上所述。