市场上现有的表示层的一些界面开发技术如下图:
横轴表示偏向服务器端的技术。从左往右依次看:
1) CGI是早期所用的通用网关接口,早已被抛弃,目前只在一些特定设备如网关上还存在。
2) SERVLET是JAVA编写的服务器端小程序,通过writer/print函数输出html页面。
3) JSP是SERVLET的扩展,引入了模板技术来生成网页,使网页编程变成以html为主体,在其中嵌入动态代码。其衍生的JSTL技术能提供自定义标签,可以达成页面组件化目标,不过缺点是自定义标签的开发难度很高,需要极高的编程技巧。
4) JSF,在jsp的基础上进一步深入组件化,能以单机软件的模式来构建。并改变了通常的“请求-转发”的MVC模式,以“事件驱动”的思路来取而代之。缺点是性能差,jsf组件的设计越加复杂,需要专用IDE的支持。
5) Portal,是jsf的一种应用,用来组合集成各类系统,方便实现门户级别的整合,缺点是非常昂贵(如websphere,weblogic的解决方案等),性能差,部署复杂,二次开发有较高技术门槛。
6) GWT是google的产品, 用类swing的方式来开发界面和软件,然后用js编译器将java代码翻译成js代码(翻译一次即可)。目标也是透明化浏览器和服务器的差异,而与jsf不同的是,GWT在运行期之前生成js,运行期通过ajax与服务器通讯。不过使用得不广泛,主要是因为调试困难,而且性能优化难度太高。
这个横轴越往右表明与服务器的关联越紧密,用更多的java,用更少的js,这是典型的java程序员的思维模式:什么都让java解决。
我们再来看另一个领域:浏览器。
纵轴表示的是偏向浏览器端的技术,从下往上依次看:
1) HTML超文本标记语言。
2) DOM是浏览器实现的文档模型 ,然后给它嵌入一个脚本语言解释器(javascript/vbscript)来操作。只是,dom模型和js语言都实现得太粗糙,很难用。(5,6年前那种复制黏贴的js特效代码满天飞的现象不是没有原因的)
3) js函数库,如prototype,jquery,mootools, 目标是弥补dom/js的低效和杂乱,努力减轻web程序员的工作,弥补js在“OOP,DOM操作,组件化”等方面的先天不足。这些优秀类库是现代ajax的核心,催生出了一个web 2.0时代,界面开发开始重新向js回归(上一个努力是Applet和Flash)。其中jQuery以强大灵活的选择器、链式调用和丰富易用的插件体系脱颖而出,成为大多数Ajax项目的首选。
4) js特效库,如script.aculo.us(基于prototype),jquery plugin(基于jquery),dojo等,它们都提供了一些富客户端页面中常见的效果,如动画,拖放等。
5) js组件库,如YUI(Yahoo UI),EXT(即YUI-EXT),Dojo等,它们提供了一些通用的组件库。jQuery plugin系列也有丰富的可选库。其中商业化最成功的就是EXT,已经自成一套体系,体积庞大,结构复杂,适合于内网的纯Ajax开发,二次开发难,界面风格调整不易。相比之下,jQuery作为js核心类库大大强于EXT的core,通用组件虽然不及EXT全面,但胜在易学易用,开源,易于二次开发,目前其plugin lib仍在不断增长,具备很高的采用价值(包括jquery UI)。
6) 嵌入式对象。Flash,FLEX,APPLET,silverlight,JavaFX,google gears是几大类页面嵌入实现,其中flash以庞大的装机率成为事实上的标准已经很多年了。
7) HTML5,从浏览器出发,吸取Flash的精华,打造更强大的web。HTML5将是今后的主角,flash杀手。浏览器凭借HTML5的普及,终将走向真正的富客户端。
这个次序越往上,其与服务器关系越小,交给浏览器做的计算就越多。
选用与服务器关系紧密的方式,服务器端生成页面的方式会对服务器造成性能压力,浪费服务器很多的计算能力,尤其是使用复杂的标签情况。选用偏向浏览器端的通用组件方式,其难度相当于需要掌握一门新的技术语言,难上手。技术越集成,则复杂度越高,越不容易使用。功能的强大与开发的简单是一对矛盾,往往需要在中间取一个平衡点。由服务器端生成,还是由客户端生成界面?我认为数据更适合由服务器处理,界面适合由浏览器生成。
纵观近十年来的B/S技术流行趋势,风云变换,可以发现总的趋势是在向浏览器(富客户端)发展,越来越强调客户端体验(动态界面、异步刷新),实际上已经回到了传统C/S程序的老路上——客户端和服务端只传递数据,不再传递整个界面是未来的必然趋势。而数据的传递,则从单纯的get/post演变为ajax,继而演变成js端的rpc调用(dwr,buffalo等),模糊页面和服务器的界限(与GWT正好相反)。
本篇是为公司写的前端界面技术方案的一段。本只想说明何种组件更适合公司,却不觉演变为一篇界面开发技术的分析。这其中最应该感谢的就是我偶像,给了我不少提携,其中的图就是在他的建议下建立,而服务器端的技术对我本是很模糊,也经由偶像指点得以流畅清晰。此段的文字更是在偶像的渲染之下变得生动有势。Thank you and I love you。