网络开发即将进入RIA+SOA的时代

日期: 2008-04-22 作者:Nolan Wright 来源:TechTarget中国

  网络开发正从基于MVC的架构转向客户机/服务器模式,即RIA+SOA,其中RIA用于呈现富用户界面(rich user interface),SOA用于提供所使用的服务。


  虽然Web 2.0应用程序着实让人兴奋,但它们在下一代RIA+SOA集成平台形成之前是不会成为主流的。


  下一代RIA+SOA平台什么样子


  目前,在基于HTML、CSS、Javascript标准的网络环境下,RIA开发人员在构建富用户界面时,必须对多种第三方库文件和框架进行编译。这种“照单选菜”的RIA程序开发方式给开发人员增加了多余的负担。他们不能将精力全部用于编写程序,而必须拿出部分时间用来寻找、集成和整理各种各样的RIA开发平台。


  SOA方面也是如此。开发人员必须自己解决如何创建服务,以及如何将这些服务集成到RIA前端程序。开发人员需要一个能解决编写程序时所需考虑的各种问题的平台,这样他们才能把精力放在他们最擅长的事情上——编写程序。


  问题是:下一代RIA+SOA平台应该是什么样子呢?


  我们可以从建立一个RIA+SOA应用的活动开始。一般来说,这些活动主要包括:


  1. 设计程序的“样子”


  也就是程序的总体外观。它包括以下方面:颜色、字体、图表,以及总体页面布局。


  常用工具包括:HTML、CSS和图像工具。


  2. 集成控件(widget)


  控件将一系列常用功能封装在一个单独的组件里。除一些预定义的动态行为之外,它们通常还包含“感观”效果。它们是RIA程序的基础组成模块。


  常用工具包括:ExtJS、Dojo、Yahoo YUI,以及一些其它小型控件工具。
 
  3. 为用户界面添加动态行为


  在用户界面创建动态行为涉及两件事:


  事件处理
  文档对象模型(DOM)操作


  事件处理是对发生的特定事件(比如用户点击一个按钮或者收到服务响应)进行判定的能力。DOM操作可以让你根据接收到的事件动态改变用户界面。


  常用工具包括:Javascript库类,比如JQuery、Prototype和Scriptaculous。


  4. 使用服务


  RIA的一个主要功能是使用后端服务。这使它可以用单页面用户界面传输服务的应用数据。用户界面与服务层也可以完全分开。Ajax是最常用的与服务交互的方法。


  常用工具包括:Javascript库类,比如Jquery和Prototype。


  5. 创建服务


  服务为数据和应用业务逻辑层提供了一个接口。


  常用工具包括:可以根据你所用的程序设计语言选择适当的框架来创建服务。


  下一代RIA+SOA平台基本特征


  了解了创建RIA+SOA应用程序的大致需求,我们再来看一下怎样将这些活动整合到一起,从而最大化开发人员的效率。下面几个部分概述了下一代RIA+SOA平台的基本特征。
 
  1. 支持HTML和CSS


  这两种语言非常适合用来实现应用程序的“外观”,并且大多网络用户界面的开发人员对它们都很熟悉。所以没必要再去另做一些工作实现重复的功能。


  2. 提供开放的控件框架(Open Widget Framework)


  正如前面讲到的,控件是RIA程序的基础组成模块。有许多工具可以使用,比如Yahoo、Dojo和ExtJS。也有一些小型项目或个人开发的独立控件。你可以使用这些控件构建RIA程序,但有一些需要注意的地方:


  几乎不可能仅靠一个控件来满足你所有的需求。
  集成各种第三方控件时可能需要定制代码,并对各个控件有深入的了解。
  编写新的控件是一项有挑战性的工作,因为这意味着你得编写自己所用的控件工具的低层API,甚至要从零开始。
  某些控件框架要求开发人员为所用的控件编写大量的JavaScript,这对那些JavaScript开发经验很少甚至没有的人来说,无疑是有很大问题。


  为解决以上问题,RIA+SOA平台提供的开放控件框架需要具备以下功能:


  支持集成现有的第三方控件
  为新建控件提供简单的API
  可以通过简单标记(markup)使用控件(不需要使用JavaScript)
  支持分布模型,以简化新控件的提交、发现和使用。


  开放的控件框架将成为开发人员获取控件的资源,并使开发人员可以很容易地集成控件和应用程序。如果没有所需的控件,使用开放控件框架的API重新创建也很容易。 


  由于控件在RIA开发中的重要性及其分散的特性,开放的控件框架应该是任何RIA+SOA平台必不可少的组成部分。


  3. 提供一个集成的RIA编程模型


  与传统的Web应用相比,RIA程序需要编写更多的用户界面代码。因此,下一代平台需要集成的RIA编程模型来简化主要用户界面设计任务。这些任务包括:


  事件处理
  DOM操作
  服务使用(Ajax)


  事件处理、DOM操作和Ajax是富网络应用中实现“富”任务的部分。它们的关系非常紧密。为说明这一点,我们来看一个典型的RIA登录过程。


  点击登录按钮(事件处理)
  发送服务请求(Ajax)
  显示相应的活动指示器(DOM操作)
  返回服务(Ajax)
  关闭活动指示器(DOM操作)
  显示登录“成功”的消息(DOM操作)


  虽然它们关系紧密,大部分框架和库都只提供了简单的集成,而让开发人员完成剩下的任务。为表明这一点,我们来看一些代码。在下面的示例中,当一个组合框的值发生改变时,我们将设定另一个组合框的内容。示例是用Jquery写的。


  $(function(){
    $(“select#comboOne”).change(function(){
      $.getJSON(“/combo.php”,{id: $(this).val(), ajax: ‘true’}, function(j){
      var options = ”;
      for (var i = 0; i < j.length; i++) {
        options += ‘<option value=”‘ + j[i].optionValue + ‘”>’ + j  [i].optionDisplay + ‘</option>’;
      }
      $(“select#comboTwo”).html(options);
    })
    })
  })


  现在我们来看看怎么用事件处理、DOM操作和Ajax完全集成的方法来完成同样的任务。


  <select id=”comboOne”
  on=”change then r:load.combo2.request”>
  </select>
  <select id=”comboTwo”
  on=”r:load.combo2.response then value  [property=rows,text=text,value=value]”>
  </select>


  这两段代码用不同的方式完成同一件任务。第一段使用了较多的代码,并且都是用JavasSript。第二段使用了简单的表达式语言来完成同样的任务。我们来分析一下语法。


  on=”change then r:load.combo2.request” 
 
  在这句表达式中,当<select>收到“change”事件时,将发送Ajax请求消息r:load.combo2.request,一目了然。再看下一个表达式。
 
  on=”r:load.combo2.response then value  [property=rows,text=text,value=value]”
 
  接收到Ajax响应消息r:load.combo2.response时,将根据响应消息中的数据设定第二个组合框的内容。
 
  再深入一步,可以在收到消息的地方加入一个可视行为。


  <select id=”comboTwo”
  on=”r:load.combo2.response then value  [property=rows,text=text,value=value]
  and effect[Highlight]”>
  </select>


  通过在表达式中添加effect[Highlight],我们就能使用一种微妙的效果来提示使用者组合框的值已经发生变化。


  这些示例代码显示了事件处理、DOM操作和Ajax完全集成这一方法的强大与简易。没有JavaScript经验的开发人员也很容易掌握像上面所示的表达式语言。这将使他们很快进入工作状态,因为他们不再需要预先进行大量枯燥的学习。当然,有JavaScript经验的开发人员也可以自由选择使用JavaScript。这样,一个集成的RIA编程模型也应该支持JavaScript,特别是要支持行为与标记的分离。通常称之为低调(unobtrusive)JavaScript。我们来看一个示例:


  <img id=”progress_image” src=”images/indicator.gif”/>
  $(“progress_images”).on(“r:login.request then show”).on  (“r:login.response then hide”);
 
  在这个示例中,<img>标记与JavaScript代码定义的行为——收到登录请求消息的时候“show”及收到登录响应消息的时候“hide”——就是分离的。 这种编程模型有利于喜欢使用JavasScript进行RIA编程的开发人员。


  一个集成的RIA编程模型是RIA+SOA平台的基础组成部分。它为开发人员处理主要的RIA编程活动提供了单一、完整的机制。这样,相较现在来说,开发人员可以使用更少的代码、更快地构建富用户界面。


  4. 提供集成的服务平台(Integrated Services Platform)


  RIA只是构建富应用程序的一部分。我们仍需要完成RIA+SOA中的SOA部分。不幸的是,当前的Web 2.0工具包和框架主要用于RIA,很少甚至不提供对构建服务的支持。这确实是个问题,因为这样又需要开发人员来完成大量的工作,使得应用开发和维护需要耗费更多的时间并变得异常困难。 


  下一代RIA+SOA平台要解决这个问题必需提供一个能满足以下条件的集成的服务平台:


  支持使用任何语言创建服务
  实现RIA与SOA层的无缝交互
  可以使用本地模拟服务(mock service)


  过去,网络框架使用单一的编程语言构建,但是在RIA+SOA时代,这种做法将变得过时并且多余。RIA程序只与服务交换应用数据,它们应该是独立于编程语言的。RIA程序与SOA服务只需要一个简单的消息关系。RIA与SOA层之间的松耦合特性为集成的服务平台提供了方法,可以使开发人员使用任何编程语言创建服务并不会影响到RIA层。 


  集成的服务平台同样应该提供RIA与SOA各层之间的无缝交互。特别是,它应该代替开发人员处理服务路由选择和数据转换。下面是一个用简单的集成方法创建服务的示例。这个示例是用Java编写的。


  @Service (request = ‘login.request’, response =’login.response’)
  protected void loginRequest (Message req, Message resp)
     throws Exception
  {
     String username = req.getData().getString(“username”);
     String password = req.getData().getString(“password”);
     User user = UserDAO.login(username,password);
     if (user !=null)
     {
          response.getData().put(“success”,true);
          response.getData().put(“user”,user);
          return;
     }
     response.getData().put(“success”,false);
}


  在上面的示例中,有两点需要注意:首先,通过在Java方法中加入一个简单的“Service”注释便让一个平常的Java对象变成了一个服务。注释中包含了这个方法所处理的服务请求和服务响应消息,使路由设置变得简单。其次,可以简单明了地处理请求和响应数据。在这个示例中,将整个User对象放入响应消息中。服务平台负责处理数据转换。这样开发人员可以集中精力编写服务逻辑而不是胶合代码(glue code),可以减少代码量并提高开发速度。


  然后,如果RIA与服务之间的关系是基于消息的,就可以创建本地模拟服务。本地模拟服务可以响应远程请求,但它们只存在于本地RIA中。这是一种很强大的功能,因为无需一行服务代码便可创建功能齐全的RIA模型。可以将这些本地模拟服务放在单个文件中,并在用户界面开发完成后删除。我们来看一个例子:


  <!– Progress indicator –>
  <img src=”images/indicator.gif” style=”display:none
    on=”r:login.request then show or r:login.response then hide”/>
  <!– Login form –>
  Username: <input type=text” fieldset=”login” id=”username”/>
  Password: <input type=”password” fieldset=”login” id=”password”/>
  <input type=”button” value=”Login”
    on=”click then r:login.request”/>


  登录表单


  <app:script on=”r:login.request then execute after 1s”>
     $MQ(‘r:login.response’,{‘success’:true,’username’:’foo’});
  </app:script>


  模拟服务


  在上面的示例中,我们有一个产生服务请求r:login.request的登录表单。我们还有一张图像,它将在收到r:login.request消息时显示,并在收到r:login.response消息后隐藏。第二部分是一个模拟服务的示例。这个模拟服务监听r:login.request服务请求,并在一秒后用r:login.response消息响应(当然这一秒只是模拟服务延迟)。登录表单并不知道服务的位置,它只负责响应消息。这个简单的示例显示了如何不靠一行服务代码创建一个完整的RIA模型。这种模型是100%可重用的,并使开发人员可以在服务创建之前定义服务合约。这样,服务创建工作得到了很大程度的简化,因为开发人员不仅有一个功能齐全的模型作为参考,还同时得到了一个完整的服务界面。


  总结


  开发人员目前正在经历网络应用开发的巨大转变。我们正从Web 1.0的基于服务器的MVC模式转为面向网络的客户机/服务器架构,或者更准确一点应该称为RIA+SOA。由于这个转变,开发人员要将他们所用的网络开发平台集成到一起才能进行富网络应用的开发。当然,转变的同时也会带来机会。这个机会便是建立下一代为Web 2.0应用提供端对端支持的网络平台。


  在Appcelerator,我们看到公司在一年以前已经接受这种转变。他们正在开发Appcelerator Platform,这是一个支持RIA+SOA的全新平台。本文所用的示例正是基于这一平台。当然,创建下一代网络平台有许多不同的方法。但是,即使实现细节上有些许不同,大体特征应该都是一样的。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐