1. 什么是http協(xié)議
http協(xié)議: 對瀏覽器客戶端 和? 服務(wù)器端 之間數(shù)據(jù)傳輸?shù)母袷揭?guī)范
1.2 查看http協(xié)議的工具
1)使用火狐的firebug插件(右鍵->firebug->網(wǎng)絡(luò))
2)使用谷歌的“審查元素”
1.3 http協(xié)議內(nèi)容
GET /day09/hello HTTP/1.1? ? ? ? ? ? ? -請求行
Host: localhost:8080? ? ? ? ? ? ? ? ? ? --請求頭(多個(gè)key-value對象)
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
--一個(gè)空行
name=eric&password=123456? ? ? ? ? ? --(可選)實(shí)體內(nèi)容
2.1 請求行 ? ? ? ? ? ? ? GET /day09/hello HTTP/1.1
#http協(xié)議版本(一次連接就是一個(gè)三次握手,效率低下)
http1.0:當(dāng)前瀏覽器客戶端與服務(wù)器端建立連接之后,只能發(fā)送一次請求,一次請求之后連接關(guān)閉。
http1.1:當(dāng)前瀏覽器客戶端與服務(wù)器端建立連接之后,可以在一次連接中發(fā)送多次請求。(基本都使用1.1)
#請求資源
URL:? 統(tǒng)一資源定位符。http://localhost:8080/day09/testImg.html。只能定位互聯(lián)網(wǎng)資源。是URI 的子集。
URI: 統(tǒng)一資源標(biāo)記符。/day09/hello。用于標(biāo)記任何資源??梢允潜镜匚募到y(tǒng),局域網(wǎng)的資源(//192.168.14.10/myweb/index.html), 可以是互聯(lián)網(wǎng)。
#請求方式
常用的請求方式: GET? 和 POST
表單提交:
<form action=“提交地址” method(method 提交方式)=“GET/POST”></form>
sGET? vs? POST 區(qū)別
1)get方式提交
a)地址欄(URI)會跟上參數(shù)數(shù)據(jù)。以?開頭,多個(gè)參數(shù)之間以&分割。
GET /day09/testMethod.html?name=eric&password=123456 HTTP/1.1
b)GET提交參數(shù)數(shù)據(jù)有限制,不超過1KB。
c)GET方式不適合提交敏感密碼。
d)注意: 瀏覽器直接訪問的請求,默認(rèn)提交方式是GET方式
2)POST方式提交
a)參數(shù)不會跟著URI后面。參數(shù)而是跟在請求的實(shí)體內(nèi)容中。沒有?開頭,多個(gè)參數(shù)之間以&分割。
b)POST提交的參數(shù)數(shù)據(jù)沒有限制。
c)POST方式提交敏感數(shù)據(jù)。
?實(shí)體內(nèi)容 ?:只有POST提交的參數(shù)會放到實(shí)體內(nèi)容中
3.2 請求頭
Accept: text/html,image/*? ? ? -- 瀏覽器接受的數(shù)據(jù)類型
Accept-Charset: ISO-8859-1? ? -- 瀏覽器接受的編碼格式
Accept-Encoding: gzip,compress? --瀏覽器接受的數(shù)據(jù)壓縮格式
Accept-Language: en-us,zh-? ? ? --瀏覽器接受的語言
Host: www.it315.org:80? ? ? ? ? --(必須的)當(dāng)前請求訪問的目標(biāo)地址(主機(jī):端口)
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT? --瀏覽器最后的緩存時(shí)間
Referer: http://www.it315.org/index.jsp? ? ? -- 當(dāng)前請求來自于哪里
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)? --瀏覽器類型
Cookie:name=eric? ? ? ? ? ? ? ? ? ? -- 瀏覽器保存的cookie信息
Connection: close/Keep-Alive? ? ? ? ? ? -- 瀏覽器跟服務(wù)器連接狀態(tài)。close: 連接關(guān)閉? keep-alive:保存連接。
Date: Tue, 11 Jul 2000 18:23:51 GMT? ? ? -- 請求發(fā)出的時(shí)間
3.4 HttpServletRequest對象
HttpServletRequest對象作用是用于獲取請求數(shù)據(jù)。
核心的API:
請求行:
request.getMethod();? 請求方式
request.getRequetURI()? / request.getRequetURL()? 請求資源
request.getProtocol()? 請求http協(xié)議版本
請求頭:
request.getHeader("名稱")? 根據(jù)請求頭獲取請求值
request.getHeaderNames()? ? 獲取所有的請求頭名稱
實(shí)體內(nèi)容:
request.getInputStream()? 獲取實(shí)體內(nèi)容數(shù)據(jù)
3.8 傳遞的請求參數(shù)如何獲取
GET方式: 參數(shù)放在URI后面
POST方式: 參數(shù)放在實(shí)體內(nèi)容中
獲取GET方式參數(shù):
request.getQueryString();
獲取POST方式參數(shù):
request.getInputStream();
問題:但是以上兩種不通用,而且獲取到的參數(shù)還需要進(jìn)一步地解析。
所以可以使用統(tǒng)一方便的獲取參數(shù)的方式:
核心的API:
request.getParameter("參數(shù)名");? 根據(jù)參數(shù)名獲取參數(shù)值(注意,只能獲取一個(gè)值的參數(shù))
request.getParameterValue("參數(shù)名“);根據(jù)參數(shù)名獲取參數(shù)值(可以獲取多個(gè)值的參數(shù))
request.getParameterNames();? 獲取所有參數(shù)名稱列表
3.9 請求參數(shù)編碼問題
修改POST方式參數(shù)編碼:
request.setCharacterEncoding("utf-8");
修改GET方式參數(shù)編碼:
手動(dòng)解碼:String name = new String(name.getBytes("iso-8859-1"),"utf-8");
4 Http響應(yīng)
HTTP/1.1 200 OK? ? ? ? ? ? ? ? --響應(yīng)行
Server: Apache-Coyote/1.1? ? ? ? --響應(yīng)頭(key-vaule)
Content-Length: 24
Date: Fri, 30 Jan 2015 01:54:57 GMT
--一個(gè)空行
this is hello servlet!!!? ? ? ? ? ? ? ? ? --實(shí)體內(nèi)容
#http協(xié)議版本
#狀態(tài)碼: 服務(wù)器處理請求的結(jié)果(狀態(tài))
常見的狀態(tài):
200 :? 表示請求處理完成并完美返回
302:? 表示請求需要進(jìn)一步細(xì)化。 404:? 表示客戶訪問的資源找不到。
500:? 表示服務(wù)器的資源發(fā)送錯(cuò)誤。(服務(wù)器內(nèi)部錯(cuò)誤)
4.2 常見的響應(yīng)頭
Location: http://www.it315.org/index.jsp? -表示重定向的地址,該頭和302的狀態(tài)碼一起使用。
Server:apache tomcat? ? ? ? ? ? ? ? ---表示服務(wù)器的類型
Content-Encoding: gzip? ? ? ? ? ? ? ? -- 表示服務(wù)器發(fā)送給瀏覽器的數(shù)據(jù)壓縮類型
Content-Length: 80? ? ? ? ? ? ? ? ? ? --表示服務(wù)器發(fā)送給瀏覽器的數(shù)據(jù)長度
Content-Language: zh-cn? ? ? ? ? ? ? --表示服務(wù)器支持的語言
Content-Type: text/html; charset=GB2312? --表示服務(wù)器發(fā)送給瀏覽器的數(shù)據(jù)類型及內(nèi)容編碼
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT? --表示服務(wù)器資源的最后修改時(shí)間
Refresh: 1;url=http://www.it315.org? ? --表示定時(shí)刷新
Content-Disposition: attachment; filename=aaa.zip --表示告訴瀏覽器以下載方式打開資源(下載文件時(shí)用到)
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ; path=/search? --表示服務(wù)器發(fā)送給瀏覽器的cookie信息(會話管理用到)
Expires: -1? ? ? ? ? ? ? ? ? ? ? ? ? --表示通知瀏覽器不進(jìn)行緩存
Cache-Control: no-cache
Pragma: no-cache
Connection: close/Keep-Alive? ? ? ? ? --表示服務(wù)器和瀏覽器的連接狀態(tài)。close:關(guān)閉連接 keep-alive:保存連接
4.3 HttpServletResponse對象
HttpServletResponse對象修改響應(yīng)信息:
響應(yīng)行:
response.setStatus()? 設(shè)置狀態(tài)碼
響應(yīng)頭:
response.setHeader("name","value")? 設(shè)置響應(yīng)頭
實(shí)體內(nèi)容:
response.getWriter().writer();? 發(fā)送字符實(shí)體內(nèi)容
response.getOutputStream().writer()? 發(fā)送字節(jié)實(shí)體內(nèi)容
重點(diǎn):
使用HttpServletRequest對象: 獲取請求數(shù)據(jù)
使用HttpServletResponse對象: 設(shè)置響應(yīng)數(shù)據(jù)