1. 解析HTTP 协议
组成一个基本的Web程序需要Web服务器、Web客户端浏览器、HTTP协议以及静态HTML文件。
其中Web服务器的作用是接受客户端请求,然后向客户端返回一些结果;浏览器的作用是允许用户请求服务器上的某个资源,并且向用户显示请求的结果;HTML用于告诉浏览器怎样向用户显示内容;HTTP是Web上客户端和服务器之间通信所用的协议。
要真正的理解Web工作原理,必须彻底的理解HTTP协议。
HTTP是一种超文本传输协议(HyperText Transfer Protocol),是一套计算机在网络中通信的一种规则。在TCP/IP体系结构中,HTTP属于应用层协议,位于TCP/IP 协议的顶层。HTTP是一种无状态的协议,意思是指在Web浏览器(客服端)和Web服务器之间不需要建立持久的连接。整个过程就是当一个客户端向服务器发送一个请求(Request),然后Web服务器返回一个响应(Response),之后连接就关闭了。HTTP遵循请求/响应(Request/Response)模型的,所有的通信都被构造在一套请求和响应模型中。
HTTP定义的事务处理由下面四部组成:
1. 客户端和Web服务器建立连接;
2. 客户端发送HTTP请求;
3. 服务器接受客户端的HTTP请求,生成HTTP响应回发;
4. 服务器关闭连接。客户端解析回发响应,回复页面
2.发送请求信息
一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。HTTP协议将来自于客户端的请求信息封装成HTTP请求,它包括请求行、请求头、消息体、以及分隔请求头和消息体的空行。
1):请求行是一个ASCII 文本行,由三个标记组成:请求的HTTP方法、请求的URL、HTTP版本,中间用空格分开。
在HTTP版本1.1中,定义了八种可能的HTTP请求方法:
GET:用于向服务器检索资源
POST:用于想服务器发送数据,并要求指定的URL处理
HEAD:与GET犯法相同,服务器只返回状态行和头标,并不返回请求文档
PUT:请求服务器保存数据作为指定URL新内容
DELETE:请求服务器删除URL中命名的资源
OPTIONS:请求关于服务器支持的请求方法信息
TRACE:请求Web服务器反馈HTTP请求和其头标
CONNECT:已文档化但当前为实现的一个方法,预留做隧道处理
2)请求头
HTTP协议使用HTTP头来传递请求的元信息
3 ) 空行
发送回车符和退行,通知服务器一下不再有请求头
4) 消息体
HTTP请求中带有查询字符串时,如果是GET方法,查询字符串或表单数据附加在请求行中,那么消息体中就没有内容;如果是POST方法,查询字符串或表单数据就添加在消息体中。
3.回送响应信息
HTTP响应包括:状态行、响应头、消息体以及分割消息体和响应头的空行
1)状态行:
100-199:信息(请求收到,继续处理)
200-299:成功(行为被成功的接受、理解和采纳)
300-399:重定向(为了完成请求,必须进一步执行的动作)
400-499:客户端错误(请求包含语法错误或者请求无法实现)
500-599:服务器端错误(服务器不能实现一种明显无效的请求)
2)响应头:
和请求头一样,也是用冒号分割的名称/值对,冒号前面是HTTP头的名称,后面是HTTP头的值
3)空白行:
最后一个响应头之后是一个空行,发送回车符和退行,表明以下不再有响应头
4)消息体:
要发送回客户端的HTML文档或其他要显示的内容等。Web服务器把要发送给客户端的文档信息放在消息体中
Web服务器的缺陷
只能向客户端提供静态的网页内容
最早的解决方案:
CGI,即通用网关接口(Common Gateway Interface)使用CGI,Web服务器可以将客户端的请求传递给一个外部程序,这个外部程序可以执行、创建内容,并且将响应传递给客户端。
CGI最大的优点是它可以用 Shell 、Perl、 C 、PHP、 Python等编写。但是在使用CGI最为Web服务器的辅助程序时,每次请求一个CGI资源,将在服务器上创建一个新的进程(Process),并且通过标准输入和环境变量将信息传递给该进程。由此可见 每次请求就会打开一个CGI进程,严重消耗了服务器资源。
Java的解决方案
java中 Servlet和Web容器被设计用来解决CGI问题。
Servlet:是一个在Web服务器端或者用用服务器端的程序。主要用于在服务器上产生动态HTML。Servlet是与平台无关的java类,能够编译平台中立的字节码。
web容器:
Select类中没有main方法,Servlet受控于另一个java用用程序,这个java程序就称作Web容器,Web容器负责管理和运行Servlet。
Web容器对Servlet的支持:
通信支持:利用容器提供的方法,我们能轻松地让Servlet和Web容器对话。
生命周期管理:容器控制着Servlet的生与死。它会负责加载类、实例化、和初始化Servlet、调用Servlet方法,以及使Servlet实例能够被垃圾回收,有了容器的控制,我们就不多地考虑容器的资源了。
多线程支持:容器会自动地为它接受的每个Servlet请求创建一个新的java线程。
JSP支持:容器会自动把JSP翻译成为Servlet代码。
处理安全性:Java Web应用程序通常需要实现安全性控制,限制用户可以访问的资源。