现在的位置: 首页 > 综合 > 正文

从GWT说起

2012年12月16日 ⁄ 综合 ⁄ 共 2307字 ⁄ 字号 评论关闭
一直把GWT和GData混淆,大概也知道GWT可以把Java代码转变成Javascript代码,但却一直认为这只限于对服务器的远程调用。现在看了一下正式文档,原来更多的还是UI Toolkit。为什么这么多基于浏览器的UI
Toolkit呢?我想主要原因就是,大家太想把桌面应用程序的UI带到浏览器中了,而浏览器并不天然具备这些功能。

首先,让我们先来看一下桌面应用的情况。比如在Windows平台上,所谓的User.dll只提供了基本的窗口管理和GDI绘图功能,当然微软还实现了一些标准控件(所谓
Common
Control),比如Button,Menu,ListBox等等。之所以有标准控件,是为了避免重复造轮子,因为基本上所有的程序都要通过图形界面向
用户呈现,并接受用户的输入。在没有这些标准控件之前,比如DOS时代,用户只能自己利用最底层的绘图功能来实现。这样的代码太高,而且现实和操作都很不
规范。Windows的出现,或者有人说Mac也好,改变了这一点。所以现在我们说到文本输入,就知道用TextBox控件,需要用户确认,就知道要加一
个Button控件。这些标准的控件,大大规范了用户的操作,也提高了开发的效率。如果用专业一点的词汇来说,就是design
pattern,根据某个特定场景提供的解决方案。因为我们已经如此的习惯标准控件,所以找就淡忘了他说曾经带来的革命性变革。

但是,人们在实际中遇到的问题会复杂的多,而且各不相同,很快
准控件就不够用了。遇到这种情况,很多开发者又会重操宝刀自己开发控件。很多控件其实是在现有控件的基础上进行改良的,比如很多人都曾经在Button控
件的基础上开发过BitmapButton(也就是在Button上贴图),或者实现可点击TextLabel(模仿超链接)。每每这个时候,我们就会痛
骂微软为什么不在操作系统里直接提供这些常用的控件!估计微软也是害怕别人说他垄断,像IE那样。其实,我更愿意相信是微软不想跟第三方开发商竞争。作为
平台厂商只提供最基本的功能即可,其它的扩展应用留给别人吧
。毕竟,很多公司就是靠这些空白而生存的,微软不提供的,他们来提
供。不仅如此,因为用户的需求是千变万化的,没有哪一家公司能够全面满足。这样大家各有专攻,大家有饭吃。比如有些专门做表格控件,有些专门做流程图控
件,有些则提供Office风格的控件。当然了,一些开发工具厂商也会额外提供更多的通用控件。比如我们大家都很熟悉的Borland公司的Dephi和
C++
Builder等产品,就有很多通用控件的支持,大大提高了开发的速度。微软,在每一般新的WINDOWS版本面世的时候,也会提供一些新的控件,比如
Vista里就多出了Task Dialog。

在桌面应用时代,因为我们有很多的UI控件可供选择,所以UI呈现能力很强大,开发也很简
单。但是,到了Web应用时代,我们就遇到了麻烦。因为浏览器支持的HTML语言里,并没有很多的控件可用,所以早期的Web应用界面乏善可陈,比较简
陋,特别是交互性比较差。随着Web越来越流行,越来越多的应用以Web的方式来提供,终于促使了基于浏览器的UI控件的大发展。虽然HTML提供的标准
控件很少,但是基于现有的DOM+CSS+Javascript完全可以实现更复杂的UI控件,就像桌面应用曾经所做的那样。不仅如此,人们迫切的希望把
桌面应用开发的模式和经验直接搬到Web应用上来,以减少重新学习的成本,能直接照搬就最好了。

终于我们又讲到了GWT。Google
说,既然大家都是用的Java,很多人还用了Swing,SWT等Java的UI库,现在我们还是这么干。还是用Java,还是按照原来一样写界面,还是
用原来的UI库(呃,不是,应该是GWT库,用法类似。但是要根据Web应用模式进行相应的调整,而不能差别太大造成实现的困难,所以其实是重新封装
的)。这个GWT库呢有两种运行模式,Hosted Mode和Web Mode。在开发的时候使用Hosted
Mode模式下,代码会被编译成Java
ByteCode而运行在自带浏览器的JavaVM里,并动态生成HTML代码进行UI显示,可以对Java代码进行设置断点调试!而等到要发布的时候,
直接把代码编译成HTML+Javascript文件,就可以运行在标准浏览器里了。这其实就是一个代码生成的过程,并不新鲜,比如在JSP和ASP都有
服务端的UI控件,在运行时自动生成对应的HTML代码。差别主要是,GWT在编译时会把Java代码编译成Javascript,相应的也会把用到的
Java类库转成Javascript代码(我想并不是所有的Java类库都能如此转换的,应该有一些限制,比如只能使用最基础的类库(比如java.util.ArrayList)以及特殊封装的类(比如com.google.gwt开头的)。而JSP和ASP等并不提供类似的Java或者C#到javascript代码的转换,对于要在客户端浏览器运行的javascript代码,必须事先写好然后嵌入的--微软也有类似产品能够实现这种转换,那是后话了。


以,总结一下,GWT就是对常见桌面UI控件进行了在浏览器里的实现,并以Java类库的封装方式进行提供给大家使用。网络上还有很多提供了桌面UI控件
的浏览器实现的,他们之间的差别主要体现在封装方式上。比如像EXT库,直接以Javascript库的方式封装。而Flex呢,是以SWF格式来封装
的,只能运行在Flash播放器里。还有Silverlight,以.NET的IL格式来封装,需要Silverlight Runtime。

抱歉!评论已关闭.