对于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客户端和服务器的一个交互主要流程如上所述。