内容


将 WebSphere sMash 的强大功能与 Adobe Flex 相结合

Comments

引言

Web 2.0 这个术语让我们有些应接不暇。或许,最佳的方式是将这个术语定义为利用快速应用程序编程接口(如代表性状态传输(REpresentational State Transfer,REST))来开发可使用的应用程序的体系结构风格。

作为体系结构风格,Web 2.0 并不规定任何客户端(浏览器)或服务器端的任何特定技术。事实上,Web 2.0 应用程序的一个吸引人的特征就是,它实现了客户端和服务器技术的清楚分离。这个分离允许根据其对手边情况的适应性来选择客户端和服务器端技术,而没有规定一个“万能”解决方案。

在服务器端,WebSphere sMash 特别适合具有 Java™ 背景且需要通常与动态脚本语言相关的快速实现价值的开发人员。WebSphere sMash 对 Groovy(一种使用 Java 语法的动态脚本语言)和 PHP 的支持使其很快被广大开发人员所接受。

虽然并未规定客户端技术,但 WebSphere sMash 应用程序经常与采用 HTML/Ajax 呈现的用户界面结合使用(有时候会使用 Dojo Toolkit 进行扩展)。虽然这些技术满足很多用户界面的要求,但其他应用程序可能需要更为丰富的用户交互和更为成熟的框架。Adobe Flex(目前已经推出了第 3 版)提供了这样的框架,在富 Internet 应用程序(Rich Internet Application,RIA)领域得到了广泛的认可。

本文将以简单的待办事项 WebSphere sMash 应用程序为基础,使用 Adobe Flex 构建具有吸引力的用户界面,并籍此说明将 WebSphere sMash 与 Adobe Flex 结合使用时的各种有用方法。此应用程序的设计意图很简单,力图更为清楚地演示用于将 WebSphere sMash 与 Adobe Flex 连接的技术。为了遵循 WebSphere sMash 的理念,浏览器和服务器间的所有通信都是基于 REST 的,均采用标准数据编码。为了展示 WebSphere sMash 和 Adobe Flex 的灵活性,将使用此应用程序的多个变体来演示以下方面:

  • 使用 Groovy 和 PHP 呈现的 WebSphere sMash 应用程序。
  • WebSphere sMash 和 Adobe Flex 代码间的数据传输(使用 XML 和 JSON)。

使用 WebSphere sMash

您可能对 WebSphere sMash 不太熟悉,它来自名为 Project Zero 的孵化器项目,此项目是社区驱动的商业开发项目,其开发充分考虑了以下三个方面:简单性、敏捷性和速度。这些特征形成了一个可靠的框架,能交付可重用、易用的应用程序,而且这些应用程序只需进行极少工作就能适应各种变更。通过考虑敏捷性,WebSphere sMash 能为目前需要短时间内开发应用程序来交付稳定应用程序(开发工作快速而简单)的很多企业提供支持。

WebSphere sMash 的依赖关系管理系统消除了部署应用程序所带来的麻烦,能够在不用担心类路径依赖关系的前提下方便地在不同的环境间迁移应用程序。与很多其他应用程序环境不同,WebSphere sMash 仅仅包括其所需的模块,能得到占用空间非常小且能数秒钟完成启动的应用程序,使其成为了出色的敏捷开发环境。

Web 2.0 和 REST 样式编程

很多人都会将术语 REST 与体系结构混淆,我们这里将其作为支持 Web 2.0 体系结构的应用程序编程接口使用。REST 接口使用 GET、POST、PUT 和 DELETE HTTP 方法公开传统的 list/create/read/update/delete 操作。本文稍后将讨论其中有些方法的示例。

通过 Web 2.0,能够使用更方便基于浏览器的应用程序以(例如 ATOM、JSON、RSS、RESTful 界面)的新格式将其内部服务和数据源向 Web 公开,让企业看到这种做法切实的好处。Google 和 Amazon 等公司是 Web 2.0 领域的弄潮儿,他们提供了专门的 API,供开发人员利用现有功能,能在只需很少投入的情况下构建新功能。

AppBuilder

AppBuilder 是用于开发 WebSphere sMash 应用程序的工具。(随本文提供的 .zip 文件就是使用 AppBuilder 打包。)AppBuilder 允许您快速构建应用程序,提供了具有语法突出显示功能、可启动和停止服务器并能访问运行时日志和通过控制台进行跟踪的内置编辑器。AppBuilder 可从 Project Zero 网站下载(请参见参考资料)。

图 1. AppBuilder 提供的应用程序编辑器中的语法突出显示功能
图 1. AppBuilder 提供的应用程序编辑器中的语法突出显示功能
图 1. AppBuilder 提供的应用程序编辑器中的语法突出显示功能
图 2. 文件编辑器中的运行时日志选项卡
图 2. 文件编辑器中的运行时日志选项卡
图 2. 文件编辑器中的运行时日志选项卡

Groovy 和 PHP

我们在此的主要目的是通过构建 Adobe Flex 前端说明现有应用程序的可使用性,因此本文中只会讨论 WebSphere sMash 基础设施的某些特定方面。

WebSphere sMash 的特点之一是,它能够非常快速地创建应用程序,因为其中利用了 Groovy 和 PHP 之类的脚本语言的强大功能。

WebSphere sMash 具备内置的约定,可以在应用程序中简单而直接地创建基于 REST 的资源。WebSphere sMash 应用程序的 app/resources 目录中的任何 Groovy 或 PHP 脚本都将自动作为基于 REST 的资源公开,如下所示:

表 1. 作为基于 REST 的资源公开的脚本
HTTP 方法URI脚本方法
GET/resources/<resource>onList()
POST/resources/<resource>onCreate()
GET/resources/<resource>/<id>onRetrieve()
PUT/resources/<resource>/<id>onUpdate()
DELETE/resources/<resource>/<id>onDelete()

有关更多信息,请参见资源 (REST) 编程模型与约定

第一个任务是创建待办事项列表应用程序的服务器端实现。

使用 Groovy 实现的示例待办事项服务

Groovy 是供习惯使用 Java 的程序员使用的一种脚本语言。Groovy 具有与现有 Java 代码和脚本功能方便集成的特点,在速度和简单性方面都不负众望。

代码使用全局上下文中的 app 区域存储用户的待办事项列表。其中所使用的方法如下:

  • onList:列出当前的待办事项。
  • onCreate:通过添加指定项在待办事项列表中创建新的条目。
  • onRetrieve:基于索引 ID 列出待办事项。
  • onDelete:从待办事项列表中删除条目。

此应用程序最初构建为返回 XML 格式的数据。此处所示的代码实际上与上面提到的 Project Zero 文章中所示的示例 REST 资源完全相同。随本文提供的下载文件的 CombiningThePowerOfWSWithAdobeFlex/src/TodoService-1.0.0/TodoService/app/resources/todos_xml_grovy.groovy 中提供了下面所给出的代码片段的完整 WebSphere sMash 源代码。

清单 1. onList() 事件处理程序
def onList() {
    logger.INFO {"onList(): called"}
 
    def todos = app.todosXML[]
 
    if (todos == null) {
        todos = []
    }
    else {
        todos = todos.values()
    }
 
    outputXML(todos)
    logger.INFO {"onList(): returning ${todos}"}
}
清单 2. onCreate() 事件处理程序
def onCreate() {
    logger.INFO {"onCreate(): called"}
 
    def item = request.params.item[]
    request.status = HttpURLConnection.HTTP_BAD_REQUEST
 
    if (item != null && item.length() > 0) {
        def todos = app.todosXML[]
        def index = app.index[]
 
        if (todos == null) {
            todos = [:]
            index = 0
        }
 
        index++
        todos.put(index, [id:index, value:item])
 
        app.todosXML = todos
        app.index = index
 
        request.status = HttpURLConnection.HTTP_CREATED
        request.headers.out.Location = request.uri[] + '/' + index
 
        logger.INFO {"onCreate(): created id ${index} -> ${item}"}
    }
}
清单 3. onRetrieve 事件处理程序
def onRetrieve() {
    logger.INFO {"onRetrieve(): called"}
 
    def id = request.params.todos_xml_groovyId[]
 
    if (id != null) {
        def todos = app.todosXML[]
        def value = todos.get(id.toInteger())
 
        if (value != null) {
            outputXML(value)
            logger.INFO {"onRetrieve(): returning ${value}"}
            return
        }
    }
 
    send404()
}
清单 4. onDelete 事件处理程序
def onDelete() {
    logger.INFO {"onDelete(): called"}
 
    def id = request.params.todos_xml_groovyId[]
 
    if (id != null) {
        def todos = app.todosXML[]
 
        if (todos.remove(id.toInteger())) {
            app.todosXML = todos
            logger.INFO {"onDelete(): deleted ${id}"}
            return
        }
    }
 
    send404()
}
清单 5. outputXML 方法中完成的响应呈现
def outputXML(data) {
    logger.INFO {"converting ${data} to XML"}
 
    request.headers.out.'Content-Type'='application/xml'
    request.view = 'XML'
    request.xml.output = data
    render()
}

使用 PHP 实现的示例待办事项服务

PHP 是一种通用脚本语言(请参见参考资料)。此部分将给出与上面所示的 Groovy 实现功能相当的 PHP 实现。这两个实现的不同在于各自语法的差异。根据所序列化的对象的复杂性不同,非直接呈现可由 WebSphere sMash 很好地完成。

随本文提供的下载文件的 CombiningThePowerOfWSWithAdobeFlex/src/TodoService-1.0.0/TodoService/app/resources/todos_xml_php.php 中提供了下面所给出的代码片段的完整 WebSphere sMash 源代码。

清单 6. onList() 方法
function onList() {
 
    $todos = zget("/app/todos_xml_php");
 
    if ($todos == null) {
        $todos = array();
    }
 
    zput('/request/view', 'XML');
    zput('/request/xml/output', array_slice($todos, 0));
    zput('/request/xml/rootelement', 'arraylist');
    render_view();
}
清单 7. onCreate 方法
function onCreate() {
 
    $item = zget("/request/params/item");
    zput("/request/status", 400);
 
    if ($item != null && strlen($item) > 0) {
        $todos = zget("/app/todos_xml_php");
        $index = zget("/app/index");
 
        if ($todos == null) {
            $todos = array();
            $index = 0;
        }
 
        $index++;
        $todos[$index] = array('id' => $index, 'value' => $item);
 
        zput("/app/todos_xml_php", $todos);
        zput("/app/index", $index);
 
        zput("/request/status", 201);
 
        $uri = zget("/request/uri");
        zput("/request/headers/out/Location", "$uri/$index");
    }
}
清单 8. onRetrieve() 方法
function onRetrieve() {
 
    $id = zget("/request/params/todos_xml_phpId");
 
    if ($id != null) {
        $todos = zget("/app/todos_xml_php");
        $value = $todos[$id];
 
        if ($value != null) {
            zput('/request/view', 'XML');
            zput('/request/xml/output', $value);
            render_view();
            return;
        }
    }
 
    // Error handling
    zput("/request/status", 404);
    echo "An error occurred while processing your request";
}
清单 9. onDelete 方法
function onDelete() {
 
    $id = zget("/request/params/todos_xml_phpId");
 
    if ($id != null) {
        $todos = zget("/app/todos_xml_php");
        unset($todos[$id]);
 
        zput("/app/todos_xml_php", $todos);
        return;
    }
 
    // Error handling
    zput("/request/status", 404);
    echo "An error occurred while processing your request";
}

JSON 概述

WebSphere sMash 体现了 Web 2.0 的本质特征,不仅支持 XML,也支持 JavaScript™ Object Notation (JSON)。(有关 JSON 的更多信息,请参见参考资料)。Groovy 的一大优势是,能够方便地解析 XML 和 JSON,不用花费大量的时间编写解析代码。

WebSphere sMash 可以使用直接 API 或间接呈现来呈现 HTTP 响应。在本文两个示例中,均使用了间接呈现来产生 XML 和 JSON 输出。调用呈现工具通常涉及以下步骤:

  1. 根据对应呈现工具在全局上下文中设置值/请求/视图。
  2. 在全局上下文中相应地设置其他特定于呈现工具的值。
  3. 调用 zero.core.views.ViewEngine.render()。

上面的示例仅仅产生 XML 数据。接下来我们将介绍如何通过在 Groovy 和 PHP 中修改少量代码来产生 JSON 数据。

下载文件的 CombiningThePowerOfWSWithAdobeFlex/src/TodoService-1.0.0/TodoService/app/resources/todos_json_groovy.groovy 和 CombiningThePowerOfWSWithAdobeFlex/src/TodoService-1.0.0/TodoService/app/resources/todos_json_php.php 中提供了产生 JSON 输出的完整 WebSphere sMash 源文件。

清单 10. 使用 Groovy 产生 JSON 输出
def outputJson(data) {
    logger.INFO {"converting ${data} to JSON"}
 
    request.headers.out.'Content-Type'='application/json'
    request.view = 'JSON'
    request.json.output = data
    render()
}
清单 11. 使用 PHP 产生 JSON 输出
zput('/request/view', 'JSON');
zput('/request/json/output', $todos);
render_view();

使用 Adobe Flex

到目前为止,本文已经介绍了如何构建应用程序的后端。接下来,我们将了解如何构建基于浏览器的应用程序来与刚刚构建的 WebSphere sMash 后端进行交互。

Adobe Flex 能生成独立于平台的富 Internet 应用程序(Rich Internet Application,RIA),此类应用程序可以一致地部署在所有主要浏览器、桌面和操作系统上(请参见参考资料)。使用 Adobe Flex 构建的 RIA 可以在使用 Adobe Flash 播放器的浏览器或使用 Adobe Integrated Runtime (AIR) 的桌面上运行。

下载文件的 CombiningThePowerOfWSWithAdobeFlex/src/todoJSON.mxml 和 CombiningThePowerOfWSWithAdobeFlex/src/todoXML.mxml 提供了下面所示的代码片段的完整 Adobe Flex 源文件。

构建 Adobe Flex 应用程序涉及到以下工作:

  1. 从 WebSphere sMash 获取数据

    通过 Adobe Flex 可以方便地使用 HTTPService 组件加载外部数据(请参见参考资料)。这里给出了执行 HTTP 请求的两种方法,一种使用 XML,另一种使用 JSON。由于 Adobe Flex 构建了 XML 支持(即使用 ECMAScript for XML (e4x) 来解析数据),因此这种情况编写的代码相对较少。为了在 Adobe Flex 中支持 JSON 序列化,需要下载 corelib 库(请参见参考资料)。清单 12 显示的示例代码将创建 HTTPService 组件并将其供应用程序访问,用于使用 WebSphere sMash 应用程序产生的 XML 数据删除、检索和创建待办事项列表中的项。

    清单 12 中的 Adobe Flex MXML 代码大量使用了 Adobe Flex 的绑定机制(大括号内的变量名),用于在运行时发送请求时动态地替换资源名称和 ID。<mx:HTTPService> 元素中指定的 URL 将由 WebSphere sMash 映射到上面构造的 Groovy 或 PHP 脚本。方法属性和 URL 将确定调用脚本中的哪个方法或函数来处理请求。

    result 和 fault 属性分别提供在成功完成请求和出现错误时要执行的代码。MXML 代码中的其他数据绑定自动处理 list 和 retrieve 调用返回的数据。create 和 delete 调用通过在完成后启动另一个 list 来刷新数据显示。

    清单 12. 使用 XML 创建 HTTPService 组件
    <!-- REST call to retrieve list of todo items -->
    <mx:HTTPService id="listTodosHS"
       url="/resources/{resource}" method="GET"
       resultFormat="e4x"/>
    
    <!-- REST call to fetch details on an item -->
    <mx:HTTPService id="retrieveTodoHS"
       url="/resources/{resource}/{idToRetrieve}" method="GET"
       resultFormat="e4x"
       result="detailsBox.visible = true"/>
    
    <!-- REST call to add a new todo item -->
    <mx:HTTPService id="createTodoHS"
       url="/resources/{resource}" method="POST"
       result="listTodosHS.send()"
       fault="listTodosHS.send()">
          <mx:request xmlns="">
             <item>{itemToAdd.text}</item>
          </mx:request>
    </mx:HTTPService>
    
    <!-- REST call to delete a todo item -->
    <mx:HTTPService id="deleteTodoHS"
       url="/resources/{resource}/{idToDelete}" method="POST"
       result="listTodosHS.send()"
       fault="listTodosHS.send()"/>

    通过使用 JSON 库,可以得到类似的功能来解析 WebSphere sMash 应用程序产生的 JSON 数据(清单 13)。此 JSON 代码和清单 12 中所示的 XML 代码的主要区别在于,此代码在 list 和 retrieve 调用的 result 处理程序中使用了显式调用来对 JSON 数据进行解码。

    清单 13. 使用 JSON 创建 HTTPService 组件
    <!-- REST call to retrieve list of todo items -->
    <mx:HTTPService id="listTodosHS"
      url="/resources/{resource}" method="GET"
      resultFormat="text"
      result="todoItems = JSON.decode(listTodosHS.lastResult as String);"/>
    
    <!-- REST call to fetch details on an item -->
    <mx:HTTPService id="retrieveTodoHS"
      url="/resources/{resource}/{idToRetrieve}" method="GET"
      resultFormat="text"
     result="detailItem = JSON.decode(retrieveTodoHS.lastResult as String);
      detailsBox.visible = true;"/>
    
    <!-- REST call to add a new todo item -->
    <mx:HTTPService id="createTodoHS"
      url="/resources/{resource}" method="POST"
      result="listTodosHS.send()"
      fault="listTodosHS.send()">
          <mx:request xmlns="">
              <item>{itemToAdd.text}</item>
          </mx:request>
    </mx:HTTPService>
    
    <!-- REST call to delete a todo item -->
    <mx:HTTPService id="deleteTodoHS"
    0  url="/resources/{resource}/{idToDelete}" method="POST"
      result="listTodosHS.send()"
      fault="listTodosHS.send()"/>
  2. 解析和显示数据

    通过 Adobe Flex 组件,可以方便地处理 HTTPService 请求的结果,如清单 14 中所示。

    清单 14. 处理 HTTPService 请求
    <!-- todo items list -->
    <mx:HBox left="10" horizontalGap="15">
    <mx:VBox backgroundColor="white"
       paddingBottom="5" paddingLeft="5"
       paddingRight="5" paddingTop="5"
       cornerRadius="5" borderThickness="1"
       borderStyle="solid" borderColor="black"
       dropShadowEnabled="true" shadowDistance="3"
       shadowDirection="right">
         <mx:Text text="Your todo items:" fontWeight="bold" fontSize="14"/>
            <mx:Repeater id="todoItemsRp"
               dataProvider="{listTodosHS.lastResult.item}">
               <mx:HBox width="100%" verticalAlign="middle"
                  paddingBottom="3" paddingLeft="3"
                  paddingRight="3" paddingTop="3"
                  rollOver="event.currentTarget.setStyle
                                         ('backgroundColor', 0xffff88)"
                  rollOut="event.currentTarget.clearStyle
                                        ('backgroundColor')">
                  <mx:CheckBox click="deleteItem(event)"
                     toolTip="Click to delete item"/>
                  <mx:Text text="{todoItemsRp.currentItem.value}"/>
                  <mx:LinkButton label="details"
                     fontSize="8" textDecoration="underline"
                     click="getItemDetails(event)"/>
               </mx:HBox>
            </mx:Repeater>
    
            <mx:Spacer height="10"/>
    
    <mx:HBox width="100%" verticalAlign="middle">
       <mx:Text text="Add:"/>
       <mx:TextInput id="itemToAdd"
          toolTip="Press Enter to add the new item."
          enter="createTodoHS.send(); event.currentTarget.text = ''"/>
    </mx:HBox>
    </mx:VBox>
    
    <!-- details for an individual item -->
    <mx:VBox id="detailsBox" visible="false" showEffect="{fade}"
       backgroundColor="white"
       paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5"
       cornerRadius="5" borderThickness="1"
       borderStyle="solid" borderColor="black"
       dropShadowEnabled="true" shadowDistance="3"
       shadowDirection="right">
       <mx:Text text="Item details:" fontWeight="bold" fontSize="14"/>
       <mx:Text text="ID: {retrieveTodoHS.lastResult.id}"/>
       <mx:Text text="Value:"/>
       <mx:TextArea text="{retrieveTodoHS.lastResult.value}"/>
    </mx:VBox>
    </mx:HBox>

Adobe Flex 中的事件处理

Adobe Flex 使用 ActionScript,这是基于 ECMAScript(请参见参考资料)的面向对象的脚本语言,允许创建动态用户界面来提供各种交互能力,如清单 15 中所示的事件处理。请注意,creationComplete() 函数中需要额外的步骤来在 Adobe Flex 生成 HTTP REST 调用的方式与 WebSphere sMash 预期接受的格式之间进行中介。

清单 15. Adobe Flex 代码示例
/**
 * Logic to run after the mx:Application has been created.
 */
 internal function creationComplete():void {
    // initial population of the list
    listTodosHS.send();

    // Flex doesn't know how to generate an HTTP DELETE.
    // Fortunately, sMash/Zero will interpret an HTTP POST with
    // an X-Method-Override: DELETE header as a DELETE.
    deleteTodoHS.headers['X-Method-Override'] = 'DELETE';

    // set a dummy body for the POST so Flex won't change it to
    // a GET
   deleteTodoHS.request['foo'] = 'I really do want a POST';
  }


 /**
  * Called when the user requests details for an item.
  */
  internal function getItemDetails(event:MouseEvent):void {
     // find id of item to be deleted
     var lb:LinkButton = event.currentTarget as LinkButton;
     var i:int = lb.parent.parent.getChildIndex(lb.parent);
     idToRetrieve = listTodosHS.lastResult.item[i-1].id;

     // hide details box while we're getting details
     detailsBox.visible = false;

     // ask server for details
     retrieveTodoHS.send();
  }


  /**
   * Called when the user checks on a box to delete an item
   */
  internal function deleteItem(event:MouseEvent):void {
     // find id of item to be deleted
     var cb:CheckBox = event.currentTarget as CheckBox;
     var i:int = cb.parent.parent.getChildIndex(cb.parent);
     idToDelete = listTodosHS.lastResult.item[i-1].id;

     // hide details if deleting same item
     if (retrieveTodoHS.lastResult != null &&
     idToDelete == retrieveTodoHS.lastResult.id)
     detailsBox.visible = false;

     // tell server to delete item, list will be updated when
     // delete finishes
     deleteTodoHS.send();
  }

本文提供的下载文件包含了此示例程序的完整源代码。

实际运用

Adobe Flex 并不提供对 JSON 序列化的现成支持。为了添加此支持,您需要从 Adobe 下载 corelib 库,并将其添加到 WebSphere sMash 应用程序的 libs 目录(请参见参考资料)。为了部署 Adobe Flex 应用程序,必须将此应用程序 (.swf) 存储在 WebSphere sMash 应用程序的 public 目录中。本文提供的源代码中包括两个 Adobe Flex 应用程序,第一个使用 XML,第二个使用 JSON。启动 WebSphere sMash 服务器后,可以通过分别导航到 http://localhost:8080/todoXML.html 或 http://localhost:8080/todoJSON.html 访问这两个应用程序。

在下图中可以看到:

  • 首次加载应用程序时调用 onList() 方法后应用程序的情况(图 3)。
  • Adobe Flex 前端发送向待办事项列表中添加新项的 HTTP POST 请求(图 4)。
  • Adobe Flex 接口侦听从待办事项中删除项的 onclick 事件(选中复选框时)(图 5)。
  • 单击待办事项列表中的项时调用 onRetrieve() 的情况(图 6 和图 7)。
  • 应用程序可以在 Groovy 和 PHP 服务器端实现之间切换(图 8)。
图 3. 调用 onList() 方法后应用程序的情况
图 3. 调用 onList() 方法后应用程序的情况
图 3. 调用 onList() 方法后应用程序的情况
图 4. 向待办事项列表添加实现
图 4. 向待办事项列表添加实现
图 4. 向待办事项列表添加实现
图 5. 从待办事项列表中删除项
图 5. 从待办事项列表中删除项
图 5. 从待办事项列表中删除项
图 6. 用户在待办事项中选择项
图 6. 用户在待办事项中选择项
图 6. 用户在待办事项中选择项
图 7. 调用了 onRetrieve() 方法后
图 7. 调用了 onRetrieve() 方法后
图 7. 调用了 onRetrieve() 方法后
图 8. 应用程序可以在 Groovy 和 PHP 之间进行切换
图 8. 应用程序可以在 Groovy 和 PHP 之间进行切换
图 8. 应用程序可以在 Groovy 和 PHP 之间进行切换

总结

WebSphere sMash 提供了简单但同时却非常强大的框架,用于帮助快速构建 Web 应用程序。通过 Groovy 和 PHP 动态脚本语言的支持,WebSphere sMash 允许您跟上潮流的步伐,迅速开始开发 Web 2.0 应用程序。本文演示了基于 REST 并采用相关标准的技术,通过使用这些技术,可以将使用 Adobe Flex 编写的元素丰富的高交互性用户界面与 WebSphere sMash 后端逻辑结合使用。有关本文所述主题的更多详细信息,请参见下面列出的参考资料。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere, SOA and web services
ArticleID=343185
ArticleTitle=将 WebSphere sMash 的强大功能与 Adobe Flex 相结合
publish-date=10082008