Java Web 发展历史(一)静态页面时期和CGI时期

水煮Java 专栏收录该内容
27 篇文章 1 订阅

Java语言基础的学习暂时告一段落,接下来将进入Java WEB世界,WEB基于客户端服务端架构,客户端和服务端使用HTTP协议来通信。 在学习Java WEB开发之前有必要了解WEB发展史,通过学习WEB发展史我们可以知道每种技术为什么会出现以及为什么被取代,从而了解这些技术的使用场景,在以后工作中或许可以用到这些技术。本文将介绍静态网页和CGI时代。

静态页面时期

静态页面时期每一个页面都是一个HTML文件,而且这些HTML文件都是预先写好的。服务端的主要工作就是把客户端请求的页面从磁盘读取到内存然后发送给客户端,而读取发送文件可以交给专门的服务程序来做(类似现在的Nginx和Apache等软件),所以这个时期的程序员的主要工作就是编写HTML文件。下图是访问静态页面index.html示意图:

访问静态页面的网络延时非常低,从发起请求到接受到响应只需很少的时间,这是因为访问静态页面的主要工作是从磁盘上读取文件,可以使用缓存技术把文件缓存到内存,这样一来读写文件的速度将非常快,请求的响应速度也将非常快。

静态页面不能管理用户的数据,也不能根据用户的不同输入来展示数据,我们希望WEB程序和普通的PC程序一样可以存储数据并动态的展示数据,CGI技术应运而生。

CGI

前一节中我们已经知道静态页面就是存储在磁盘上的HTML页面。而动态页面则是通过执行一个程序来生成HTML页面,本文把它称之为动态程序。那么有谁来执行这个动态程序呢?答案是WEB服务器例如Nginx,当WEB服务器接收到请求以后会调用动态程序生成HTML页面并返回给客户端。WEB服务器和动态程序间需要进行数据交互,例如WEB服务器需要把客户端发起的请求的参数和内容传递给动态程序,而动态程序需要把生成的HTML页面返回给WEB服务器,WEB服务器和动态程序之间的数据交互规范称为CGI。

CGI全称为Common Gateway Interface,中文称之为通用网关接口,这个名字很容易让人想到计算机网络里面的网关Gateway,实际上它们之间没有任何联系。CGI编程指的是编写可以生成HTML的动态程序,我们可以选择C/C++ 、Python、lua等很多语言来编写动态程序。

开始编写动态程序之前需要先了解最基本的数据交互规范,即怎么获取HTTP请求以及怎么把生成的HTML页面返回给WEB服务器。CGI是这样定义的,动态程序通过读取标准输入获取HTTP的内容(HTTP协议的body内容),通过环境变量QUERY_STRING来获取GET请求的参数,把最终生成的HTML页面写到标准输出。下面是WEB服务器调用动态程序的流程:

  1. 接收到客户端的请求
  2. 设置动态程序的环境变量QUERY_STRING其值为HTTP GET请求的参数,如:“user=762&action=edit”。如果没有参数则为空
  3. 把HTTP请求的body内容写到动态程序的标准输入,对于POST请求body即表示表单内容
  4. 启动动态程序进程
  5. 读取动态程序的标准输出获取HTML内容
  6. 把HTML内容返回给客户端

上面提到的设置环境变量、设置子进程的标准输入标准输出等操作都是操作系统的系统调用,如果对这些细节感兴趣可以搜索setenv、pipe、dup、dup2,也可以去阅读WEB服务器的源代码。

了解以上内容以后我们就可以编写动态程序了,下面是一个简单的动态程序示例:

#include <stdio.h>
int main()
{
    printf("<html>\n");
    printf("<body>\n");
    printf("<h1>hello CGI!</h1>\n");
    printf("</body>\n");
    printf("</html>\n");
    return 0;
}
//编译命令
//gcc cgi.c -o hellocgi

上例将输出一个简单的HTML页面,假设这个动态程序的访问地址是http://127.0.0.1/cgi-bin/hellocgi,下面是访问示意图:

CGI解决了静态网页的问题,使用轻量级的脚本语言(如lua)可以在嵌入式设备上提供WEB服务。但是它也有自身的缺陷,其主要缺陷是每接收到一个客户端请求都要创建一次进程(执行动态程序),创建进程有时间开销,最终会影响请求的响应速度。为了解决这个问题一种名为FastCGI的技术面世了,FastCGI技术可以预先创建好进程,当客户端请求到来时直接使用这些预先创建的进程来得到HTML。PHP使用的就是FastCGI技术,而Java则使用Servlet技术来解决这个问题。

结语

虽然上面两种技术历史悠久,但是现在仍在使用,例如很多网站都有静态页面,很多路由器设备的管理程序使用CGI实现。接下来我们将学习Java Servlet技术来实现动态页面。

 

 

【水煮Java】
  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页

打赏作者

烧水匠

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值