| |
今天我们开发的 j2ee 网络应用程序,在表现层常用的就是struts, tapestry, webwork, or spring。这些工具一般使用mvc体系结构,输出html到浏览器。典型的程序网络开发模型就是要求 用户对程序的每一个动作都要发送请求到服务器上。对于程序的每个用户请求,服务器生成一个回复允许用户提交一个新请求用以获得更多信息。一个浏览器通常用来为用户渲染界面。但是浏览器是一个有太多限制的客户端,同时缺乏开发和用户体验。
富网络应用程序(ria)技术用来处理表现层的缺陷。这篇文章将以注重实践的态度来理解什么是ria,怎样把它融入你的应用体系中。文章也将提出一种是跟几个流行的 开源框架组合潜在的挑战。
浏览器的局限
当前已有的解决方案的问题是什么呢?当程序行为正确时也许并没有什么问题,可是曾经大多数的网络开发者都抱怨在使用浏览器作为客户端的能力限制。这里有几个当网络应用程序使用浏览器产生的问题:
l 各种浏览器以一些不协调的方式解释象javascript这样的脚本语言,这迫使开发者花费出几倍的时间写相同的代码来适应不同的浏览器。
l 一些象标签,向导表单,大型数据列表处理 等普通的功能却困扰着开发人员并需要付出额外的实践来为浏览器写代码。
l html本身就有局限性,静态的标签无法扩展。
l 用户界面上的事件处理有着巨大的挑战,因为渲染html页面只能同时显示一个,事件无法不通过服务器更新其它页面上的数据。
l 存储程序状态只能通过无法是用对象的cookies,
l 使用浏览器几乎无法开发需要脱机工作的程序
这些例子反复说明了大部分开发者都已知道的:当前的工具是由局限性的。开发者使用浏览器时经常会因为这些问题要去找到解决方案。开发者和用户都已经对这种瘦客户端的能力失去信心。
富网络应用程序
有一种克服以上一些局限性的办法,我们称之为ria,一个ria 提供用户一个扩展了浏览器无法实现的能力的胖客户端。大多数普通的j2ee ria客户端是java和flash。当需要开发一个以数据为中心的大型应用程序时,ria通常比较适合。一些可用的开发ria解决方案有 jdnc (jdesktop network components), laszlo, thinlet, java web start, and macromedia flex。
ria能解决上面所说的问题,以下是一些ria能提供的功能列表:
l ria 提供类似于浏览器的 ui组件,增加了新本地化,更多组件。例如:包含数字递进器,滑动控制,在线数据表格逐渐,和 菜单栏。
l ria允许使用布局管理组件,象标签向导,折叠栏,树型,还有一些其它的布局,已经接近awt和swing开发。
l ria提供拖动-释放 能力
l ria中的语言风格对所有客户端都是一致的,所以无需为不同应用重写
l 请求/回复 模型不是所有用户界面动作说必须的。使用ria,用户与界面交互只需要处理所需要的部分。ria 可以使用http协议方法上传数据到应用程序服务器。通常,无论如何,首选的机制是remoting,它支持不同的方式使用ria。ria 特别的使用一些扩展协议来在http之上交流。
l 多组件事件处理可使用。
l ria允许你存储更多信息在客户端代替httpsession,这减少了服务器的内存消耗。
l 持久化状态,大多是在form对象,提供脱机时的能力
ria是一个比较新的技术,引进了新的观念来发展这些类型的应用。它不是所有应用程序的银弹,根据实现,提供试验。但是,假如你的应用能够受益于富ui设计,那么ria也许适合你。这篇文章现在将介绍一个ria解决方案- macromedia flex,我们还将讨论整合问题。
macromedia flex
macromedia flex 是 一种提供ria的商业表现层服务器。flash插件是flex程序运行时环境所不可缺少的。大多数浏览器已经预装了flash插件,这将有助于你 立刻使用flex。我们将讨论是用flash插件代替java插件与j2ee应用服务器交互的一些问题。
开发者使用两种核心的语言来创建flex程序,第一个是mxml,macromedia flex标记语言,它包含了大量的xml标签,允许开发者布局他们的界面。 mxml能引用到xul,或者xml ui语言,这些标记可以被扩展,有程序需要的额外能力,不象html。其它mxml结构允许你拥有自己的 look and feel mxml组件。
第二个语言是 actionscript 2.0,它是一种ecma-compliant 语言很像 javascript。actionscript元素编码在mxml页面中。这是一种强类型的面向对象的语言,很容易被熟悉 java的开发上手。actionscript 还有丰富的事件处理能力允许应用程序响应动态的用户交互。因为actionscript 在flash插件中运行,所以无需为不同的浏览器编写相似的代码。
mxml跟actionscript 都是基于文本的语言,能够在普通的文本编辑器,一个象eclipse 的ide,或者其它成熟的工具 象flex builder。假如你有java,xml经验,或一些脚本语言象 javascript,你就只有很小的学习曲线学习flex开发。
flex 服务器 是为了将mxml和actionscript 编译转化成flash 字节码.swf文件。这个过程就像java web服务器容器编译jsp文件成servlet。swf文件在客户端的flash运行时环境中运行。flex 服务器提供其它类似缓存,并发,处理远程对象的功能。
为你的遗留体系引入一个ria框架
现在你已经有一些ria方面的理解了,让我们来看看怎样为你已经存在的应用程序引入一个ria框架。这将包括一些关于ria应该在少耦合的程序中处于什么层的外置的讨论。此外,讨论将会在特别强调一些可能存在在开发flex与一些流行的开源框架结合的缺陷。这个例子会帮助你确定在引入ria时潜在的问题。
让我们开始标识一个分层的体系结构。一个这样的体系一般包括 表现层,业务委托层,业务综合/服务层,和持久层。这是一个可能的个层实现关系:
flex + business delegates + spring framework + hibernate
接下来的讨论将集中在 综合各个层。
关于我这个已经存在的mvc表现层
表现层是一个web应用程序展现给用户的界面,把请求转发到服务器,存储数据信息模型。刚开始的ria开发者总是希望能重用已经存在的struts组件。但是象flex这样的产品提供了他自己的mvc架构。你会真的需要去维持并存两个表现层框架在你的应用中吗?
让我们看看一个实际的例子中flex客户端发出一个通过struts组件的请求到应用程序服务器上。一个来自flex的请求发送到struts表现框架之后被高层的程序接收。图1显示了一个这样的例子
图1 :怎么样用其它java组件组合 flex 和 struts
象struts这样的表现成框架在http上传送html请求,虽然我们可以使用http协议,但更鼓励开发者使用 remote object 调用,因此,使用这两个表现层框架会逐渐产生协议不搭配,除非我们有一个特殊的需求直接用ria组合struts。,避免他们。图2 显示一个更好的组合flex 和struts的方案:
图2 ,介绍flex struts 平行存在于 java 组件中
图2 提出了怎样去隔离 struts 组件和flex 组件使他们共存。这满足了应用程序需要平行的ria组建和 轻量级 类struts组件。
开发者必须明白他们使用ria客户端是要做什么。这要求我们明确的转换我们熟悉的传统的请求/应答这种编程思想。象flex这样的ria产品不像struts这样是 请求或者应答 驱动的。ria 客户端更新ui而无需全部的实例都返回服务器进行交互。
struts 并不是你在使用ria时需要唯一考虑的问题。我们只需花费一点时间就可以熟悉这些类型的技术。在这个学习路途中,最大的问题是组合java服务器端的组件。底线是不背离ria观念。
在业务层集成flex
现在我们了解了一些表现层技术,让我们来讨论一下对程序结构的其它层的影响。我们要重新配置我们的表现成组件,怎样跟业务层组合在一起呢?
flex 是一个可扩展的ria框架,提供了很多方法来与你的j2ee组件进行通信。flex提供 http 通信,web service通信,和 macromedia公司所特有的amf(actionscript messaging format)网关。amf网关是一个高性能的二进制协议,就像flash里面的 remoting协议。remote对象使用http协议通过amf网关传递信息。flex为所有这些通信协议提供mxml标记,极大地减少了编码复杂度。此外,flex允许你使用同步的或者异步的方式去调用远程的业务层。当使用异步远程调用时,用户可以执行一些客户端行为,而不会有传统web应用程序的阻塞现象。当然,你可以在适当的地方使用同步方法来阻塞用户操作。
现在让我们来考虑 怎样在业务/综合层中集成flex。讨论中我们将使用spring框架作为我们的综合层,当然这并不限制你使用任何你自己选择的其它实现方式。让我们假设你有一些服务操作在你的spring微容器中,而你需要在flex中调用这些远程对象。
既然flex 无法直接知道任何关于spring的东西,所以你用一个担当代理服务器组件的小层来分离他们。 另外,既然spring在java接口中有不俗的表现,它也一定适合去构建一些实现了一些spring服务接口的代理对象。这些代理对象将会提供一个在flex跟综合层之间的分隔网关。唯一你需要去做的就是在flex配置文件中配置这些对象,然后你就可以通过amf网关
|
|