1.13 Java与Internet

如果Java仅仅只是中重多的程序设计语言中的一种,你可能就会问:为什么它如此重要?尽管Java对于解决传统的单机程序设计问题非常有用,但同样重要的是,它解决了在万维网(WWWW)上的程序设计问题。

1.13.1.1客户/服务器计算技术

客户/服务器系统的核心思想是:系统具有一个中央信息存储池(central repository of information),用来存储某种数据,它通常存在于数据库中,你可以根据需要将它分发给某些人员或机器集群。

客户/服务器计算技术的基本概念并不复杂。问题在于你只有单一的服务器,却要同时为多个客户服务。如果客户端软件发生变化,那么它必须被重新编译,调试并安装到客户端机器上,事实证明这比想象的要更加复杂与费力。算起来客户/服务器计算技术大概占了所有程序设计行为的一半。

1.13.1.1 Web就是一台巨型服务器

Web实际上就是一个巨型客户/服务器系统,苏有的服务器和客户机都同时共存于同一个网络中。你索要关心的只是在某一时刻怎样连接到一台服务器上,并与之进行交互。

最初只有一种很简单的单向过程:你对某个服务器产生一个请求,然后它返回给你一个文件,你的机器上的浏览器软件根据本地机器的格式来解读这个文件。

Web浏览器向前跨进了一大步,它包含了这样的概念:一段信息不经过修改就可以在任意幸好的计算机上现实,然而,最初的浏览器仍然相当原始,很快就因为加诸于其上的种种需要而陷入困境。

为了解决这个问题,人们采用了一种方法:通过引入在客户端浏览器中运行程序的能力来解决,这被称为“客户端编程”。

1.13.2 客户端编程

Web最初的“服务器-浏览器”设计是为了能头提供交互性的内容,但是其交互性完全由服务器提供。服务器产生Html(HyperText Markup Language)静态页面交给客户端解释。而服务器端通过CGI(common gateway interface)接收客户端传来的简单表单数据利用Perl,python等语言进行处理。所有的运算处理工作全部都会由服务器端完成,这个过程不仅很慢,而且不太优雅。

问题的解决方法就是客户端编程。客户端编程意味着Web浏览器能用来执行任何它可以完成的工作,使得返回给用户的结果更加迅捷,而且使得你的网站更加具有交互性。客户端编程的问题和方法总结如下:

  1. 插件:客户端编程所玩出的最重要的一步就是插件( plug-in)的开发。
  2. 脚本语言:插件引发了浏览器脚本语言(scripting language)的开发。通过使用某种脚本语言,你可以将客户端程序的源代码直接嵌入到HTML页面中,解释这种语言的插件在HTML页面被现实时自动激活。如果你期望有一种脚本语言在Web浏览器不需要任何插件的情况下就可以得到支持,那么非JavaScript莫属。脚本语言主要是用来创建更丰富,更具有交互性的图形化用户界面(graphic user interface GUI)。
  3. Java:Java是通过applet以及使用Java Web Start来进行客户端编程的。
  4. 备选方案:但是实际上Java applet始终没有得到大规模应用。作为备选方案,Macromedia的Flex,它允许你创建基于Flash的与applet相当的应用。它远比JavaScript要吸引人得多。
  5. .NET和C#:.NET平台大致于相当于Java虚拟机和Java类库,而C#毫无疑问与Java有类似指出。目前,.NET主要受攻击的地方和人们所关心的最重要的问题是,微软是否允许将它完全地移植到其他平台上。
  6. Internet与Intranet:略

1.13.3服务器端编程

前面的讨论忽略了服务器端编程的话题,它是Java已经取得巨大成功的因素之一。当提出对服务器的请求后,会发生什么呢?大部分时间,请求只是要求“给我发送一个文件”。更为复杂的对服务器的请求通常涉及数据库事物。过去,服务器端编程都是通过使用Perl,Python,等语言编写CGI程序而实现的,但却造成了从此之后更复杂的系统。其中就包括基于Java的Web服务器,它让你用Java编写被称为servlet的程序来实现服务器端编程。

1.14 总结

因为OOP在你能够在过程型语言中找到的概念的基础上,又添加了许多新概念,所以你可能会自然地假设:由此而产生的Java程序比等价的过程型程序要复杂得多。但是你会感到很惊喜:编写良好的Java程序通常比过程型程序要简单的多,而且也易于理解得多。你看到的只是有关下面两部分内容的定义:用来表示问题空间概念的对象,以及发送给这些对象的用来表示在此空间内的行为的消息。面向对象程序涉及带给人们的喜悦之一就是:对于设计良好的程序,通过阅读它就可以很容易地理解其代码。通常,其代码也会少很多,因为许多问题都可以通过重用现有的类库代码而得到解决。