浅析Java web程序之客户端和服务器端交互原理-2

上一篇 / 下一篇  2012-05-10 15:49:11 / 个人分类:Java

GET 和 POST 最直观的区别就是:GET方法将数据的请求跟在了所请求的URL后面,也就是在请求行里面我们是这么样来做的:51Testing软件测试网-qm^.S^

51Testing软件测试网|Q T;cI5Y.u^

GET /blog/242842?key=value&key=value&key=value......HTTP1.1

'j\,pa Oz2v0  实际上用 GET 是这样传递数据的:

,r P']2t0G[051Testing软件测试网X4@ u'GJ

&QK0XHxy5\0
http://cuishen.iteye.com/?page=2......

nFY5lX TR0  iii.服务器端响应请求生成结果并回发(response)51Testing软件测试网2V0}]+}Zx`g

51Testing软件测试网S.T`6q9f |$A@kE

  Web 服务器解析请求,定位指定的资源 http://cuishen.iteye.com/blog/242842

^+j"b`2N7qy0

X No8~mS0  1)根据请求时的 GET/POST 对应的用servlet里的 doGet() / doPost()方法来处理(有可能是一些业务逻辑,也有可能是一些验证等等,也有可能是一些数据查询,提交等等)其有效的数据就来源于 key=value&key=value&key=value......,以及其它的一些封装在 request 对象中的数据资源。

4V}lg3]J051Testing软件测试网7[1yi@5jNq

  2)处理请求之后,由 response 对象得到 java.io.PrintWriter 输出流对象out,通过 out.println(); 将数据以指定的格式,如按照response.setcontentType("text/html;charset=gb2312");的格式输出到输 出流。

y:uj&Yj N-S&A0w/\0

5XnF+TO7`S0  它的响应报文与请求报文非常类似,其区别就在于:我们在请求阶段的请求行被状态行给替换了,再来看响应报文:51Testing软件测试网8C"E6F|x }vKA

51Testing软件测试网a&G%b,MAKx$I

  3)一个响应报文由四个部分组成:状态行、响应头标、空行、响应数据:51Testing软件测试网{0|j$K\C'q*k

5eY9_7^#q)w6zE0  (a).状态行:51Testing软件测试网 u#i9g]X2h

51Testing软件测试网(llV][?

  状态行由三个标记组成:HTTP版本、响应代码和响应描述。51Testing软件测试网#y-iY9Ho1FZ*l

51Testing软件测试网jj8TL)T/^v#|.Fm

51Testing软件测试网fbIQ8r2xsN

HTTP1.1 --- 100 --- continue //继续追加后继内容51Testing软件测试网,Q[;@[h
HTTP1.1 --- 200 --- OK //一切正常51Testing软件测试网q*D3NBh1UCf
HTTP1.1 --- 301 --- Moved Permanently //请求的文档在其它地方,会自动连接51Testing软件测试网l+~o$eR4N
HTTP1.1 --- 403 --- Forbidden //绝对拒绝你访问这个资源,不管授权没有
1dT{S]u0HTTP1.1 --- 400 --- Bad Request //客户端请求中的不良语法
~ ~DY r3g0HTTP1.1 --- 404 --- Not Found //最常见,绝对是大名鼎鼎的找不到

Z5q d*cW5t4h~.T)w0  HTTP响应码:51Testing软件测试网Yp+H#b P iB;R

(G?Li:K1j?Yh0

F2[V8V:uL2Cq0q0
1xx:提示性信息,告诉客户端应该对某些其它的动作作出响应
`DVx en02xx:这些就代表了请求成功51Testing软件测试网)f/P4p5jL+a
3xx:重定向,为了完成请求,必须进一步执行的动作51Testing软件测试网vaWv u-\+nY
4xx:客户端错误
*uu~~BZ0500-599: 服务器端的错误
51Testing软件测试网Pgkj _;{?i

  (b).响应头标:像请求头标一样,它们指出服务器的功能,标识出响应数据的细节。51Testing软件测试网+] P&Wy+x R8io0@

51Testing软件测试网pW#fe |T;I

51Testing软件测试网 O{Xy'e:Mf

Date: Sat, 31 Dec 2005 23:59:59 GMT --响应生成的日期和时间
b O+d0C2U0ContentType: 'text/html;charset=gb2312'
VxJ z/I.C0Content-Length: 122 --响应中的字节数,只在浏览器使用永久(Keep-alive)HTTP连接时需要。
*H*Uzy,W0sv0(c).空行:最后一个响应头标之后是一个空行,发送回车符和退行,表明服务器以下不再有头标。

Z&H-k$]R8a0  (d).响应数据:HTML文档和图像等,也就是HTML本身。out.println("<html>......");写到客户端。51Testing软件测试网!x(fA t7zT u'C

51Testing软件测试网sbZH?h0d

51Testing软件测试网R }X!tPof6Y6\

  1. <html>    
  2. <head>    
  3. <title>Welcome to cuishen's IT blog</title>    
  4. </head>    
  5. <body>    
  6. <!-- 这里是具体的内容,看到了这里    
  7. 相信大家对 HTTP 工作原理及客户端与服务器交互过程已经很清楚了吧    
  8. -->     
  9. </body>    
  10. </html>

A$SQ2sx0  iv. 服务器端关闭连接,客户端解析回发响应报文,恢复页面

3\$RbsF,o0

lVe {~a [7\ {:y \0  1)浏览器先解析状态行,查看请求是否成功的状态代码--HTTP响应码:404 400 200 ....

)X0O2LpY/@#h[051Testing软件测试网.wQp;V4u

  2)解析每一个响应头标,如:

-`)| e CU0

:p WZ)e(yF7Y6g/z0

B8xl{J3n0
ContentType: text/html;charset=gb2312
7MdRMR%n'Jm0Content-Length: 122 --- 响应中的字节数,只在浏览器使用永久(Keep-alive)HTTP连接时需要。
51Testing软件测试网`So9wd1A(k#}6K&b

  3)读取响应数据HTML,根据标签<html></html>中的内容恢复标准的HTML格式页面或者其它。51Testing软件测试网*^j9L#@#S

51Testing软件测试网9C6VR M'Y+w/TA#d

  4)一个HTML 文档可能包含其它的需要被载入的资源,浏览器会识别,并对这些资源再进行额外的请求,这个过程可以是循环的方式一直到所有的数据都按照响应头标中规定的格式恢复到页面中。

!I m-Z?#b/Mf051Testing软件测试网Vbm8@EV0Mc

  5)数据传送完毕,服务器端关闭连接,即无状态协议。51Testing软件测试网3m _/E%E5EF

U!CoWC;S6f4X0  3、总结

P.n[QnA0D)s u3V0

F7^[qW"x0  不要被高深的名词和理论吓到,其实HTTP客户端和服务器端的交互原理很简单:即先是浏览器和服务器端建立Socket无状态连接,也就是短连 接,然后通过IO流进行报文信息(这个报文是严格遵循HTTP报文接口的)的交互,最后会话结束后就关闭连接。对于这些底层的协议和报文的打包解包交互的 实现,其实java和浏览器早都已经封装好了,程序员只要专注于业务逻辑的实现就行啦,这些都不必关心!!

\}\9nVf.hzDO0
$X.dO3H3Os}0

TAG:

 

评分:0

我来说两句

Open Toolbar