1.13 Java和Internet

来源:互联网 发布:清除下载器数据 编辑:程序博客网 时间:2024/05/16 18:15

如果Java仅仅只是众多的程序设计语言中的一种,你可能会问:为什么它如此重要?是什么它促使计算机编程语言向前迈进了革命性的一步?如果从传统的程序设计观点来看,问题的答案似乎不太明显。尽管Java对于解决传统的单机程序设计问题非常有用,但同样重要的是,它解决了在万维网(WWW)上的程序设计问题。
1.13.1 Web是什么
Web一次乍一看有点神秘,就像网上冲浪、表现、主页一样,回头审视它真是面貌有助于对它的理解,但是要这么做就必须先理解客户/服务器系统,它是计算技术中另一个充满了诸多疑惑的话题。
1.客户/服务器技术
客户/服务器系统的核心思想就是:系统具有一个中央信息存储池,用来存储某种数据,它通常存在于数据库中,你可以根据需要将它分发给某些人员或者机器集群。客户/服务器概念的关键在于信息存储池的为止集中于中央,这使得它可以被修改,并且这些修改将被传播给信息消费者。总之,信息存储池、用于分发信息的软件以及信息与软件所驻留的机器或机群被总称为服务器。驻留在用户机器上的软件与服务器进行通信,以获取信息、处理信息,然后将他们现实在被称为客户机的用户机器上。
客户/服务器计算技术的基本概念并不复杂。问题在于你只有单一的服务器,却要同时为多个客户服务。通常这会涉及数据库管理系统,因此设计者把数据“均衡“分布于数据表中,已取得最优的使用效果。此外,系统通常允许客户在服务器中插入新的信息。这意味着必须保证一个客户插入的新数据不会覆盖另一个客户插入的新数据,也不会在将其添加到数据库的过程中丢失。如果客户端软件发生变化,那么它必须被重新编译、调试并安装到客户端机器上,试试证明这笔想象中要更加复杂与飞离。如果向支持多种不同类型的计算机和操作系统,问题将更加麻烦。最后还有一个最重要的性能问题:可能在任意时刻都有成百上千的客户向服务器发送请求,所以任何小的延迟都会产生重大影响。为了将延迟最小化,程序员努力减轻处理任务的负载,通常是分赛给客户端机器处理,但有时也会使用所谓的中间件将负载分散给在服务器段的其他机器。
分发信息这个简单的思想的复杂性实际上是有很多不同层次的没这使得整个问题可能看起来高深莫测。但是它仍然至关重要:算起来客户/服务器计算技术大概占了所有程序设计行为的一般,从指定交易订单、信用卡交易到包括股票市场、科学计算、政府、个人在哪的任意类型的数据分发。过去我们所作的,都是针对某个问题发明一个单独的解决方案,所以每一次都要发明一个新的方案。这些方案难以开发并且难以使用,而且用户对每一个方案都要学习新的接口。因此,整个客户/服务器问题需要彻底解决。
2. Web就是一台巨型服务器
Web实际上就是一个巨型客户/服务器系统,但稍微差一点,因为所有的服务器和客户机都同时共存与同一个网络中。你不需要了解这些,因为你所要关心的只是在某一时刻怎样链接到一台服务器上,并与只进行交互。
最初只有一种简单的单行过程:你对某个服务器产生一个请求,然后它返回给你一个文件,你的机器上的浏览器软件根据本地机器的格式来解读这个文件。但是很快人们就希望能够做的更多,而不仅仅是从服务器传递会页面。人们希望时间整个的客户/服务器能力,使得客户可以将信息反馈给服务器。例如,在服务器上进行数据库查找,将新信息添加到服务器以及下订单。这些变革,正是我们在Web发展过程中所目睹的。
Web浏览器向前跨进了一大步,它包含了这样的概念:一段信息不经修改就可以在任意型号的计算机上现实。然而,最初的浏览器仍然相当原始,很快就因为加诸于其上的种种需要而陷入困境。浏览器并不具备显著的交互行,而且它趋向于服务器和Internet阻塞,因为在任何时候,只要你需要完全通过编程来实现任务,就必须将信息发回到服务器区处理。这使得即便是发现你的请求中的拼写错误也要话树苗甚至是数分钟的时间。因为浏览器只是一个观察器,因此它甚至不能执行最简单的计算任务。
为了解决这个问题,人们采用了各种不同的方法。首先,图形标准得到了增强,使得在浏览器中可以播放质量更好的动画和视频。剩下的问题通过引入在客户端浏览器中运行程序的能力就可以解决。这被称为“客户端编程“。
1.13.2 客户端编程
Web最初的“服务器–浏览器“设计是为了能够提供交互性的内容,但是交互性完全有服务器提供。服务器产生静态页面,提供给只能解释并显示他们的客户端浏览器。基本的HTML包含有简单的数据收集机制:文本输入框、复选框、单选框、列表和下拉式列表以及按钮–它只能被编程来实现抚慰表单上的数据或提交表单傻姑娘的数据给服务器。这种提交动作通过所有的Web服务器都提供的通用网管接口传递。提交内容会告诉CGI应该如何处理它。最常见的动作就是运行一个在服务器中常被明明为cgi-bin的目录下的一个程序。几乎所有的语言都可以用来编写这些程序,Prel已经成为了最常见的选择,因为他被设计用来处理文本,并且是解释型语言,因此无论服务器的处理器和操作系统如何,它都适于安装。然而,Python已对其产生了重大的臭给你奇迹,因为它更加强大且更加简单。
当今许多有影响力的网站王权构建与CGI智商,实际上你几乎可以通过CGI做任何事。然而,构件于CGI程序之上的网站可能会迅速变得过于复杂而难以维护,并同时产生响应时间过长的问题。CGI程序的响应时间依赖于所必须发送的数据流的大小,以及浏览器和Internet的负载。Web的最初设计者们并没有遇见到网络贷款被人们开发的各种应用迅速耗尽。例如,任何行驶的动态图形处理几乎都不可能连贯的执行,因为图形交互格式的文件必须在服务器端创建每一个图形版本,并发送给库户端。再比如,你肯定经历过对Web输入表单进行数据娇艳的过程:你按下网页上的提交按钮,数据被发送到服务器,服务器启动一个CGI程序来检查、发现错误,并将错误组装成一个HTML页面,然后将这个页面发回给你;之后你必须回退一个页面,然后重新再试。这个过程不仅很慢,而且不太优雅。
问题的解决方法就是客户端编程。大多数运行Web浏览器的机器都是能够执行大型任务强有力的引擎。在使用原始的静态HTML方式的情况下,他们只是闲在哪里,等着服务器送来下一个页面。客户端编程意味着Web浏览器能用来执行任何它可以完成的工作,使得返回给用户的结果更加迅捷,而且使得你的网站更具有交互性。
客户端编程的问题是:它与通常意义上的编程十分不同,参数几乎相同,而平台却不同。Web浏览器就像一个功能受限的操作系统。最终,你仍然必须编写程序,而且还得要处理那些令人头昏烟花的成堆的问题,并以客户端编程的方式来产生解决方案。
1.插件
客户端编程所迈出的最重要的一步就是插件的开发。通过这种方式,程序员可以下载一段代码,并将其插入到浏览器中适当的为止,以此来为浏览器添加新功能。它告诉浏览器:从现在开始,你可以采取这个新行动了。某些更快更强大的行为都是通过插件添加到服务器中的。但是编写插件并不是件轻松的事,也不是构件某戈丁网站的过程中所要做的事情。插件对于客户端编程的价值在于:它允许专家级的程序员不需经过浏览器生产厂商的许可,就可以开发某种语言扩展,并将他们添加到服务器中。因此,插件提供了一个后门,使得可以创建新的客户端编程语言。
2.脚本语言
插件引发了浏览器脚本语言的开发。通过某种脚本语言, 你可以将客户端程序的源代码直接嵌入到HTML页面中,解释这种语言的插件在HTML被现实时自动激活。脚本语言先天就相当易于理解,因为他们只是作为HTML页面一部分的简单文本,当服务器收到要获取该页面的请求时,他们可以被快速家在。此方法的缺点是代码会暴露给任何人区浏览。但是,通常不会使用脚本语言去做相当复杂的事情,所以这个缺点并不太眼中。
如果你期望有一种脚本语言在Web浏览器不需要任何插件的情况下就可以得到支持,那它非JavaScript莫属。遗憾的是,大多数Web浏览器最初都是以彼此相异的方式来实现对JavaScript的支持的,这种差异甚至存在于同一种浏览器的不同版本之间。通常,你必须以JavaScript的某种最小公分母来实现编程,以使得你的程序可以在所有浏览器上运行。JavaScript的错误处理的调试只能一团糟来形容。作为其使用艰难的证据,我们可以看到知道最近才有人创建了真正复杂的JavaScript脚本片段,并且编写这样的脚本需要超然的奉献精神和超高的专业技巧。
这也表明,在Web浏览器内部使用的脚本语言实际上总是被用来解决特定类型的问题,主要是用来创建更丰富、更具有交互性的图形化用户洁面。但是,脚本语言可以解决客户端编程中所遇到的百分之八十的问题。你的问题可能正好落在这百分之八十的范围内,由于脚本语言提供了更容易、更快捷的开发方式,因此你应该在考虑诸如Java这样的负载的解决方案之前,先考虑脚本语言。
3.Java
如果脚本语言可以解决客户端编程百分之八十的问题的话,那么剩下的那百分之二十又该怎么办呢?Java是处理他们最流行的解决方案。Java不仅是一种功能强大的、安全的、跨平台的、国际化的编程语言,而且它还在不断的被扩展,以提供更多的语言功能的类库,能够优雅的处理在传统编程语言中很难解决的问题,例如并发、数据库访问、网络编程和分布式计算。Java是通过applet以及使用Java Web Start来进行客户端编程的。
applet是只在Web浏览器中运行的小程序,它是作为网页的一部分而自动下载的。当applet被激活时,他便开始执行一个程序,这正是它优雅之处:它提供了一种分发软件的方法,一旦用户需要客户端软件时,就自动从服务器把客户端软件分发给用户。用户获取最新版本的客户端软件时不会产生错误,而且也不需要很麻烦的重新安装过程。Java的这种设计方式,使得程序员只需要创建单一的程序,而只要一台计算机有浏览器,且浏览器具有内置的Java解释器,那么这个程序就可以自动在这台计算机上运行。由于Java是一种成熟的编程语言,所以在提出对服务器的请求之前和之后,可以在客户端尽可能的多做些事情。例如,不必跨网络的发送一张请求表单来检查自己是否填写了错误的日期和其他参数,库户端计算机就可以快速的标出错误数据,而不用等待服务器做出标记并给你传回图片。这不仅立即就可以获得了高速度和快速的响应能力,而且也降低了网络流量和服务器负载,从而不会使这个那个Internet的速度都慢了下来。
4.备选方案
老实说,Java applet没有达到当初它所吹嘘的境界。当Java首度出现时,似乎大家最欢欣鼓舞的莫过于applet了,因为他们最终都将解决严峻的客户端可编程行问题,从而提高基于互联网的应用可相应性,同时降低了他们对带宽的需求。人们展望到了大量的可能性。
实际上,你可以发现在Web上确实存在一些非常灵巧的applet,但是压倒性的向applet的迁移始终未发生。这其中最大的问题可能在于安装Java运行时环境所必须的10MB带宽对于一般用户来说过于恐怖了,而微软没有选择在IE中包含JRE这一事实也许从此已经封杀了applet的命运。无论怎样,Java Apple十周没有得到大规模的应用。
尽管如此,applet和Java Web Start应用在某些情况下仍旧很有价值。无论何时,只要你想控制用户的机器,例如在一个公司的内部,使用这些技术来发布和更新客户端应用就显得非常恰当,并且这可以节省大量的时间、人力和财力,特别是你需要频繁的更新的时候。
在“图形化用户界面“一章中,我们将看到一种折中的新技术,Macromedia的Flex,它允许你创建基于Flash的与applet相当的应用。因为Flash Player在超过98%的Web浏览器上都可以用,因此它被认为是事实上已被接收的标准。安装和更新Flash Player都十分快捷。ActionScript语言是基于ECMAScript的,因此我们对它应该很熟悉,但是Flex使得我们在编程时无需担心浏览器相关性,因此,它远比JavaScript要吸引人的多。对于客户端编程而言,这是一种值得考虑的备选方案。
5. .NET和C#
曾几何时,Java applet的主要竞争对手是微软的ActiveX–尽管它要求客户端必须运行Windows平台。从哪以后,微软以.NET平台和C#编程语言的形式推出了与Java全面竞争的对手。.NET平台大致相当于Java虚拟机和Java类库,而C#毫无疑问与Java有类似之处。这当然是微软在编程语言与编程环境这块竞技场上所做出的最出色的成果。当然,他们有相当大的有利条件:他们可以看得到Java在什么方面做的好,在什么方面做的还不够好,然后基于此区构建,并要具备Java不具备的有点。这是自从Java出现以来,Java所碰到的真正的竞争。因此,Sun的Java设计者们已经认真仔细的去研究了C#,以及为什么程序员们可能会转而使用它,然后通过在Java SES中对Java做出了重大改进而做出了回应。
目前,.NET主要受攻击的地方和人们所关心的最重要的问题就是,微软是否会允许将它完全的移植到其他平台上。微软宣称这么做没有问题,而且Mono项目已经有了一个在Linux上运行的.NET的部分实现,但是,在该实现完成及微软不会排斥其中的任何部分之前,.NET作为一种跨平台的解决方案仍旧是异常高风险的赌博。
6. Internet和Intranet
Web是最常用的解决客户/服务器问题的方案,因此,即便解决这个问题的一个子集,特别是公司内部的典型的客户/服务器问题,也一样可以是用这项技术。如果采用传统的客户/服务器方式,可能会遇到客户端计算机有多种型号的问题,也可能会遇到安装新的客户端软件的麻烦,而它们都可以很方便的通过Web浏览器和客户端编程得以解决。当Web技术仅限于特定公司的信息网络时,它就被称为Intranet。Intranet比Internet提供了更高的安全性,因为可以物理的控制对公司内部服务器的访问。从培训的角度看,似乎一旦人们理解了浏览器的基本概念之后,对他们来说,处理网页和applet的外观差异就会容易的多,因此对新型系统的学习曲线也就减缓了。
安全问题把我们带到一个领域,这似乎是在客户端编程世界自动生成的。如果程序运行在Internet之上,那么就不可能知道它将运行在什么样的平台之上,因此,要格外小心,不要传播有bug的代码。你需要跨平台的、安全的语言,就像脚本语言和Java。
如果程序运行于Intranet上,那么可能会受到不同的限制,企业内所有的机器都采用Intel/Windows平台并不是什么稀奇的事。在Intranet上,你可以对自己的代码质量负责,并且在发现bug之后可以修复它们。此外,你可能已经有了以前使用更传统的客户/服务器方式编写的遗留代码,因此,你必须在每一次升级时都要物理的重装客户端程序。在安装升级程序时所浪费的时间是迁移到浏览器方式上的最主要原因,因为在浏览器方式下,升级是透明的、自动的。如果你身处这样的Intranet之中,那么最有意义的方式就是选择一条能够使用现有代码库的最短的捷径,而不是用一种新语言重新编写你的代码。
当面对各种令人眼花缭乱的解决客户端编程问题的方案时,最好的方法就是进行性价比分析。认真考虑问题的各种限制,然后思考哪种解决方案可以成为最短的捷径。既然客户端编程仍然需要编程,那么针对自己的特殊应用选取最宽的开发方式是最好的做法。为那些程序开发中不可避免的问题提早作准备是一种积极的态度。
1.13.3 服务器端编程
前面的讨论忽略了服务器端编程的话题,它是Java已经取得巨大成功的因素之一。当提出对服务器的请求后,会发生什么呢?大部分时间,请求只是要求“给我发送一个文件“,之后浏览器会以某种方式解释这个文件,例如将其作为HTML页面、图片、JavaScript或脚本程序等。
更复杂的对服务器的请求通常涉及到数据库事物。常见的清醒是复杂的数据库搜索请求,然后服务器将对结果进行编排,使其成为一个HTML页面发送给客户端。另一种常见情形是,当你要加入一个团体或下订单时,可能向在数据库中注册自己的名字,这将涉及对数据库的修改。这些数据库请求必须通过服务器端的某些代码来处理,这就是所谓的服务器编程。过去,服务器端编程都是通过Perl、Python、C++或其他某种语言编写的CGI程序而实现的,但却造成饿了从此之后更加复杂的系统。其中就包括基于Java的Web服务器,它让你用Java编写被成为servlet的程序来实现服务器端编程。servlet及其衍生物JSP,是许多开发网站的公司迁移到Java上的两个重要的原因,尤其是因为他们消除来处理具有不同能力的浏览器时所遇到的问题。

原创粉丝点击