编程那点事编程那点事

专注编程入门及提高
探究程序员职业规划之道!

对象导论:Java与Internet

为什么Java如此重要?为什么它促使计算机编程语言向前迈进了革命性的一步?如果从传统的程序设计观点看,问题的答案似乎不太明显。尽管Java对于解决传统的单机程序设计问题非常有用,但是同样重要的是,它解决了在万维网(WWW)上的程序设计问题。

Web是什么

要理解web必须先理解客户/服务器(C/S)系统,它是计算技术中另一个充满了诸多疑惑的话题。

C/S计算技术

C/S系统的核心思想是:系统具有一个中央信息存储池(通常就是数据库),用来存储某种数据,你可以根据需要将它分发给某些人员或机器集群。C/S概念的关键在于信息存储池的位置集中于中央,这使得它可以被修改,并且这些修改将被传播给信息消费者。总之,信息存储池、用于分发信息的软件以及信息与软件所驻留的机器或机群被总称为服务器。驻留在用户机器上的软件与服务器进行通信,以获取信息、处理信息,然后将它们显示在被称为客户机的用户机器上。

C/S的基本概念并不复杂。问题在于你只有单一的服务器,却要同时为多个客户服务。通常这会涉及数据库管理系统,因此设计者把数据“均衡”分布于数据表中,以取得最优的使用效果。此外,系统通常允许客户在服务器中插入新的信息。这意味着必须保证一个客户插入的新数据不会覆盖另一个客户插入的新数据,也不会在将其添加到数据库的过程中丢失。如果客户端软件发生变化,那么它必须被重新编译、调试并安装到客户端机器上,事实证明这比想象的要更加复杂和费力。如果想支持多种不同类型的计算机和操作系统,问题将更麻烦。最后还有一个最重要的新能问题:可能在任意时刻都有成百上千的客户向服务器发出请求,所以任何小的延迟都会产生重大影响。为了将延迟最小化,程序员努力减轻任务处理的负载,通常是分散给客户端机器处理,但有时也会使用所谓的中间件将负载分散给在服务器端的其他机器。

分发信息这个简单思想的复杂性实际上是有很多不同层次的,这使得整个问题可能看起来高深莫测。但是它任然至关重要:算起来C/S计算技术大概占了所有程序设计行为的一半,从制定订单、信用卡交易到包括股票市场、科学计算、政府、个人在内的任意类型的数据分发。过去我们所做的,都是针对某个问题发明一个单独的解决方案,所以每一次都要发明一个新的方案。这些方案难以开发且难以使用,而且用户对每个方案都要学习新的接口。因此,整个C/S问题都需要彻底解决。

web就是一台巨型服务器

Web实际上就是一个巨型C/S系统,但稍微差一点,因为所有的服务器和客户机都同时共存于同一个网络中。你不需要了解这些,因为你所要关心的只是在某一时刻怎样连接到一台服务器上,并与之进行交互。

最初只有一种很简单的单向过程:你对某个服务器产生一个请求,然后它返回给你一个文件,你的机器上的浏览器软件根据本地机器的格式来解读这个文件。但是很快人们就希望能做的更多,而不仅仅是从服务器传递给页面。人们希望实现完整的客户/服务器能力,使得客户可以将信息反馈给服务器。例如,在服务器上进行数据库查找,将新信息添加到服务器以及下订单。这些变革,正是我们在Web发展过程中所目睹的。

Web浏览器向前跨进了一大步,它包含了这样的概念:一段信息不经修改就可以在任意型号的计算机上显示。然而,最初的浏览器仍然相当原始,很快就因为加诸于其上的种种需要而陷入困境。浏览器并不具备显著的交互性,而且它趋向于使服务器和Internet阻塞,因为在任何时候,只要你需要完成通过编程来实现的任务,就必须将信息发回到服务器去处理。这使得即便是发现你的请求中的拼写错误也要花去数秒甚至数分钟的时间。因为浏览器只是一个观察器,因此它甚至不能执行最简单的计算任务。(另一方面,它却是安全的,因为它在你的本地机器上不会执行任何程序,而这些程序有可能包含bug和病毒)

为了解决这个问题,人们采用了各种不同的方法。首先,图形标准得到了增强,使得在浏览器中可以播放质量更好地动画和视频。剩下的问题通过引入在客户端浏览器中运行程序的能力就可以解决。这被称为“客户端编程”

客户端编程

Web最初的“服务器-浏览器”设计是为了能够提供交互内容,但是其交互性完全由服务器提供。服务器产生静态页面,提供给只能解释并显示他们的客户端浏览器。基本的HTML包含有简单的数据收集机制:文本输入框、复选框、单选框、列表和下拉式列表以及按钮----它只能被编程来实现复位表单上的数据或提交表单上的数据给服务器。这种提交动作通过所有的Web服务器都提供的通用网关接口传递。提交内容会告诉CGI应该如何处理它。最常见的动作就是运行一个在服务器中被长命名为“cgi-bin”的目录下的一个程序。(当点击了网页上的按钮时,如果观察浏览器窗口顶部的地址,有时可以看见“cgi-bin”的字样混迹在一串冗长和不知所云的字符串中)几乎所有的语言都可以来编写这些程序,Perl已经成为最常见的选择,因为它被设计用来处理文本,并且是解释性语言,因此无论服务器的处理器和操作系统如何,它都适于安装。然而Python已对其产生了重大的冲击,因为它更强大且更简单。

当今许多有影响力的网站完全构建于CGI之上的,实际上你几乎可以通过CGI做任何事情。然而,构建于CGI程序之上的网站可能会迅速变得过于复杂而难以维护,并同时产生响应时间过长的问题。CGI程序的响应时间依赖于所必须发送的数据量的大小,以及服务器和Internet的负载。(此外,启动CGI程序也相当慢)Web的最初设计者们并没有预见到网络宽带被人们开发的各种应用耗尽。例如,任何形式的动态图形处理几乎都不可能连贯地执行,因为图形交互格式的文件必须在服务器端创建每一个图形版本,并发送给客户端。再比如,你肯定经历过对Web输入表单进行数据验证的过程:你按下网页上的提交按钮;数据被发送回服务器;服务器启动一个CGI程序来检查、发现错误,并将错误组装为一个HTML页面,然后将这个页面发回给你;之后你必须回退一个页面,然后重新再试。这个过程不仅很慢,而且不太优雅。

问题的解决方法就是客户端编程。大多数运行Web浏览器的机器都是能够执行大型任务的强有力的引擎。在使用原始的静态HTML方式的情况下,他们只是闲在那里,等着服务器送来下一个页面。客户端编程意味着Web浏览器能用来执行任何它可以完成的工作,使得返回给用户的解决更加迅捷,而且使得你的网站更加具有交互性。

客户端编程的问题是:它与通常意义上的编程十分不同,参数几乎相同,而平台却不同。Web浏览器就像一个功能受限的操作系统。最终,你仍然必须编写程序,而且还得处理那些令人头晕眼花的成堆的问题,并以客户端编程的方式来产生解决方案。本节剩下的部分对客户端编程的问题和方法作一概述。

插件

客户端编程所迈出的最重要的一步就是插件开发。通过这种方式,程序员可以下载一段代码,并将其插入到浏览器中适当的位置,以此来为浏览器添加新功能。它告诉浏览器:从现在开始,你可以采取这个新行动了。某些更快更强大的行为都是通过插件添加到服务器中的。但是编写插件并不是件轻松地事,也不是构建某特定网站的过程中所要做的事情。插件对于客户端编程的价值在于:它允许专家级的程序员不需要经过浏览器生产商的许可,就可以开发某种语言扩展,并将它们添加到服务器中。因此,插件提供了一个后门,使得可以创建新的客户端编程语言(但并不是所有的客户端编程语言都是以插件的形式实现的)

脚本语言

插件引发了浏览器脚本语言的开发。通过使用某种脚本语言,你可以将客户端程序的源代码直接嵌入到HTML页面中,解释这种语言的插件在HTML页面被显示时自动激活。脚本语言先天就相当易于理解,因为它们只是作为HTML页面一部分的简单文本,当服务器收到要获取该页面的请求时,它可以被快速加载。此方法的缺点是代码会暴露给任何人去浏览(或窃取)。但是,通常不会使用脚本语言去做相当复杂的事情,所以这个缺点并不太严重。

如果你期望有一种脚本语言在Web浏览器不需要任何插件的情况下就可以得到支持,那它非JavaScript莫属。遗憾的是,大多数Web浏览器最初都是以彼此相异的方式来实现对JavaScript的支持,这种差异甚至存在于同一种浏览器的不同版本之间。以ECMAScript的形式实现的JavaScript的标准化有助于此问题的解决,但是不同的浏览器为了跟上这一标准化趋势已经花费了相当长的时间。通常,你必须以JavaScript的错误处理的调试只能一团糟来形容。作为其使用艰难的证据,我们可以看到直到最近才有人创建了真正复杂的JavaScript脚本片段,并且编写这样的脚本需要超然的奉献精神和超高的专业技巧。

这也表明,在Web浏览器内部使用的脚本语言实际上总是被用来解决特定类型的问题,主要是用来创建更丰富、更具有交互性的图形化用户界面。但是,脚本语言可以解决客户端编程中所遇到的百分之八十的问题。你的问题可能正好落在这百分之八十的范围之内,由于脚本语言提供了更容易、更快捷的开发方式,因此你应该在考虑诸如Java这样的更加复杂的解决方案之前,先考虑脚本语言。

Java

如果脚本语言可以解决客户端百分之八十的问题的话,那么剩下的百分之二十又该怎么办呢?Java是处理他们最流行的解决方案。Java不仅是一种功能强大的、安全的、跨平台的、国际化的编程语言,而且它还在不断地被扩展,以提供更多的语言功能和类库,能够优雅的处理在传统编程语言中很难解决的问题,例如并发、数据库访问、网络编程和分布式计算。Java是通过applet以及使用Java Web Start 来进行客户端编程的。

applet是只在Web浏览器中运行的小程序,它是作为网页的一部分而自动下载的。当applet被激活时,它便开始执行一个程序,这正是他优雅之处:它提供一种分发软件的方法,一旦用户需要客户端软件时,就自动从服务器把客户端软件分发给用户。用户获取最新版本的客户端软件时不会产生错误,而且也不需要很麻烦的重新安装过程。Java的这种设计方式,使得程序员只需创建单一的程序,而只要一台计算机有浏览器,且浏览器具有内置的Java解释器,那么这个程序就可以自动在这台计算机上运行。由于Java是一种成熟的编程语言,所以在提出对服务器的请求之前和之后,可以在客户端尽可能多地做些事情。例如,不必跨网络地发送一张请求表单来检查自己是否填写错了日期或其他参数,客户端计算机就可以快速地标出错误数据,而不用等待服务器做出标记并给你传回图片。这不仅立即就获得了高速度和快速的响应能力,而且也降低了网络流量和服务器负载,从而不会使整个Internet的速度都慢下来了

备选方案

老实说,Java applet没有达到当初它所吹嘘的境界。当Java首都出现时,似乎大家最欢迎鼓舞的莫过于applnet了,因为他们最终将解决严峻的客户端可编程性问题,从而提高基于互联网的应用的可响应性,同时降低它们对宽带的需求。人们展望到了大量的可能性。

实际上,你可以发现在Web上确实存在一些非常灵巧的applet,但是压倒性的向applet的迁移却始终未发生。这其中最大的问题可能在于安装Java运行时环境(JRE)所必需的10MB宽带对于一般的用户来说过于恐怖了,而微软没有选择在IE中包含JRE这一事实也许就此已经封杀了applet的命运。无论怎样,Java applet始终没有得到大规模的应用。

尽管如此,applet和Java Web Start应用在某些情况下仍旧很有价值。无论何时,只要你想控制用户的机器,例如在一个公司的内部,使用这些技术来发布和更新客户端的应用就显得非常恰当,并且这可以节省大量的时间、人力和财力,特别是你需要频繁更新的时候。

在“图形化用户界面”一章中,我们将看到一种折中的新技术,Macromedia的Flex,它允许你创建基于Flash的与applet相当的应用。因为Flash Player在超过98%的Web浏览器上都可用,因此它被认为是事实上已被接受的标准。安装和更新Flash Player都十分快捷。ActionScript语言是基于ECMAScript的,因此我们对它应该很熟悉,但是Flex使得我们在编程时无需担心浏览器相关性,因此,它远比JavaScript要吸引人得多。对于客户端编程语言,这是一种值得考虑的备选方案。

NET和C#

曾几何时,Java applet的主要竞争对手是微软的Active X----尽管它要求客户端必须运行Windows平台。从那以后,微软以.net平台和C#编程语言的形式推出了与Java全面竞争的对手。.net平台大致相当于Java虚拟机和Java类库,而C#毫无疑问与Java有类似之处。这当然是微软在编程语言与编程环境这块竞技场上所做出的最出色的成果。当然,他们有相当大的有利条件:他们可以看到Java在什么方面做得好,在什么方面做得不好,然后基于此去构建,并要具备Java 不具备的优点。这是自从Java出现以来,Java所碰到的真正的竞争。因此,Sun的Java设计者们已经认真仔细地去研究了C#,以及为什么程序员们可能会转而使用它,然后通过在Java SES中对Java做出的重大改进而做出了回应。

目前,.NET主要受攻击的地方和人们所关心的最重要的问题就是,微软是否会允许将它完全地移植到其他平台上。微软宣称这么做没有问题,而且Mono项目已经有了一个在Linux上运行的.NET的部分实现;但是,在该实现完成及微软不会排斥其中的任何部分之前,.NET作为一种跨平台的解决方案仍旧是一场高风险的赌博。


未经允许不得转载: 技术文章 » Java编程 » 对象导论:Java与Internet