使用 sMash 管理图书馆

WebSphere sMash 为您带来一种家的乐趣

了解如何使用 IBM® WebSphere® sMash 为您的家庭图书馆构造自己的图书馆目录系统,以创建动态的用户界面和 Derby 图书数据库的代表性状态传输(REpresentational State Transfer,RESTful)接口。您将能够执行通常的列表、创建、检索、更新和删除 (LCRUD) 操作,但最重要的是,您将非常开心地探索这个奇妙的新软件。 本文来自于 IBM WebSphere Developer Technical Journal

Kevin Dzwonchyk, 顾问软件工程师, IBM

作者照片Kevin Dzwonchyk 是隶属 IBM Software Services 的一名顾问软件工程师,服务于 IBM Global Account 团队。他自从 1997 年以来一直在 IBM 从事 IBM 软件产品的支持和服务以及开发工作,并重点关注 WebSphere 品牌。他目前正在推动在 sMash 平台上利用 Groovy 和 PHP 脚本的 Web 2.0 创新。他对利用前沿产品和概念的创新具有浓厚的兴趣。



Ron Lynn, 高级软件工程师, EMC

Ron Lynn 的照片Ron Lynn 是 IBM Web Enablement and Support 团队的一名高级软件工程师。他在加利福尼亚中部的圣华金河流域的一家小农场工作。Ron 目前正在从事内部门户项目,重点是为 IBM 的合作伙伴应用程序提供更多的可见性。他多次发表有关 Portlet 开发和其他主题的著作和演讲,并且是 Programming Portlets 一书的合著者。



2009 年 1 月 14 日

引言

人们将情景应用程序定义“……为具有特定需要的一小群人创建的软件”。

当然,存在某种在家的情景……

一组精心设计的嵌入书架包含数百本需要重新装裱的图书。在从书架中清理出所有图书以便完成重新装裱工作时,似乎正是重新整理所有图书并创建目录系统的理想时机,从而使我们更好地访问相关信息,例如我们拥有什么图书,以及有关那些图书的特定详细信息。目录系统将帮助我们确定自己是否有重复的图书,甚至帮助确定我们还不知道自己拥有的图书。简而言之,我们面对一个需要某个应用程序的情景。这是将 IBM WebSphere sMash 投入应用的多么完美的机会呀。


在 sMash 中开发情景应用程序

假设

在开始之前,本文假设您已经在计算机上安装了 WebSphere sMash(或 Project Zero,这是 WebSphere sMash 的社区开发实现)。该产品的下载和安装非常简单,并且存在两个可用的版本:

任一个版本都应该能完美地工作,但是本文使用了 Silverstone 的 M2(里程碑 2)版本作为基础。

至少可以采用两种方法构建 sMash 应用程序。一种方法是使用 sMash 的 Eclipse 插件。另一种方法是使用 sMash 附带的基于 Web 的一流应用程序构建器 (AppBuilder)。这两种环境都各有优点和价值,因此选择哪一种环境只是个人的偏好问题。本练习使用 sMash 附带的基于 Web 的 AppBuilder。

创建基础

让应用程序迅速启动并正常运行起来的最容易方法是使用 Zero 资源模型(Zero Resource Model,ZRM),该模型提供了非常简单的方法来创建数据存储区,并为该数据存储区提供了 RESTful 处理程序。

要创建数据存储区,您只需为其创建一个模型:定义字段以及那些字段的选项的 JSON 文件。该模型用于创建数据存储区,并且是关于该数据存储区的所有元数据的来源之一。ZRM 通常用于全新应用程序,即没有遗留数据源的应用程序。

下面让我们为您的卡片目录定义一个简单的模型。精通图书馆学的读者可能对该模型中的简单字段集不以为然。这非常正常,但是务必要记住,这是一个情景应用程序,我们的目标是获得能迅速正常运行起来以满足您需要的应用程序。

  1. 启动 AppBuilder
    1. 首先启动 AppBuilder。从命令行运行 appbuilder 命令。此命令已随时间推移而更改,因此取决于所使用的 sMash 版本,您可能需要调整输入的内容。这同时适用于 Windows® 和 Linux®。这两种操作系统分别有相应的脚本(批处理文件),它们一般运行得非常好。但是,如果您遇到困难,可以查看一下环境变量。您需要在路径中包括 Java™ 和 Zero 目录,并且必须将 JAVA_HOME 环境变量设置为与路径中相同的 Java。(本文的作者之一就非常惭愧地犯了这个错误。)在 M2 版本中,如果您仅输入 appbuilder,则会看到可传递给该脚本的参数列表(图 1)。

      图 1. AppBuilder 脚本参数
      图 1. AppBuilder 脚本参数
    2. 启动 AppBuilder 以后,您应该在命令窗口中看到一条消息,其中显示了与图 2 所示类似的内容。

      图 2. AppBuilder 成功启动
      图 2. AppBuilder 成功启动

      这显然是从 Windows 命令行完成的,不过在 Linux 上也应该出现相同的内容。如果安装了 Firefox,则会在第一次使用 AppBuilder 时显示 AppBuilder Welcome 面板(图 3)。如果没有安装 Firefox,请从命令窗口将 URL http://localhost:8070 输入浏览器。

      图 3. AppBuilder Welcome 面板
      图 3. AppBuilder Welcome 面板

      如果看到除 Welcome 屏幕以外的 AppBuilder 面板,请不要着急。这只是意味着您也许已经使用过 AppBuilder 了。

      AppBuilder 通常在计算机上本地运行。projectzero.org 上有一些论坛帖子讨论了如何在服务器上运行 AppBuilder(如果您需要此类配置的话),不过这超出了本文的范围。

  2. 创建应用程序
    1. AppBuilder 是为易用性而设计的,它在 Welcome 面板上为您列出了包括三个步骤的简单过程,方便您立即构建应用程序。

      图 4. 创建应用程序
      图 4. 创建应用程序

      下面继续执行那些步骤,首先单击左侧的绿色 Actions 框中的 Create new application 链接(图 5)。

      图 5. AppBuilder 操作
      图 5. AppBuilder 操作
    2. Create new application 对话框(图 6)中,为所有字段输入或选择适当的值,然后单击 Create 按钮。在图 6 中,您将看到我们做出的选择(我们的应用程序名称为“CardCatalog”),但是您可以随意使用(并记住)自己的值。

      图 6. 创建新应用程序
      图 6. 创建新应用程序
    3. 您现在应该看到已创建或引入 AppBuilder 的所有应用程序的清单。在图 7 中,我们拥有的唯一应用程序就是新的 CardCatalog 图书馆应用程序。请找到您的 CardCatalog 应用程序并单击标题。

      图 7. 应用程序列表
      图 7. 应用程序列表

      这会将您带到应用程序项目空间中。您现在已经做好了准备,可以为您的应用程序创建资源、模板、模型等等了。

  3. 构建数据模型
    1. 当您开始构建应用程序的数据模型定义时,最初会显示一个信息帮助页面(图 8)。无论您是创建新文件还是编辑现有文件,该页面都将使您开始入手。对于本练习,您将通过单击绿色的 Recent Files 框中的 New File 链接创建新文件。

      图 8. 构建数据模型
      图 8. 构建数据模型
    2. 一个下拉框将显示几个不同的文件路径以便您从中做出选择(图 9)。由于您将创建数据模型,因此请从列表中为您的新模型定义选择 Zero Resource Model in /app/models

      图 9. 文件路径选择
      图 9. 文件路径选择
    3. File Create 对话框允许您选择模型定义文件名称,在此例中为“books”。

      图 10. File Create 对话框
      图 10. File Create 对话框

      定义文件的名称非常重要,因为根据约定,此名称将用于资源的名称。换句话说,您将使用如下 URL 调用此资源:http://localhost:8080/resources/books。该名称还是类型名称,并且该类型的所有实例都必须遵守此定义所给定的约束。

      请输入名称并单击 Create 按钮。

    4. Missing Dependency 随即显示出来(图 11)。

      图 11. Missing Dependency 对话框
      图 11. Missing Dependency 对话框

      请继续并单击 Add 按钮。这会自动将 zero.resource 依赖项添加到您的 ivy.xml 文件:

      <dependency name="zero.resource" org="zero" rev="[1.0.0.0, 2.0.0.0["/>

      本质上,此依赖项告诉 WebSphere sMash 您打算在此应用程序中使用 ZRM,因此 WebSphere sMash 将相应地创建一个允许您使用 ZRM 的条件。

    5. books.json 文件现在应该已打开进行编辑——但是,首先请单击左侧列中的 ivy.xml 文件,您将看到 zero.resource 已经添加到其中。可选地,您可以单击 Dependencies 选项卡,以验证该依赖项已添加,如图 12 的底部所示。

      图 12. Application Dependencies 选项卡
      图 12. Application Dependencies 选项卡

      如果 zero.resource 依赖项缺失,则需要将其添加到 ivy.xml 文件,无论是通过直接编辑该文件,还是使用上面的依赖项面板(图 11)。

    6. 打开 books.json。用于编辑模型的用户界面已随时间推移而更改。图 13 显示了 M2 版本的用户界面,该界面允许您在编辑器中以图形方式添加字段。

      图 13. 模型编辑器
      图 13. 模型编辑器

      对于每个字段,请单击 String 按钮以添加新的字符串值,然后单击 打开字段编辑器 按钮以打开字段属性编辑器。在 Basic 选项卡中输入字段名称值,然后在 Advanced 选项卡中输入字段大小值。缺省字段大小为 50 个字符,这对许多字段来说还不足够大。请为您的字段名称和大小输入以下值:

      • name, 512
      • author, 512
      • description, 1024
      • isbn, 17

      如果希望了解幕后的细节,可以单击 Explorer 选项卡并导航到该文件,以便能够对其进行查看。您应该看到与清单 1 所示类似的内容。

      清单 1
      {
          "collections": {
          }, 
          "fields": {
              "name": {"label": "", "required": false,  "type": "string", 
                  "description": "", "default_value": "", "max_length": 512
              }, 
              "author": {"label": "", "required": false"type": "string", 
                  "description": "", "default_value": "", "max_length": 512
              }, 
              "description": {"label": "","required": false,"type": "string",
                   "description": "", "default_value": "", "max_length": 1024
              }, 
              "isbn": {"label": "", "required": false,  "type": "string", 
                  "description": "", "default_value": "", "max_length": 17
              }
          }
      }

      如果您的 WebSphere sMash 版本没有提供一流的 GUI 编辑器(图 13),您可以将上面的 JSON 代码添加到 books.json 文件以创建该模型。

      您当然可以随心所欲地添加或更改字段,但是首先让我们看一下此代码中的内容:

      • 字段元素是模型定义的必需组成部分,因此需要在这里包括它们的道理实际上就不用多说了。
      • 然后依次对每个字段命名,每个字段表示一个数据库字段。
      • 其中每个字段最起码要使用某种类型做进一步的限定。
      • 我们添加了进一步的元数据来定义每个字符串的 max_length:default max_length 为 50 个字符,因此您需要为几乎每个字符串字段设置此值。
      • 除了显式标识的字段以外,还会自动为您创建另外两个字段:
        • id 字段是从 100 开始并自动递增的整数,创建此字段是为了将其用作该数据实例的唯一标识符。
        • updated 字段包含对该实例做出的最新更新的时间戳。
  4. 同步数据模型

    您现在可以同步该模型,从而生成并执行所需的 SQL 以创建数据库。这可以从命令行或从 AppBuilder 本身中完成。无论使用哪一种方法,所发出的命令均为 zero model sync,并且输出是相同的。使用 AppBuilder 的方法如下:

    1. 单击顶部的 Console 选项卡,然后单击左侧导航栏中的 Command Prompt 链接。

    2. zero model sync 输入 Enter a zero command text 字段,然后单击绿色的 Enter 按钮。您的输出应该与请单 2 所示类似。

    清单 2
    Available commands: zero,svn,clear,help
    * Commands are run from the current application root directory. 
    command> zero model sync
    CWPZC9225I: Using default Derby database configuration. Located at -> db/resource in 
    	application root.
    CWPZC9223I: Found 1 model types
    CWPZC9212I: Created table -> BOOKS for Type -> books using SQL ->
        CREATE TABLE books (
            name VARCHAR(512),
            author VARCHAR(512),
            description VARCHAR(1024),
            isbn VARCHAR(17),
            id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 100, 
    	INCREMENT BY 1) NOT NULL,
            updated TIMESTAMP NOT NULL
        )
    
    CWPZT0600I: Command model sync was successful

    这样就成功创建了一个空模型。对自己赞赏一番吧!

  5. 向模型添加数据

    下面需要在模型中放置一些数据,以便在运行应用程序时能够看到某些内容。为此,您需要在 app/models/fixtures 目录中创建负载文件。与资源模型定义文件一样,这些数据文件同样是 JSON 文件,并包含将加载到模型中的对象。这些文件的不同之处在于,它们可能包含来自多种不同资源模型类型的数据。换句话说,如果您还有一个“authors”模型,则这些文件可能同时包含来自“books”模型和“authors”模型的数据。

    1. 要创建数据文件以将数据加载到模型中,请再次在 Recent Files 框中单击 New File 链接,然后选择 Other File(图 14)。

      图 14. 创建数据文件
      图 14. 创建数据文件
    2. File Create 对话框将再次显示出来(图 10)。填入您希望创建的数据文件的路径和文件名。在此例中,路径将为 /app/models/fixtures,文件名将为 load.json。在该文件中,您将输入两本图书的数据,如清单 3 所示,目的只是为了让图书馆启动起来。

      清单 3
      [
          {
              "type": "books",
              "fields": {
                  "name": "Programming Portlets",
                  "author": "Ron Lynn, Joey Bernal, Peter Blinstrubas, Usman Memon, 
      			Cayce Marston, Tim Hanis, Varad Ramamoorthy, and Stephan 
      			Hepper",
                  "description":  "Shameless plug",
                  "isbn": "978-1-931182-28-7"
              }
          },
          {
              "type": "books",
              "fields": {
                  "name": "The Pragmatic Programmer",
                  "author": "Andrew Hunt and David Thomas",
                  "description":  "Good stuff",
                  "isbn": "0-201-61622-X"
              }
          }
      ]
    3. 通过运行 zero model loaddata <filename> 命令,可以将放在 app/models/fixtures 目录中的任何数据加载到模型中,因此,请再次转到命令行或 AppBuilder 控制台运行以下命令:

      command> zero model loaddata load.json

      无论您如何运行该命令,都应该会看到与清单 4 所示类似的消息,其中指示了成功的加载。

      清单 4
      command> zero model loaddata load.json
      CWPZC9225I: Using default Derby database configuration. Located at -> 
      	db/resource in application root.
      File -> C:\zero\CardCatalog\app\models\fixtures\load.json
      CWPZC9214I: Created member
      	Type -> books
      	Data -> {description=Shameless plug, isbn=978-1-931182-28-7, 
      	name=Programming Portlets, author=Ron Lynn, Joey Bernal, Peter 
      	Blinstrubas, Usman Memon, Cayce Marston, Tim Hanis, Varad 
      	Ramamoorthy, and Stephan Hepper}
      
      CWPZC9214I: Created member
      	Type -> books
      	Data -> {description=Good stuff, isbn=0-201-61622-X, name=The Pragmatic 
      	Programmer, author=Andrew Hunt and David Thomas}
      
      CWPZT0600I: Command model loaddata was successful
    4. 如果已经或希望创建引导数据(始终希望包括在新创建的模型中的数据),您可以在 app/models/fixtures 目录中创建名为 initial_data.json 的文件。这个特殊数据文件将在每当创建或重新创建数据库时加载,从而消除了上面的数据加载步骤。除了 initial_data.json 会自动为您加载以外,它与其他数据文件之间没有任何区别。在使用 ZRM 开发应用程序时,这是一个便利的功能和节省时间的方法。

    数据一经加载,您就可以对其进行测试。但是在此之前,最好做一些实际检查。

  6. 迭代模型设计

    根据我们的经验,您通常最终会在项目过程中对数据模型设计迭代多次,然后才能得到想要的结果。因此,我们要提醒您注意两个可以使该过程更加顺利(如果不是真正快乐的话)的功能。

    您可以在自己愿意的任何时候运行 zero model sync 命令:任何以前创建的模型都将保持不变,同时创建新的模型。即使您更改某个模型,sync 命令也不会影响已经创建的模型。

    例如,假设您希望向“books”模型添加用于注释的字段。您只需编辑模型并添加该字段。这很容易在 GUI 编辑器中完成,方法与您前面添加字段的方法相同。只需添加一个 notes 字段,并将大小设置为 1024。另一个选项是编辑文件,如清单 5 所示。

    清单 5
    {
        "fields" : {
            "name": {"type": "string", "max_length": 512}, 
            "author": {"type": "string", "max_length": 512}, 
            "description": {"type": "string", "max_length": 1024}, 
            "isbn": {"type": "string", "max_length": 17},
            "notes": {"type": "string", "max_length": 1024}
        }
    }

    现在,当您运行 zero model sync 时,可以看到没有做出任何更改,因为该模型已经存在(清单 6)。

    清单 6
    command> zero model sync
    CWPZC9225I: Using default Derby database configuration. Located at -> db/resource in 
    	application root.
    CWPZC9223I: Found 1 model types
    CWPZC9224I: Type -> books already created with table name -> books
    CWPZT0600I: Command model sync was successful

    sync 命令不会更改现有的模型。为了使更改生效,您必须运行 zero model reset 命令,此命令将丢弃表并重新创建表(清单 7)。

    清单 7
    command> zero model reset
    CWPZC9225I: Using default Derby database configuration. Located at -> db/resource in 
    	application root.
    CWPZC9223I: Found 1 model types
    CWPZC9215I: Executed SQL ->
        DROP TABLE books
    
    CWPZC9212I: Created table -> BOOKS for Type -> books using SQL ->
        CREATE TABLE books (
            name VARCHAR(512),
            author VARCHAR(512),
            description VARCHAR(1024),
            isbn VARCHAR(17),
            notes VARCHAR(1024),
            id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 100, 
    	INCREMENT BY 1) NOT NULL,
            updated TIMESTAMP NOT NULL
        )
    
    CWPZT0600I: Command model reset was successful

    如果本文是某个会议上的讨论,此时会有许多人举手提出相同的问题:“表中的数据怎么办呢?”对此问题,我的回答是“它被丢弃、消失、删除了。”然后,另外会有许多人提出诸如“如果我需要保留该数据怎么办呢?” 之类问题。没问题,WebSphere sMash 已经为您考虑过了。

    实际上存在两种保留数据的单独方法,具体取决于您的 SQL 知识水平。第一种方法是使用 zero.data 直接更新数据库表;这超出了本文的范围,因此我建议您参考 Project Zero 网站上的文档。

    第二种方法是将数据转储到某个文件,更改模型,重置模型,然后将转储的数据重新加载到新模型中:

    1. 发出 zero model dumpdata 命令来转储数据是相当容易的:

      command> zero model dumpdata app/models/fixtures/exported.json
      CWPZT0600I: Command model dumpdata was successful

    2. 下一步,更新模型以反映更改。在此例中,只需添加一个名为“published”的新日期字段,然后发出 zero model reset 命令(清单 8)。

      清单 8
      command> zero model reset
      CWPZC9225I: Using default Derby database configuration. Located at -> 
      	db/resource in application root.
      CWPZC9223I: Found 1 model types
      CWPZC9215I: Executed SQL ->
          DROP TABLE books
      
      
      CWPZC9212I: Created table -> BOOKS for Type -> books using SQL ->
          CREATE TABLE books (
              name VARCHAR(512),
              author VARCHAR(512),
              description VARCHAR(1024),
              isbn VARCHAR(17),
              notes VARCHAR(1024),
              published DATE,
              id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 
      	100, INCREMENT BY 1) NOT NULL,
              updated TIMESTAMP NOT NULL
          )
      
      
      CWPZT0600I: Command model reset was successful
    3. 请注意,您现在有了一个“published”字段可用。完成此过程后,通过使用 zero model loaddata 命令,以先前加载数据的相同方式重新加载导出的数据(清单 9)。

      清单 9
      command> zero model loaddata exported.json
      CWPZC9225I: Using default Derby database configuration. Located at -> 
      	db/resource in application root.
      File -> C:\zero\CardCatalog\app\models\fixtures\exported.json
      CWPZC9214I: Created member
      	Type -> books
      	Data -> {notes=null, description=Shameless plug, 
      	isbn=978-1-931182-28-7, updated=2008-10-03 10:20:15, name=Programming 
      	Portlets, id=100, author=Ron Lynn, Joey Bernal, Peter Blinstrubas, Usman 
      	Memon, Cayce Marston, Tim Hanis, Varad Ramamoorthy, and Stephan Hepper}
      
      CWPZC9214I: Created member
      	Type -> books
      	Data -> {notes=null, description=Good stuff, isbn=0-201-61622-X, 
      	updated=2008-10-03 10:20:15, name=The Pragmatic Programmer, id=101, 
      	author=Andrew Hunt and David Thomas}
      
      CWPZT0600I: Command model loaddata was successful

    您的模型现在已经更新,并且数据已得到保留。您仍然必须填充数据字段,因为您的数据先前未包含值。

    下一步,让我们看看如何方便快捷地将新数据模型作为 RESTful 服务公开。

创建 RESTful 服务

ZRM 具有一种奇妙的方法可以将模型作为 RESTful 服务公开。您只需编写单个代码行,您的数据模型就会被公开。

  1. 请返回到文件编辑器(图 14)并创建一个新文件,这次选择 Resource Handler in /app/resources。由于您的模型名为“books”,您应该将处理程序命名为相同的名称(图 15)。

    图 15. 创建资源处理程序
    图 15. 创建资源处理程序
  2. 当编辑器显示出来时,将以下代码行输入 books.groovy 文件,并删除可能存在的任何其他代码行:

    ZRM.delegate()

    这单个调用就是您将数据模型作为服务公开所需要的所有内容。

  3. 让我们启动该应用程序并看看它能做什么。单击出现在 AppBuilder 右上角的绿色箭头图标旁边的 Start 链接(图 16)。(您还会注意到紧跟在 Start 按钮右边的 URL 和端口号。当您在下一步测试服务时将需要它们。)

    图 16. 启动应用程序
    图 16. 启动应用程序

    Start 按钮更改为 Stop 按钮时,您可以判断应用程序已经启动。

    关于 WebSphere sMash 的一个非常美妙之处在于,更改会在已启动的应用程序中自动生效,因此不需要停止应用程序,然后在对代码或任何其他内容作出更改之后重新启动应用程序。当应用程序启动以后,您可以测试该服务以确定能够使用它来做什么。

测试 LCRUD

让我们看一下两种测试该 RESTful 服务的列表、创建、更新和删除功能的方法。第一种方法是使用诸如 Poster 之类的工具,这是一个 Firefox 外接程序,允许您发出 RESTful 调用并查看返回的 JSON 对象。这对于 RESTful 服务开发人员来说非常有用。第二种方法是使用 WebSphere sMash Dojo datagrid 小部件向服务添加简单的用户界面。

Poster

这是一个非常棒的工具,可以深入到客户端与 RESTful 服务之间的通信细节,但它不是非常的用户友好。

Poster 是一个 Firefox 外接程序,允许您在任何基于 Web 的 GUI 之外探索和测试 RESTful 服务。下载 Poster(请参见参考资料)以后:

  1. 打开 Poster。提示:安装 Poster 后,FireFox 窗口底部会显示一个很小的“P”图标。单击此图标即可打开该工具。

  2. 将以下 URL 输入 Poster,并提交您在 AppBuilder 的右上角看到的任何主机和端口号: http://localhost:8080/resources/books.

  3. 单击 GET 操作旁边的 GO 按钮(图 17)。

    图 17. 运行 Poster
    图 17. 运行 Poster

    Poster 将向您新创建的服务发送请求,并访问数据库中的完整图书列表(图 18)。

    图 18. Poster 响应
    图 18. Poster 响应

    可以使用 Poster 做许多事情以试验您的服务:

    • 您可以使用类似如下的 URL 按ID 检索图书:
      http://localhost:8080/resources/books/100
      这将检索 ID = 100 的图书。
    • 您可以基于字段对请求进行筛选,例如:
      http://localhost:8080/resources/books?name__startswith=Programming
      或者 http://localhost:8080/resources/books?name__contains=Port
      可以对模型中的任何字段使用这些筛选器。有关完整的筛选参数列表,请查看 projectzero.org 上的 Zero 资源筛选器条件。
    • 还可以通过这种方式创建新数据。您只需返回到原始的列表 URL:
      http://localhost:8080/resources/books
  4. 将内容类型设置为 application/json,将操作设置为 POST 方法,并设置内容以发送清单 10 中的数据。

    清单 10
    {“name”:”Dojo:  The Definitive Guide”,”author”:”Matthew A. Russell”,
    ”description”:”“,”isbn”:”978-0-596-51648-2”,”notes”:”Loaned to Kevin”}

    图 19 显示了创建新数据的大致情况。

    图 19. 创建新数据
    图 19. 创建新数据

    一旦单击 POST 操作旁边的 GO 按钮,您将看到与图 20 所示类似的响应。

    图 20. Post 响应
    图 20. Post 响应
  5. 如果再次列出图书,您将看到列表中的新图书(图 21)。

    图 21. 显示新数据
    图 21. 显示新数据

哎哟!我一定是单击了 GO 按钮两次,因为新图书在图 21 的结果中显示了两次。实际上,这是一个幸运的意外,因为我们可以了解如何从该服务删除记录。

  1. 您将注意到图 21 中 ID 值为 102 和 103 的记录是刚才输入的图书的重复记录。要删除 ID 为 103 的图书,您只需将 URL 设置为指向项目 103,将方法更改为 DELETE,然后再次单击 GO(图 22)。如果成功的话,您将获得响应代码 200。

    图 22. 删除记录
    图 22. 删除记录
  2. 关于 LCRUD,需要考虑的另一个方面是更新。您将使用 PUT 操作执行更新。在此例中,您希望更新刚才输入的图书,因为“Kevin”在阅读本文的此部分内容之后将该书归还了。为此,您需要再次将 URL 指向您希望更新的特定图书,将内容类型设置为 application/json,将操作设置为 PUT,并发送您希望更新的内容(图 23)。

    图 23. 更新数据
    图 23. 更新数据

    请注意,您需要发送所有字段,否则您最终将会清除某些数据。

Datagrid

要使用更加用户友好的 Datagrid Dojo 组件,可以执行以下操作:

  1. 首先将 Dojo 添加到您的项目。转到 Dependencies 选项卡并单击 Add。找到 zero.dojo 模块,选择它,然后单击 Add(图 24)。您将看到 zero.dojo 现已成为依赖项之一。

    图 24. 依赖项
    图 24. 依赖项
  2. 下一步,在 /public 目录中创建一个新的 HTML 页面,并将其命名为 datagrid.html,其内容如清单 11 所示。

    清单 11
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Testing with the Datagrid</title>
        <script type="text/javascript" src="/dojo/dojo.js"
            djConfig="parseOnLoad: true"></script>
        <script type="text/javascript">
            dojo.require("dojo.parser");
            dojo.require("zero.resource.DataStore");
            dojo.require("zero.grid.DataGrid");
        </script>
        <style type="text/css">
            @import "/dijit/themes/soria/soria.css";
            @import "/dojo/resources/dojo.css";
            @import "/zero/grid/DataGrid/DataGrid.css";
            @import "/dojox/grid/_grid/Grid.css";
            @import "/dojox/grid/_grid/soriaGrid.css";
        </style>
    </head>
    <body class="soria">
        <!-- DataStore instance -->
        <div dojoType="zero.resource.DataStore" jsId="bookstore"
             contextRoot="" resourceCollection="books"></div>
    
        <!-- DataGrid instance -->
        <div dojoType="zero.grid.DataGrid" id="datagrid"
            store="bookstore" style="width: 600px; height: 300px;"></div>
    </body>
    </html>
  3. 完成此步骤后,假设您还没有关闭服务器,请将以下 URL 输入新浏览器窗口:http://localhost:8080/datagrid.html。相应地,您应该接收到数据库中的所有图书的完整列表。非常轻松!

这个 Datagrid 具有各种帮助您完成 LCRUD 操作的功能。这个小示例应该让您基本了解了如何将 RESTful 服务作为数据存储区与内置的 Dojo 小部件或您自己的自定义 Dojo 小部件一起使用。以此为起点,您应该可以顺利地创建与 RESTful 服务交互的动态用户界面了。


总结

本文介绍了如何使用 WebSphere sMash 构造自己的简单目录系统,以创建动态用户界面和到 Derby 图书数据库的代表性状态传输 (RESTful) 接口。通过本练习,您了解了如何执行典型的列表、创建、检索、更新和删除 (LCRUD) 操作,但最重要的是,我们希望您像我们在整理这些示例时一样尽可能愉快地使用这个新的软件产品。


下载

描述名字大小
Sample application filesCardCatalog-1.0.0.zip100 KB

参考资料

学习

获得产品和技术

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere, Web development
ArticleID=362041
ArticleTitle=使用 sMash 管理图书馆
publish-date=01142009