1.1 Web技术的发展

随着Internet的发展,基于HTTP协议和HTML标准的Web应用呈几何数量级的增长,人们的生活在不知不觉中已经被网络悄悄地改变了。在网络普及之前,我们购买图书要去书店,给亲人汇钱要去邮局或者银行……而现在,一切都是这么便捷,你可以在网上购买图书、汇款、缴纳电话费,你甚至可以为远在他乡的女朋友订购一束玫瑰。各种各样的网上业务丰富了我们的生活,节省了我们的时间,提高了我们的工作效率,改善了我们的生活品质。支撑这些网上业务的就是各种各样的Web应用,而这些Web应用又是用各种Web技术开发的。

早期的Web应用主要是静态页面的浏览(如新闻的浏览),这些静态页面使用HTML语言来编写,放在服务器上;用户使用浏览器通过HTTP协议请求服务器上的Web页面,服务器上的Web服务器软件接收到用户发送的请求后,读取请求URI所标识的资源,加上消息报头发送给客户端的浏览器;浏览器解析响应中的HTML数据,向用户呈现多姿多彩的HTML页面。整个过程如图1-1所示。

图1-1 浏览器请求静态页面

随着网络的发展,很多线下业务开始向网上发展,基于Internet的Web应用也变得越来越复杂,用户所访问的资源已不仅仅局限于在服务器硬盘上存放的静态网页,更多的应用需要根据用户的请求动态生成页面信息,复杂一些的还需要从数据库中提取数据,经过一定的运算,生成一个页面返回给客户。例如,笔者通过Web浏览器想要查询本公司一年的销售报表,这个销售报表是根据一年的销售数据得出的,而这一年的销售数据非常多,通常都是存储在数据库中,当Web服务器端软件接收到客户端的请求,就需要从数据库中提取一年的数据,然后按照一定的统计规则,通过计算生成报表页面,发送到请求者的Web浏览器端。类似于上述的应用还有很多,要为用户提供各种各样的增强功能,就需要我们在Web服务端通过软件来实现。可是这种实现,如何才能完成呢?

了解HTTP协议的读者,可能会想到,可以遵循HTTP协议实现一个服务器端软件,提供增强功能。想法本身没有错误,但是由于HTTP协议服务器端的实现较为复杂,需要考虑很多方面,而且由于应用的广泛性,不可能针对每一种应用都去实现这样的一个HTTP服务器,所以这种方法在现实中不太可行。还有一种方法,就是利用已经实现HTTP协议的服务器端软件,而这些软件预先为我们留出了扩展的接口,我们只需要按照一定的规则去提供相应的扩展功能。当这类Web服务器接收到客户请求后,判断请求是否是访问我们提供的扩展功能,如果是,就将请求交由我们所编写的程序去处理。当处理完成后,程序将处理结果交回Web服务器软件,Web服务器软件拿到结果信息后,再将结果作为响应信息返回给客户端。第二种方式的好处在于,我们不需要对HTTP协议有过多的了解,HTTP协议服务器端的实现已经由Web服务器软件完成了,我们只需要根据我们的应用去开发相应的功能模块,然后将这些功能模块按照你所采用的Web服务器软件的要求,部署到Web服务器中进行集成。在用户看来,Web服务器端就是一个整体,在为他/她提供服务。

早期使用的Web服务器扩展机制是CGI,它允许用户调用Web服务器上的CGI程序。CGI的全称是Common Gateway Interface,即公共网关接口。大多数的CGI程序使用Perl来编写,也有使用C、Python或PHP来编写的。用户通过单击某个链接或者直接在浏览器的地址栏中输入URL来访问CGI程序,Web服务器接收到请求后,发现这个请求是给CGI程序的,于是就启动并运行这个CGI程序,对用户请求进行处理。CGI程序解析请求中的CGI数据,处理数据,并产生一个响应(通常是HTML页面)。这个响应被返回给Web服务器,Web服务器包装这个响应(例如添加消息报头),以HTTP响应的形式发送给Web浏览器。整个过程如图1-2所示。

图1-2 用户访问CGI程序

然而CGI程序存在着一些缺点,主要是CGI程序编写困难、对用户请求的响应时间较长、以进程方式运行导致性能受限等。由于CGI程序的这些缺点,开发人员需要其他的CGI方案。1997年,SUN公司推出了Servlet技术,作为Java阵营的CGI解决方案。作为对微软ASP技术(1996年推出)的回应,SUN公司于1998年推出了JSP技术,允许在HTML页面中嵌入Java脚本代码,从而实现动态网页功能。与ASP、JSP类似的服务器端页面编写技术还有Rasmus Lerdorf于1994年发明的PHP技术。