论坛首页 Java企业应用论坛

改变Web应用的开发方式(一)

浏览 7374 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-09-24  
改变Web应用的开发方式(一)
----由Ajax引起的思考

作者:ZZ刚  转载请注明出处(http://spaces.msn.com/members/zigzagchen)

引子
如果让你说出在最近在Web开发领域中被炒得最火的一个词,八九不离十将会是Ajax。套用鲁迅先生说过的一句话:“世上本没有概念,炒的人多了,便成了概念”。其实这个概念之所以能够被炒起来,除了Google等公司给我们炫了几个很Cool的Ajax应用之外(Gmail, Google Suggest, Google Maps),更关键在于它为我们提供了一种Web开发的新思路 (Ajax: A New Approach to Web Applications )。看完这篇给Ajax命名的文章,首当其冲的是异步调用,通过XMLHttpRequest这一手段,我们可以使用户不用在进行每一个操作后干等Web的响应,从而提升了用户流畅的体验。
  这个是这篇文章的核心,也是Ajax吸引人的一个亮点。但是今天我们要讨论的,却是文中提出的另一张图(图1),虽然Jesse James Garrett没有对其进行详尽的描述,但是它同样能给我们带来一定的思考空间。

传统的Web开发方式及其发展历程
如图1所示,左边是传统的Web开发方式:Web Server接受客户端传送过来的HTTP请求,进行解析,与后台交互进行业务处理,再把结果渲染成HTML,最后将其传到浏览器。虽然这种方式历经了多年的发展,我们也有不少的开发框架和工具可以使用,但是Web应用的开发仍显得比较复杂低效。我们通过回顾Java Web开发的发展历程来分析一下这个问题。
Sevlet为Java Web编程的早期规范,把Http请求与响应被封装成Java对象。在这段时期,整个Web应用基本仅由程序员来完成,他们在Servlet程序中从Request中取得客户端传送过来的参数,进行处理后将结果写回到Response对象的输出流中,这种方式无论对开发人员或是用户来说都是比较痛苦的,程序员需要在程序中写入大量重复枯燥的HTML输出语句,而且这种方式也很难在HTML的美工方面做得很好,所以对于用户来说,他们只能看到一些粗糙简陋的页面。
为了解决这个问题,JSP等动态网页技术出台了,首次在页面与程序分离方面迈出了一步,程序员可以在美工人员完成的HTML页面中嵌入程序代码,用来控制页面中动态部分。但是由于JSP规范对页面中Java程序没有太大的限制,对哪一些程序应该放在动态页面中,哪一些程序需要放在后台程序中处理也没有一定的规范。导致了在很多的Web项目中,大量的Java代码充彻于HTML Tag的字里行间,给美工与程序员都带来了不少痛苦。
为此,Craig R. McClanahan等一些有见解的开发人员开始提出了Web开发的model2,将经典的MVC模式导入到Web开发中,出现了Struts这个至今仍非常流行的Web框架,在架构上,它把浏览器提交的请求交给一个统一的Servlet控制器,由控制器通过读取控制文件将事件分配到相应对象模型(Actions)中,实现了对Request事件响应的对象封装。而在页面渲染方面,提供了一套与HTML形式类似的Taglib库,意图于减少HTML与Java程序间的异构性,更好地实现页面与逻辑分离。后来的出现的WebWork, Spring MVC基本上继承了Struts中的MVC思路,只是在事件分派,页面渲染的灵活性上进行了提高。但是这种所谓Web MVC的方式并不能彻底解决Web开发中的痛苦,由于Action的激活基于每一个页面跳转产生的Request请求,对于复杂的页面事件交互,Action的粒度与页面中状态的保持都是比较麻烦的问题。而且由于TagLib没有一个统一的规范,自定义性太强,使得嵌入它的页面很难被主流的HTML编辑器支持,始终不能摆脱页面与程序分离的问题。
在基于Request,对Action进行封装的框架之外,还有另一个Web框架的分支,那便是JSF等以对可视化组件进行封装为基础的架构。它力图将HTML元素的属性和事件的监听都封装在后台的对象中,为开发者屏蔽掉处理HTTP Request/Response方式带来的事件分派,状态保存等麻烦。这种方式在MS的.net开发中一直被提倡,希望Web程序的开发能像VB中的一样,利用强大的IDE,制作布局,画出控件,为控件指定监听器并书写响应程序。但是这种方式也存在一定的问题,因为B/S的Web架构毕竟与单机或是胖客户端不同,如果连结到服务器的并发用户较多时,这种将组件的事件监听,状态保持和渲染的工作都交由后台程序的方式必将对服务器资源提出更大的挑战。

总结以上各种Web开发方式所面临的问题,其根本症结可归于以下三点:
一是由于HTTP基于请求/响应范式。传统应用中浏览器发出请求,服务器针对每一个请求返回一个HTML页面。
二是由于HTML作为一个用于内容布局的结构化标志语言,与进行数据/逻辑处理的编程语言存在异构性。
三是由于Web应用以服务器为中心,Web开发需要考虑服务器端的负载问题。


Ajax能给我们带来什么?

对于这三大难题,Ajax方式能给我们带来解决的途径吗?
我们回头看看图1的右边。与传统的Web应用开发方式比较,它在浏览器端添加了一个层----Ajax engine,由用户产生的页面事件交由这个引擎处理,它负责向服务器发送请求,服务器传回的是业务数据而非HTML,引擎接受之后,进行渲染,通过浏览器的解析在页面上显示出来。说白了,就是将事件监听与页面渲染的工作交给了浏览器,而后台服务器只负责业务逻辑的处理。
在Ajax方式下,HTTP基于请求/响应的范式仍然没有变化,但是由于有XmlHttpRequest对象(Ajax engine的核心)的支持,我们不需要像以前那样将每一次请求发到服务器后,由服务器解析请求再进行事件发配,之后返回刷新用的HTML页面。在新的方式下,由于事件的监听和处理在浏览器内部实现,它的反应周期可以被缩短,事件的处理粒度可以更方便的做到更细,而且由于支持异步方式发送Request请求和接受Response响应,用户事件的控制有了更大的灵活性。
在Ajax方式下,HTML与程序的异构性仍然存在。但是由于把页面渲染放到浏览器中,使得我们可以通过HTML DOM对HTML的各个组件以对象的方式进行访问与控制而不是刷新整个页面,使得页面的渲染变得更加灵活,简便,丰富多彩。想想别扭的JSP Tag或是与HTML似近实疏的TagLib,还有Velocity等模版语言,他们的Tag被插入到HTML原本的Tag中,指挥服务器程序对被他包容的HTML进行逻辑操作从而来达到动态渲染页面的目的,不可避免的存在页面结构与程序逻辑混杂的问题。
在Ajax方式下,Web程序仍然以服务器为中心,但是由于事件处理与页面渲染的工作可以由浏览器来担当,从而减轻了服务器的负担。

Ajax开发方式存在的问题
既然Ajax方式存在以上优点,XmlHttpRequest,HTML DOM也不是最近才浮现的,为何这种方式到如今才进入我们的视野,而未能成为Web开发的主流呢?原因有以下几点:
1. 它依赖于浏览器。而至今各不同厂商的浏览器,甚至同一厂商浏览器的不同版本,对XmlHttpRequest与HTML DOM的使用方式皆有所区别。
2. 它依赖于JavaScript。从而有带来了以下问题:
Ø 用户可以很方便地关掉浏览器的JavaScript支持。从而使Ajax无用武之地。
Ø JavaScript本身的语法要求过于灵活松散,降低了它的可读性
Ø 没有强大好用的IDE与Debug工具
Ø 对于开发人员来说,在习惯于传统的Web应用开发之后,大部分人对其不重视,认为它只是做页面即时校验或一些页面效果的小伎俩

问题的解决
    虽然Ajax存在着这样的问题,有些看起来甚至是致命的,但毕竟它还是被炒起来了,火起来了。基于Ajax的网站春笋般涌现,用于Ajax开发的框架与工具也崭露头角(Google开放了AjaXslt,微软推出了Atlas,JSF中加入队Ajax的支持)。这些都给我们一个信号,会有越来越多的网站与应用倾向于这种方式。为此,浏览器厂商会考虑到这个问题,虽说标准化不是一朝一夕的事情,但是大家会朝这个方向走得更近而非更远。随着Ajax应用越来越多的闪亮登场,用户关掉JavaScript的可能性进一步降低。这是发展的趋势,但就目前的现状来说,支持XmlHttpRequest, HTML DOM, JavaScript的浏览器也已是Web程序客户端的最大平台,而且将各浏览器间使用差别封装起来的Ajax engine也已经出现。从外部环境来讲,Ajax的推广应用已经不成大的问题。
    剩下的就是开发人员的问题了。对于JavaScript,它能做到什么,能从何种程度上改变我们开发Web应用的方式?JavaScript有其先天不足,但是如果我们以OO的思想来看待它,利用并编写可重用度高的JavaScript组件,把前后台组织成一个新的框架,你会发现,比较起以往的方式,Web开发确实变得简单了。我将在本文的第二篇中介绍对这样框架的特性要求和实现手段。而至此,需要我们做的只是一点:观念的转变。
   发表时间:2005-09-26  
我以前关注过Ajex,然后把看法写在blog中。现在贴出来,大家一起讨论:)我在下面提到的那张图,就是楼主上传的那张。


引用

参考文档:http://www.adaptivepath.com/publications/essays/archives/000385.php

所谓Ajax,是“Asynchronous JavaScript+CSS+DOM+XMLHttpRequest”的简称,按照我的理解,是“基于XML的异步脚本请求编程风格”。我考虑了很久,觉得用“编程风格”这个词来形容Ajax会比较合适。Ajax就如同其命名所表示的,是以下五种技术的集合:

1)基于标准表现,使用XHTML和CSS;
2)动态数据显示及互交,使用DOM;
3)数据交换及处理,使用XML和XSLT;
4)异步数据获取,使用HTMLHttpRequest;
5)使用JavaScript将以上技术捆绑在一起;

该文章作者Jesse James Garrett对Ajax定义的解释是:Ajex isn't something you can download. It's an approach --- a way of thinking about the architecture of web applications using certain technologies. Neither the Ajax name nor the approach are proprietary to Adaptive Path. Ajax is both a technology platform and an architecture style. Ajax is a set of technologies being used together in a particular way.(Ajex并不是实实在在所能够下载到的东西,而是一种方式---一种关于WEB应用程序在结构上使用某些技术的思维方式。Ajax的命名及其实现方式并非Adaptive Path所单独拥有。Ajax既是一种技术平台也是一种结构风格,它实际上是以一种特殊的方式将一些技术糅合在一起使用。)

也就是说,在技术上,Ajex并没有任何新玩意。Ajex是一种web应用程序功能实现的编程思维方式。我之所以没有认为Ajex是一种新思维,是因为使用XMLHttpRequest进行页面无刷新数据提交,并通过DOM或其它工具进行数据解组(将XML文档转换为Java对象实例)和编组(将Java数据对象转换为XML文档)的整个过程,并非什么新鲜玩意。而Ajex实际上就是为这一过程提供了更加全面深入的理论指导及升华。



相比于我们常用的XMLHttpRequest+XML处理过程,从上图我们可以发现,Ajex将这一过程升华到了Ajex Engine的新高度。看完Jesse James Garrett的文章之后,我一直在思考,到底所谓的Ajex Engine是什么。忽然间我意识到这其中实际上包含了当前的主流编程思想:基于组件(模块)化编程。也就是说,Ajex Engine并非是一成不变的类或某种实现,而是开发者根据功能需求的不同而独立出来的组件(模块)。该组件的作用显而易见,即完成由客户端XMLHttpRequest提交上来的XML进行解组并向业务逻辑层传递数据,然后将业务逻辑层处理后传回的数据进行XML编组并返回客户端,且在进行XML编组的过程中容入CSS和XSLT以便满足客户端显示的需要。

拨开云雾见青天,实际上Ajex并没有任何神秘之处,只是名字听起来比较冈。Ajex实现的好坏,本质还是在于JavaScript+XML+XSLT+CSS+DOM的应用。只是在Ajex面前,我们平常使用XMLHTTP这一称呼来统称整个功能的实现(JavaScript+XML+XSLT+CSS+DOM),显得有些片面。

其实我很诧异呀,我搞不懂为什么老外会为主题思想如此简单的东西争吵得不亦乐呼。Ajex最具有复杂性的关键之处在于对数据的XML编组和解组上,以及对XSLT+CSS的融合。就好象工作流,老外也是争得个口水横飞你死我活,其实工作流的思想相当简单,无非就是通过对数据库的某条数据判断其状态字段以便选择执行某种行为,而行为的本质结果就是更新数据库中该条数据的状态字段。而工作流的实现难度关键则在于其实现方式的不同,比如OSworkflow就是通过XML进行行为的选择,那么当然也可以完全不依赖XML呀。所以从冰箱做工作流的整个过程就可以看得出,绝大部分时间实际上就只是花费在怎样使用OSWorkflow这个工具上了。唉,或许是我功力尚且肤浅,无法拔升到达人那样的高度吧。

话归主题,老外对Ajex的研究相当深入,以至于到了Ajex patterns的地步,佩服呀。不过其中也没啥子特别,比如说:“客户端应该周期性与服务器端同步,刷新过期数据,可以使用setTimeout()”,“使用独特的URL以便客户端每次被访问都会刷新数据”等等。等以后有闲暇再慢慢看吧http://www.softwareas.com/ajax-patterns

我看有讨论,有些人是鼓励Ajex多多益善,我看呀,还不如直接用C/S来得简单便利。当然,也有人把Ajex提升到“胖客户”的高度,我觉得嘛,唉,反正每个人都有自己的看法,对我来说,Ajex仅仅为了满足客户需求的一个技术实现罢了,没有特别偏好的感觉。



--------------------------------------------------------------------------------


附:XMLHttpRequest

XMLHttpRequest对象在JS中的应用:

var xmlhttp = new XMLHttpRequest();

微软的XMLHTTP组件在JS中的应用:

var xmlhttp = new ActiveXObject(Microsoft.XMLHTTP);

var xmlhttp = new ActiveXObject(Msxxml2.XMLHTTP);

XMLHttpRequest对象方法:

abort()------------------------------------------------------------------------------停止当前请求

getAllResponseHeaders()-------------------------------------------------------作为字符串返回完整的headers

getResponseHeaders()----------------------------------------------------------作为字符串返回单个的header标签

open("method", "URL"[, asyncFlag[, "userName"[, "password"]]])-----设置未决的请求的目标URL,方法,和其他参数

send(content)---------------------------------------------------------------------发送请求

setRequestHeader("label", "value")-----------------------------------------设置header并和请求一起发送

XMLHttpRequest对象属性

onreadystatechange-------------------------------状态改变的事件触发器

readyState------------------------------------------对象状态(integer):0=未初始化;1=读取中;2=已读取;3=互交中;4=完成;

responseText---------------------------------------服务器进程返回数据的文本版本

responseXML---------------------------------------服务器进程返回数据的兼容DOM的XML文档对象

status-----------------------------------------------服务器返回的状态码,如:404=“文本未找到”;200=“成功”;

statusText------------------------------------------服务器返回的状态文本信息
0 请登录后投票
   发表时间:2005-10-25  
对于只把Model层放在Server端,把View和Control放在客户端处理的
想法可不可行?是否可以让我们的Web开发变得更简单?

搞了一个叫swato的框架,来做做这个想法的实践验证。现在这个框架
发布了Beta版,并开放了一个在线DEMO:

http://swato.throughworks.com

欢迎大家提宝贵意见。

如果有兴趣的话,欢迎一起来参与:)
0 请登录后投票
   发表时间:2005-10-25  
怎么搞到throughworks.com 上了??
看来AJAX是火过头了,特别是google sugesst,模仿版已经出了N多了。
0 请登录后投票
   发表时间:2005-10-25  
throughworks is not thoughtworks
1 请登录后投票
   发表时间:2005-10-25  
dazuiba 写道
怎么搞到throughworks.com 上了??
看来AJAX是火过头了,特别是google sugesst,模仿版已经出了N多了。


sorry,名字有点儿像罢了。

Auto_suggest只是其中的一个应用事例。
Java方面现在有的Ajax框架有DWR,JSON-RPC-Java等,定位于让AJAX开发
变得更简单。

而Swato定位于利用这种方式,让Web开发变得更简单。DEMO中所有展示
的并不是AJAX能带来的效果,而是利用框架后,View层和Control层的代码
可以交由JavaScript来完成。

传统的Web MVC框架太重了。
0 请登录后投票
   发表时间:2006-02-22  
二在什么地方,看来以后的开发javaScript的运用会越来越多的
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics