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