Web瀏覽器和服務器通過HTTP協議在Internet上發送和接收消息。HTTP是一種基於請求/響應模式的協議。客戶端發送一個請求,服務器端返回對該請求響應。
HTTP使用可靠的TCP連接,默認端口是80。
(2)、HTTP請求
HTTP請求由3個部分構成,分別是:
l 請求方法URI協議/版本
l 請求頭(Request Header)
l 請求正文
下面是一個HTTP請求的例子:
GET/sample.jspHTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
username=ssss&password=1234
1>、請求方法URI協議/版本
以上代碼中“GET”代表請求方法,“/sample.jsp”表示URI,“HTTP/1.1”代表協議和協議的版本。
根據HTTP標准,HTTP請求可以使用多種請求方法。例如:HTTP1.1支持7種請求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。在Internet應用中,最常用的方法是GET和POST。
URL完整地指定了要訪問的網絡資源,通常只要給出相對於服務器的根目錄的相對目錄即可,因此總是以“/”開頭,最后,協議版本聲明了通信過程中使用HTTP的版本。
2>、請求頭(Request Header)
請求頭包含許多有關的客戶端環境和請求正文的有用信息。例如,請求頭可以聲明瀏覽器所用的語言,請求正文的長度等。
Accept:image/gif.image/jpeg.*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)
Accept-Encoding:gzip,deflate.
3>、請求正文
請求頭和請求正文之間是一個空行,這個行非常重要,它表示請求頭已經結束,接下來的是請求正文。請求正文中可以包含客戶提交的查詢字符串信息:
username=rrrro&password=1234
在以上的例子的HTTP請求中,請求的正文只有一行內容。當然,在實際應用中,HTTP請求正文可以包含更多的內容。
HTTP響應
與HTTP請求相似,HTTP響應也由3個部分構成,分別是:
l 協議狀態版本代碼描述
l 響應頭(Response Header)
l 響應正文
下面是一個HTTP響應的例子:
HTTP/1.1 200 OK
Server:Apache Tomcat/ 5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112
<html>
<head>
<title>HTTP響應示例<title>
</head>
<body>
Hello HTTP!
</body>
</html>
1>、協議 狀態代碼描述
HTTP響應的第一行類似於HTTP請求的第一行,它表示通信所用的協議是HTTP1.1服務器已經成功的處理了客戶端發出的請求(200表示成功):
HTTP/1.1 200 OK
2>、響應頭(Response Header)
響應頭也和請求頭一樣包含許多有用的信息,例如服務器類型、日期時間、內容類型和長度等:
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:13:33 GMT
Content-Type:text/html
Last-Moified:Mon,6 Oct 2003 13:23:42 GMT
Content-Length:112
3>、響應正文
響應正文就是服務器返回的HTML頁面:
<html>
<head>
<title>HTTP響應示例<title>
</head>
<body>
Hello HTTP!
</body>
</html>
響應頭和正文之間也必須用空行分隔。
(3)HTTPServlet的功能
在了解具體的HTTP協議規范后,可以更好地理解HttpServlet的作用,它能夠根據客戶發出HTTP請求,生成相應的HTTP響應結果。HttpServlet首先必須讀取HTTP請求的內容。Servlet容器負責創建HttpRequest對象,並把HTTP請求信息封裝到HttpRequest對象中,這大大簡化了HttpServlet解析請求數據的工作量。如果沒有HttpRequest,HttpServlet只能直接處理Web客戶發出的原始的字符數據,有了HttpRequest后,只要調用HttpServletRequest的相關方法,就可以方便地讀取HTTP請求中任何一部分信息,HttpServletRequest中讀取HTTP請求信息的常用方法參見下表
HttpServletRequest對象的常用方法
方法 |
描述 |
getCookie() |
返回HTTP請求的Cookies |
getHeader(String name) |
返回參數指定的HTTP請求的Header數據 |
getRequestURI() |
返回HTTP請求的URI |
getQueryString() |
返回HTTP請求數據中的查詢字符串 |
getMethod() |
返回HTTP請求方法 |
Servlet容器還向HttpServlet提供了HttpServletResponse對象,HttpServlet可以通過它來生成HTTP響應的每一部分內容,HttpServletResponse提供了生成響應數據Header的方法
HttpServletResponse對象的常用方法
方法 |
描述 |
addCookie(Cookie cookie) |
向HTTP響應中加入Cookie |
setHeader(String name,String value) |
設置HTTP響應的Header,如果參數name對應的Header已經存在,則覆蓋原來的Header數據 |
addHeader(String name,String value) |
向HTTP響應中加入Header |
(4)Servlet容器響應Web客戶請求流程的UML時序圖
在時序圖中,從對象A到對象B的箭頭,表示A向B發送一條消息,B接收到消息后,將執行相關的操作,因此也可理解為A調用B的方法。例如在UML時序圖步驟5,表示Servlet容器調用HttpServlet的service()方法,對於步驟2,箭頭的起點和終點都指向Servlet容器,表示Servlet容器調用自身的方法來解析HTTP請求信息。
1. Web客戶向Servlet容器發出HTTP請求;
2. Servlet容器解析Web的HTTP請求;
3. Servlet容器創建一個HttpRequest對象,在這個對象中封裝了HTTP請求信息;
4. Servlet容器創建一個HttpResponse對象;
5. Servlet容器調用HttpServlet的service方法,把HttpRequest和HttpResponse對象為Service方法的參數傳給HttpServlet對象;
6. HttpServlet調用HttpRequest的有關方法,獲取HTTP請求信息;
7. HttpServlet調用HttpResponse的有關方法,生成響應數據;
8. Servlet容器把HttpServlet的響應結果傳給Web客戶
--------------------
++轉載