利用 Rational Application Developer 7.0 及其更新版本在 JavaServer Pages 中使用 Service Data Objects

本文详细介绍了如何使用 IBM® Rational® Application Developer 的新特性开发 Service Data Objects(SDO,服务数据对象)。它使您能够在无需任何编程知识的情况下,使用复杂的查询来创建数据库视图。

Geetika Tandon, WebSphere 信息工程师, IBM

Geetika Tandon photoGeetika Tandon 是位于华盛顿 D.C 区的 IBM Federal Software Group 的一名 WebSphere 信息工程师。在其当前工作之前,她是工作于 RFID 解决方案和先期项目的 Websphere 的 IBM 软件服务的一名 Java 和 WebSphere 开发人员。Geetika 持有 UC Santa Barbara 的计算机博士学位。



2008 年 9 月 04 日

概述

Service Data Objects (SDO,服务数据对象)是一项基于标准的技术,它被用来在服务组件架构(Service Component Architecture )中的各个服务组件之间传送数据。这项技术现在已经被扩展到 Java™Server Pages,使用一项简单的、基于向导的拖放技术来创建数据视图和数据库查询。

本文详细介绍了如何使用 IBM® Rational® Application Developer 特性开发 Service Data Objects 技术,并且假定您在某种程度上熟悉该产品、Java™ Database Connectivity API (JDBC)、以及 Data Sources。


支撑技术

下面是本文中所使用的一些基本技术的定义。

Service Data Objects

Service Data Object (SDO,服务数据对象)架构为数据应用程序开发提供了一个统一的结构。在 SDO 的帮助下,您无需熟悉一项特定技术的应用程序接口就可以访问和利用数据(请参见 参考资源小节中的 Service Data Objects 介绍)。在某些方面,它类似于 Eclipse 架构,提供了一个整合开发工具的基础。SDO 既有一个静态的(或者强类型的)编程模型,又有一个动态的(或者松类型的)编程模型。这使得我们拥有一个简单的统一编程模型,而无需牺牲掉工具和架构所需要的动态模型。使用 SDO,作为一个应用程序编程人员的您就能够对不同种类的数据资源中的数据进行统一地访问和操作,包括相关的数据库、XML 数据资源、网络服务、以及企业级信息系统。

JavaServer Pages

JavaServer Pages (JSP)最初是为将网络设计者从编程人员中分离出来而被开发的(从而使得陈述逻辑从业务逻辑层中分离出来)。然而,JSP 中的数据库访问既可以使用嵌入式 SQL 代码(就像 JSP 代码中的 scriptlets 一样被嵌入),也可以通过 Java™ Bean 引用(因此需要 Java™ 和 JDBC 的知识)被完成。基于 SDO 向导的使用解决了这一问题。使用这一技术,您就可以在无需使用任何程序性结构或者嵌入式代码的情况下,执行复杂的数据库查询。

Rational Application Developer

Rational Application Developer V7.0 (或更新版本)的特性提供了全面的集成开发环境(IDE),我们用它来开发需要 Servlet 和 JSP 的应用程序。


初始设置

为了展示这项技术,您需要安装以下三个工具:

  1. 一个至少包括一个数据表的数据库(本例中使用的是一个被称为 SDOJSP 的 IBM® DB2® 数据库)。
  2. Rational Application Developer 中的一个 Dynamic Web Project,其中至少包括一个访问数据库的 JSP。
  3. IBM® WebSphere® Application Server 中的一个 DataSource。

数据库的设置

数据库的设置并不属于本文的范围。我们假定您已经具备数据库的相关知识,并且能够创建一个基本的数据库和数据表。对于本文来说,数据库的细节如下:

  • 数据库的名称:SDOJSP
  • 计划的名称:GTANDON

它拥有两个数据表,细节如下:

  • PERSONAL:ID(VARCHAR 20)、FIRSTNAME(BARCHAR 25)、LASTNAME(VARCHAR 25)、PRIMARY KEY:ID。
  • PROFESSION:ID(VARCHAR 20)、WORK(VARCHAR 30)、EMAIL(VARCHAR 30)、FOREIGN KEY:ID。

设置一个 Web Project

在 Rational Application Developer 中创建一个 Dynamic Web Project,请您执行下述操作:

  1. 从开始菜单中启动 Rational Application Developer,打开一个新的工作区。
  2. 在工作区中点击右侧的透视图图标,切换到 Web 透视图。
  3. 然后,在项目资源管理器中单击右键,并且选择 New > Dynamic Web Project,启动一个新的项目。
  4. 输入项目名称,点击 Finish。

于是,一个新的 Web 项目和一个相应的 EAR 项目就在项目资源管理器中被创建出来了。

图 1: 在 Rational Application Developer 中创建一个 Dynamic Web Project。
项目配置选项
  1. SdoDem 项目上,点击 Web contents
  2. 单击右键,创建一个名为 jsp 的新的文件夹。
  3. 然后右键单击 jsp 文件夹,并且选择 New > File > sdoDemo.jsp

您已经创建了一个空白的 JSP 页面。这个例子使用一个事先已经存在的模板。

至此,我们完成了 Web 项目的基本设置。现在您所需要做的就是创建一个数据库连接,并且您将准备好创建 SDO 来访问数据库。

在 WebSphere Application Server 上面设置 DataSource

这是一个关键的步骤,它将确保 SDO 服务能够顺利的工作。由于本文的重点是 JSP 技术中的 SDO 向导的细节,所以我们对这些步骤并不加以详细的说明。然而,设置数据资源中最重要的方面包括:

  • 确保数据资源的名字必须是 jdbc/[DATABASENAME] 的形式。在您的例子中,由于数据库被命名为 SDOJSP,所以 datasource 的 Java™ Naming and Directory Interface (JNDI)名字为 jdbc/SDOJSP。
  • 在控制台中,使用 XA JDBC 提供者来创建 datasource。
  • 在 Java™ 2 Platform Enterprise Edition (J2EE Platform) Connector Architecture 或者 J2C 中,输入数据库被使用的正确的管理员用户名和密码。

使用 SDO 向导从数据库中访问信息

至此,Web 页面已经准备好,您的数据库也已经被创建出来了。此时,您已经准备好添加访问数据库的信息了。您将首先添加一个表格来执行一个 INSERT (插入)数据库的操作,然后您将从数据库中获得一个记录,并且将其显示在页面上。最后,您将完成一个多个数据表的连接操作,并且将记录显示在页面上。

在数据库中插入一个记录

为了从 JSP 中创建数据库中的一个记录,您需要建立一个数据库连接。您还可以通过复用这个连接来创建、读取、更新或者删除其他的记录。

  1. 打开 JSP 页面并且点击 Design 标签。右侧就是 JSP 和 HTML 的 Palette (调色板),如图2中所示。
  2. 从调色板中点击 Data。这里显示了您的数据处理选择。
图 2. JSP Tag Palette 的细节。
JSP Tag Palette 的细节

您可以使用第一个选项 JavaBean 插入一个 JavaBean,这是一种在 JSP 页面中的数据库交互作用的传统方法。另外两种新的方法是和 SDO 相关的调色板选项 Relational RecordRelation Record List。您将使用这些命令来创建、读取、更新或者删除数据库中的记录。

  1. Relational Record 拖动到 JSP 页面中。
  2. 此时出现一个 Add Relation Record 向导,您可以在其中指定一个名称,如图3中所示。在 Name 文本域中输入 e_name
  3. 选择 Creating a new record,这是因为您要向数据库中插入一个记录。点击 Next
图 3. 为记录输入一个参考名称。
为记录输入一个参考名称
  1. 下一个向导显示了一个新连接的选择。点击 Next
  2. JDBC Connection Parameters 页面如图4中所示。输入如下信息:
    1. JDBC Driver: IBM DB2 Universal
    2. Database: SDOJSP
    3. Host: localhost
    4. 如果需要的话,输入 User IDPassword
  3. 点击 Test Connection 确保连接工作正常。
图 4. 指定 New JDBC Connection 向导中的选项。
指定 New JDBC Connection 向导中的选项
  1. 点击 Next
  2. 点击 Finish。数据库及其所有图表都将被显示在 Record Properties 页面上,如图5中所示。
图 5. 选择一个数据表。
选择一个数据表
  1. 展开相关的图表,并且点击您所要更新的记录所在的数据表。在我们的例子中图表和数据表分别是 GTANDONPERSONAL
  2. 点击 Next。由于您对数据表中的所有列进行更新,所以保持所有列都处于被选中状态,如图6中所示。
  3. 点击 Finish
图 6. 选择在您的结果中所要包括的列。
all columns in Personal table selected

在插入之后,JSP 页面应当如图7中所示。

图 7. 在设计模式中回顾 JSP。
在设计模式中回顾 JSP

现在,您可以通过 JSP 页面上的表格,向数据库中实际插入一个记录,从而在服务器上对其进行测试。

  1. 右键单击 SdoDem.jsp,并且选择 Run As > Run on Server
  2. 在网络浏览器中选择一个适当的服务器,显示最终的 JSP 页面,如图8中所示。
  3. 输入有效的值,并且点击 Submit。在我们的例子中,提交页面后自动转到另一个显示数据表更新结果的 JSP 页面上。

下一小节将讲述您如何在一个 JSP 页面上显示被更新的数据。

图 8. 回顾提交的 JSP 页面。
回顾提交的 JSP 页面

使用现已存在的连接从数据库中获得一个记录

为了把数据库中的 PERSONAL 数据表中的雇员个人信息显示出来,您需要创建一个被称作 DisplayPersonal.jsp 的新页面,我们使用同一个页面模板。

  1. 从右侧的调色板中点击 Data,并且将 Relational Record 拖放到页面上。此时,您已经准备好使用 JDBC 显示参数创建一个到数据库的连接,所以 Relational Record 页面被显示出来。
  2. 输入 e_personal 作为 Name,人后选择 Displaying an existing record (read-only),如图9中所示。
  3. 点击 Next
图 9. 为在 JSP 页面上显示数据配置 Relational Record。
面板
  1. Record Properties 页面上,展开 GTANDON 图表并且选中 PERSONAL 数据表。
  2. 点击 Next
  3. Add Relational Record 页面上,确保所有的列都被选中,这是由于您希望将它们全部显示出来。
  4. 点击 Next
  5. 点击 Finish。其结果应当如图10中所示。
图 10. 在设计模式中,回顾为显示从数据库中获得的数据而配置的 JSP 页面。
设计视图显示代码中的变量
  1. 如果您点击 Source 标签,那么用于 JSP 和 SDO 入口的代码段就已经被 Rational Application Developer 添加进来。和 SDO 相关的部分以加粗字体的形式被显示在 Listing 1 的 <meta name="GENERATOR"> 和 <tr-class="content area"> 中。
列表 1. 由 Rational Application Developer 所生成的源代码。

<%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@taglib uri="http://www.ibm.com/websphere/sdo/core" prefix="wdo"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%-- tpl:insert page="/theme/A_blue.htpl" --%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <meta http-equiv="Content-Style-Type" content="text/css"> <link rel="stylesheet" href="/SdoDemo/theme/blue.css" type="text/css"> <%-- tpl:put name="headarea" --%> <title>sdoDemo</title> <meta name="GENERATOR" content="Rational Application Developer"> <%-- wdo:useDataObject id="e_personal" mediator="e_personalMediator" input="/WEB-INF/wdo/e_personal.xml" datatype="RDB" action="FILL" --%><%-- /wdo:useDataObject --%> <wdo:useMediator id="e_personalMediator" input="/WEB-INF/wdo/e_personal.xml" connection="SDOJSP" datatype="RDB"> <wdo:setFilterParameter id="e_personalMediator" name="paramID" value="${param.ID}" /> </wdo:useMediator> <wdo:find mediator="${e_personalMediator}" id="e_personal"></wdo:find> <%-- wdo:useDataList id="disPerson" mediator="disPersonMediator" input="/WEB-INF/wdo/disPerson.xml" datatype="RDB" action="FILL" --%> <%-- /wdo:useDataList --%> <wdo:useMediator id="disPersonMediator" input="/WEB-INF/wdo/disPerson.xml" connection="SDOJSP" datatype="RDB"></wdo:useMediator> <wdo:execute mediator="${disPersonMediator}" id="disPerson" /> <%-- /tpl:put --%> </head> <body> <table width="760" cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="top"> <table class="header" cellspacing="0" cellpadding="0" border="0" width="100%"> <tbody> <tr> <td width="150"><img border="0" width="150" height="55" alt="Company's LOGO" src="/SdoDemo/theme/logo_blue.gif"></td> <td></td> </tr> </tbody> </table> </td> </tr> <tr> <td valign="top" class="nav_head" height="20"></td> </tr> <tr class="content-area"> <td valign="top" height="350"><%-- tpl:put name="bodyarea" --%> <br> <b> <font size="+2"><br>EMPLOYEE PROFESSIONAL DATABASE </font><br></b> <br>Employee Information:<br> <br><table cellspacinjg="0" cellpadding="10" border="1" width="100%"> <thead> <tr> <th bgcolor="#d0e8f0" align="left">Id</th> <th bgcolor="#d0e8f0" align="left">Firstname</th> <th bgcolor="#d0e8f0" align="left">Lastname</th> </tr> </thead> <tbody> <c:forEach var="varDisPerson" items="${disPerson}"> <tr><td bgcolor="#d0e8f0"><c:out value="${varDisPerson.ID}" /></td> <td bgcolor="#d0e8f0"><c:out value="${varDisPerson.FIRSTNAME}" /></td> <td bgcolor="#d0e8f0"><c:out value="${varDisPerson.LASTNAME}" /></td> </tr> </c:forEach> </tbody> </table><form action="sdoDemo.jsp" method="post"></form><br> <%-- /tpl:put --%></td> </tr> <tr> <td valign="top" height="20" class="footer"></td> </tr> </tbody> </table> </body> </html> <%-- /tpl:insert --%>

请注意 <c:out value="${varDisPerson.LASTNAME}" /> 代码是实际显示数据库中的一个记录。在位于 Web 项目的 WEB-INF 文件夹中的 wdo 目录中,创建了一个名为 e_personal.xml 的查询 XML 文件。当 JSP 页面运行时,<wdo> 标签执行数据库的请求,并且数据被显示在 HTML 中。wdo 文件以 XML 格式创建了实际的查询。

SDO 代码将这个 XML 翻译为数据库能够理解的格式,并且通过使用由 Web 项目所提供的连接参数,我们获得了在 JSP 页面上将其显示所必需的信息。由 SDO 代码所创建的 wdo/e_personal.xml 文件被显示在列表2中。

列表 2. 查询 XML 文件代码。

<?xml version="1.0" encoding="UTF-8"?> <com.ibm.websphere.sdo.mediator.jdbc.metadata:Metadata xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:com.ibm.websphere.sdo.mediator.jdbc.metadata= "http:///com/ibm/websphere/sdo/mediator/jdbc/metadata.ecore" rootTable="//@tables.0"> <tables schemaName="GTANDON" name="PERSONAL"> <primaryKey columns="//@tables.0/@columns.0"/> <columns name="ID"/> <columns name="FIRSTNAME" type="4"/> <columns name="LASTNAME" type="4" nullable="true"/> </tables> </com.ibm.websphere.sdo.mediator.jdbc.metadata:Metadata>

现在,您可以使用上一小节中的方法在服务器上对其进行测试。数据库中的所有记录都在运行时被获得,并且被显示在 JSP 页面上,而无需您使用任何程式化范例(诸如 JDBC 或者 JavaBeans)。结果应当如图11中所示。

图 11. 回顾 JSP 页面的最终提交输出结果。
回顾 JSP 页面的最终提交输出结果

使用一个现已存在的连接从多个数据表中获得记录

在这一小节中,您将使用 SDO 向导显示多个数据表中的记录(换句话说,执行一个传统的 JOIN)。首先,使用相同的页面模板创建一个名为 DisplayProfessional.jsp 的新页面。

  1. 从右侧的调色板中点击 Data,并且将 Relational Record List 拖放到 JSP 页面上。您已经使用 JDBC 显示参数创建了一个到数据库的连接,所以 Relational Record List 页面被显示出来。
  2. 输入 e_professional 作为 Name,如图12中所示,然后点击 Next
图 12. 为记录列表输入一个参考名称。
为记录列表输入一个参考名称
  1. 在 Record List Properties 页面上,点击 GTANDON 图表并且选择 PERSONAL 数据表。您将以 PERSONAL 数据表开始,并且使用一个 JOIN 操作从 PROFESSION 数据表中获得职业信息。
  2. 点击 Next
  3. 在 Add Relational Record 向导中,点击 Advanced tasks 下面的 Add another database table through a relationship 链接,如图13中所示。
图 13. 选择在您的结果中所要包括的列。
选择在您的结果中所要包括的列
  1. Choose Your Relationship 页面上,选择 ID <-->ID,如图14中所示,这是由于您将使用 IDs 将各个数据表连接在一起。
  2. 点击 Next
图 14. 选择一个现已存在的关系或者创建一个新的关系。
选择一个现已存在的关系或者创建一个新的关系
  1. 在 Edit Your Relationship 页面上,选择 1->*PRIMARY KEY -> FOREIGN KEY 作为 Multiplicity,如图15中所示。其他的选项提供如下:
    • PRIMARY KEY->FOREIGN KEY
    • FOREIGN KEY->PRIMARY KEY
    • PRIMARY KEY->PRIMARY KEY
  2. 点击 Finish 退出连接向导,回到 Relational Record 页面。
  3. 点击 Next
图 15. 配置 JOIN 关系。
配置 JOIN 关系
  1. 现在,Datagrid 显示了您所连接的所有数据表中的列,如图16中所示。选择所有必要的列。
  2. 在我们的例子中,保持默认值不变,并且点击 Finish
图 16. 指定所要显示的列以及如何显示它们。
指定所要显示的列以及如何显示它们
  1. 最终的数据表如图17中所示,由多个数据表连接为单一的数据表。
图 17. 在设计模式中,回顾您通过连接两个数据表而创建的最终页面。
在设计模式中,回顾您通过连接两个数据表而创建的最终页面

您已经完成了本例的主要内容。这项技术十分令人兴奋,这是因为它:

  • 简单易用;
  • 不需要任何专门的数据库、SOL 或者 JDBC 的知识,就可以执行很复杂的查询连接;
  • 支持动态查询、分类和更新。

分类和筛选

您还可以使用向导对结果进行分类和筛选。本文将通过从上一小节中创建的 e_professional 相关记录,对这一技术进行演示。

  1. 使用屏幕左下方的 Page Data 视图,打开 Relational Records 并且右键单击 e_professional(RECORD)
  2. 点击 Configure 代开 Configure Relational Record 向导。
  3. 点击两次 Next
  4. 您将到达 Add Relational Record 页面。在这一页上,右侧的 Tasks 菜单为修改查询结果提供了不同的选项。
  5. 点击 Filter results
图 18. 从包括 Modify primary key、Order results 和 Filter results 的任务选项中进行选择。
任务周围的红色框
  1. 到达 Filters 页面,它显示了所有的数据表。您可以选择任何一个数据表,并且点击“加号”来创建一个过滤条件。

  2. 在 Conditions 页面上,您可以选择一个左侧的列和右侧的表达式值。

  3. Value 文本框可以被设置为 Constant,如图19中所示,也可以被设置为 Variable (例如 $value)。

图 19. 设置一个条件。
设置一个条件
  1. 在过滤器页面上,您所创建的条件将被显示出来,如图20中所示。您可以进一步添加更多的条件,或者使用 OR 而非 AND 创建一个不同的条件。
图 20. 选择过滤器的参数。
选择过滤器的参数

超出向导的扩展

这一技术对于进一步的用户接口扩展来说是十分灵活的。本文仅仅是大致描述了您使用向导所完成的非常基本的交互作用。在这项技术中,我们可以通过定制 XML 代码,以许多种方式对这项技术加以扩展。

在列表中所显示的例子中,<c: if > 被用作执行一个 if 语句,然后将从数据库中接收到的结果作为参数传递给 Onclick Java™Script 构造,将三项技术合并到处理过程之中。

列表 3. 修改 XML 代码。
<c:if test="${uid == us_id}">
<c:forEach var="varProjdet" items="${projdet}">
<c:url var="project_detail" value="/AddTask">
<c:param name="projectName" value="${varProjdet.NAME}" />
<c:param name="projectId" value="${varProjdet.ID}" />
<c:param name="projectPhase" value="${varProjdet.STATUS}" />
</c:url>
<span class="button-blue">
<input type="submit" 
onClick="parent.location='<c:out value="${project_detail}"/>'" value="Add Task" />
</span>
</c:forEach>
</c:if>

您学到了什么

Service Data Objects 被创建出来用于为数据开发提供一个统一的架构。如果您使用这一架构以及 Rational Application Developer 中现已存在的向导,您就有可能有效并且轻易地在 JSP 网页中创建复杂的查询。本文已经开发了一些普通的数据库功能,例如:更新一个数据库、显示查询结果、连接两个数据表、以及使用不同的过滤条件筛选结果等。


感谢

感谢 Tom Hill 和 Kevin Brown 对本文所做出的颇有价值的注释和贡献。

参考资料

学习

获得产品和技术

条评论

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=Rational
ArticleID=335853
ArticleTitle=利用 Rational Application Developer 7.0 及其更新版本在 JavaServer Pages 中使用 Service Data Objects
publish-date=09042008