在Web服务中使用SDO动态数据API_第1页
在Web服务中使用SDO动态数据API_第2页
在Web服务中使用SDO动态数据API_第3页
在Web服务中使用SDO动态数据API_第4页
在Web服务中使用SDO动态数据API_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ServiceDataObjects(SDO)2.0体系结构和API能跨不同数据源提供对数据的统一访问,打包在IBMWebSphere®ApplicationServerVersion6.1FeaturePackforSOA的Alpha版中。本文将说明构建使用动态对象的Web服务应用程序所需的步骤,可以下载一个可部署应用程序,以帮助说明如何在Web环境中使用动态对象。引言ServiceDataObjects(SDO)2.1是一种数据编程体系结构和API,可提供对异类数据源的统一数据访问。ApacheTuscany开源项目(请参见参考资料)正在开发2.1规范的实现,该实现也打包在IBMWebSphereApplicationServerVersion6.1FeaturePackforSOA的Beta1版中(请参见参考资料)。此规范对WebSphereApplicationServer6.1的功能进行了扩展。IBM提供了可供免费下载的WebSphereApplicationServer6.1试用版。服务数据对象通常用于将数据从一个应用程序传输到另一个应用程序。此用法模型可以方便地集成在Web服务环境中;在此环境中,客户机通常调用其他方提供的服务,需要将数据从Web服务提供者传输到使用者。SDO2.1规范描述了使用静态或动态数据API创建SDO的两种方法。在两种情况下,表示SDO的对象都必须实现commonj.sdo.DataObject接口,通过该接口可与规范定义的其他SDOAPI进行交互。本文将描述SDO的静态与动态数据API间的差异,列出构建使用动态数据API的Web服务应用程序所需的步骤,并提供了可安装在IBMWebSphereApplicationServerVersion6.1FeaturePackforSOA的Beta1版本上的可部署应用程序,用以说明如何在Web服务环境中使用SDO的动态数据API。图1说明了静态和动态数据API的生成位置以及如何使用其实例化服务数据对象,以供稍后用于操作底层的业务数据。图1.静态和动态数据API的用法SDO的静态数据API静态数据API是基于输入数据模型生成的。不同的数据模型将得到不同的静态数据API。也就是说,静态数据API只是数据模型的另一个表示形式。ApacheTuscany项目包括了一个数据API生成工具,该工具接受数据模型(通常用XML模式文档(XLMSchemaDocument,XSD)或Web服务描述语言(WebServiceDescripitonLanguage,WSDL))作为输入。该工具将随后以Java™类的形式输出静态数据API。所生成的Java类通常包括用于创建和操作数据模型的实例的工厂、接口和实现代码。为了说明如何使用静态数据API,让我们以使用XSD中定义的复杂类型表示的数据模型为例,如清单1中所示。清单1.表示类型Person的XSD代码片段<complexTypename="Person"><sequence><elementname=”firstName”type="string"/><elementname=”lastName”type="string"/><elementname=”greeting”type=”string'7><elementname=”id”type=”int'7></sequence></complexType>如果将此类型传入数据API生成工具,输出将为Person的类型接口(一个工厂接口,可利用其创建类型Person的实例)和实现Person的commonj.sdo.DataObject的实现类(用于获取和设置属性,如getFirstName()和setFirstName())。在这里,由于Person类实现commonj.sdo.DataObject,此生成类可以在规范定义的接受commonj.sdo.DataObject作为参数的所有SDOAPI中使用。清单2中所示的代码可帮助说明如何使用静态数据API。清单2.演示静态数据API的代码片段//RegisterandinitializetheSDOtypesdefinedinthegenerated//PersonFactoryclassSDOUtil.registerStaticTypes(PersonFactory.class);//CreateaninstanceofPersonusingtheFactoryclassPersonperson=PersonFactory.INSTANCE.createPerson();//SetpropertiesofthenewlycreatedPersonobjectperson.setFirstName("John");person.setLastName("Doe");//ExampleofhowtopassaPersonobjecttoXMLHelper.save()methodfor//voidXMLHelper.save(DataObjectdataObject,StringrootElementURI,//StringrootElementName,OutputStreamoutputStream)XMLHelper.INSTANCE.save((DataObject)person,"/person”,"person",System.out);SDO的动态数据API动态API场景并不要求为数据模型中的对象生成类型接口、工厂类或实现类。相反,可以选择使用规范中定义的标准SDOAPI来创建数据模型的实例,以将数据传输到其他应用程序。为此,必须首先注册您的数据模型。直接将XSD文档传入XSDHelper.define()方法。注册了数据模型后,就可以使用DataFactory类来创建数据模型的实例。此实例与静态数据API创建的实例的主要区别在于,该实例类型为commonj.sdo.DataObject而不是表示数据对象的类型接口。这意味着,用户可以仅使用DataObject接口中定义的方法类获取和设置数据对象的属性,而无需使用静态API场景中生成的API。表1显示了如何使用静态和动态数据API设置和检索清单1中定义的Person类型的属性。表1.静态与动态SDO在检索和设置属性方面的区别Person的属性静态数据API动态数据APIfirstNamePerson.getFirstName()Person.setFirstName(Stringfname)DataObject.getString("firstName”)DataObject.setString("firstName”,fname)IdPerson.getId()Person.setId(intid)DataObject.getInt(“id”)DataObject.setInt(“id”,id);使用SDO的动态数据API的Web服务应用程序接下来,本文将说明如何实现使用SDO的动态数据API来传输数据的Web服务应用程序。对于此应用程序,创建向Web服务提供者发送请求的客户机,该Web服务提供者将随后使用commonj.sdo.DataObject格式的通用数据对象进行响应。客户机将随后记录数据对象中的数据,然后将此信息输出到用户。图2显示了此应用程序中的客户机和服务交互的简要视图。图2.使用动态数据API的Web服务应用程序HelloworldWeb服务Web服务提供者以下是使用服务组件体系结构(ServiceComponentArchitecture,SCA)术语的Web服务提供者的情况(即“此SCA组合的情况”)。在Tuscany中,此工作是使用清单3中所示的default.scdl文件完成的。此处的default.scdl文件描述使用哪个数据绑定技术来支持数据传输、提供哪个服务以及定义了哪个组件。有关SCA组合、服务和组件的定义的更多信息,请参考SCA规范(请参见参考资料)。在清单3中,以下代码行是default.scdl中与SDO相关的XML元素,作为SCA数据绑定技术使用:<dbsdo:import.sdolocation=nwsdl/helloworld.wsdln/>此代码使SCA运行时在SDO运行时中注册helloworld.wsdl中描述的数据模型,以便稍后在服务实现中使用SDO的动态数据人?【,而不用担心数据模型注册的事情。清单3.default.scdl:描述SCA组合的文件<?xmlversion="1.0"encoding="UTF-8"?><compositexmlns="/xmlns/sca/1.0”xmlns:wsdli="/2006/01/wsdl-instance”xmlns:dbsdo="/tuscany/xmlns/databinding/sdo/1.0-incubator-M2”name="helloworldDSDOservice"><dbsdo:import.sdolocation="wsdl/helloworld.wsdl"/><servicename="HelloWorldWebServiceDSDO"><interface.wsdlinterface="http://helloworld#erface(HelloWorld)”wsdli:wsdlLocation="http://helloworldwsdl/helloworld.wsdl"/><!--<interface.javainterface="helloworld.HelloWorldService"/>--><binding.wsendpoint="http://helloworld#wsdl.endpoint(HelloWorldService/HelloWorldSoapPort)"location="wsdl/helloworld.wsdl"uri="HWWSSDO"/><reference>HelloWorldServiceDSDOComponent</reference></service><componentname="HelloWorldServiceDSDOComponent"><implementation.javaclass="helloworld.HelloWorldImpl"/></component></composite>接下来定义Web服务提供者。通常,WSDL文件用于定义所提供的服务、输入和输出消息,以及传递到这些消息中的数据所对应的类型。清单4提供了代表示例服务的简单helloworldWSDL文件。清单4.helloworld.wsdl:描述服务的WSDL文件<?xmlversion="1.0"encoding="UTF-8”?><wsdl:definitionstargetNamespace="http://helloworld”xmlns:tns="http://helloworld”xmlns:wsdl="/wsdl/"xmlns:wsdlsoap="/wsdl/soap/"xmlns:xsd=/2001/XMLSchemaname="helloworld"><wsdl:types><schemaelementFormDefault="qualified"targetNamespace="http://helloworld”xmlns="/2001/XMLSchema"><complexTypename="Person"><sequence><elementname="firstName"type="string"/><elementname="lastName"type="string"/><elementname="greeting"type="string"/></sequence></complexType><elementname="getGreetings"><complexType><sequence><elementname="name”type="xsd:string"/></sequence></complexType></element><elementname="getGreetingsResponse"><complexType><sequence><elementname="getGreetingsReturn”type="xsd:anyType"/></sequence></complexType></element></schema></wsdl:types><wsdl:messagename="getGreetingsRequest"><wsdl:partelement="tns:getGreetings"name="parameters"/></wsdl:message><wsdl:messagename="getGreetingsResponse"><wsdl:partelement="tns:getGreetingsResponse"name="parameters"/></wsdl:message><wsdl:portTypename="HelloWorldService"><wsdl:operationname="getGreetings"><wsdl:inputmessage="tns:getGreetingsRequest”name="getGreetingsRequest"/><wsdl:outputmessage="tns:getGreetingsResponse"name="getGreetingsResponse"/></wsdl:operation></wsdl:portType><wsdl:bindingname="HelloWorldSoapBinding”type="tns:HelloWorldService"><wsdlsoap:bindingstyle="document”transport="/soap/http"/><wsdl:operationname="getGreetings"><wsdlsoap:operationsoapAction=""/><wsdl:inputname="getGreetingsRequest"><wsdlsoap:bodyuse="literal"/></wsdl:input><wsdl:outputname="getGreetingsResponse"><wsdlsoap:bodyuse="literal"/></wsdl:output></wsdl:operation></wsdl:binding><wsdl:servicename="HelloWorldService"><wsdl:portbinding="tns:HelloWorldSoapBinding”name="HelloWorldSoapPort"><wsdlsoap:addresslocation=""/></wsdl:port></wsdl:service></wsdl:definitions>在清单4中,使用WSDL1.1portType<wsdl:portType>定义了名为HelloWorldService的服务接口。此服务接口包含一个名为getGreetings的操作。为了调用此操作,客户机将传递消息getGreetingsRequest并接收消息getGreetingsResponse。消息getGreetingsRequest的类型定义为xsd:string,而消息getGreetingsResponse的类型定义为xsd:anyType。根据SDO2.1规范中的规定,xsd:string映射到SDOString类型,而xsd:anyType映射到SDODataObject类型。表2表示XSD类型、SDO类型和Java实例类之间的映射。表2.XSD类型、SDO类型和Java实例类之间的映射XSD类型SDO类型Java实例类xsd:stringStringjava.lang.Stringxsd:anyTypeDataObjectcommonj.sdo.DataObject清单5中所示的Java接口描述服务所提供的操作以及输入和输出,这些内容与清单4中的WSDL文档描述的<wsdl:PortType:>定义对应。可以使用ApacheTuscany的服务组件体系结构实现提供的工具由ApacheAxis2.0或手动生成此Java接口。清单5.helloworld.wsdlHelloWorldService.java:描述服务的Java接口packagehelloworld;©Service@Remotable@DataType(name="commonj.sdo.DataObject")publicinterfaceHelloWorldService(publiccommonj.sdo.DataObjectgetGreetings(java.lang.Stringparam0)throwsjava.rmi.RemoteException;}清单5定义了名为getGreetings的单个远程服务操作,该操作接受字符串作为输入,并向客户机返回任何类型的SDO。@DataType是一个Annotation,用于描述ApacheTuscany的Java方法或属性的输入和输出参数的数据绑定类型。现在创建Java接口的实现,如清单6中所示。清单6.HelloWorldImpl.java:服务的Java实现packagehelloworld;importjava.rmi.RemoteException;importorg.osoa.sca.annotations.Service;importcommonj.sdo.DataObject;importcommonj.sdo.helper.DataFactory;/***ThisclassimplementstheHelloWorldservice.*/@Service(HelloWorldService.class)publicclassHelloWorldImplimplementsHelloWorldService(DataFactorydataFactory=DataFactory.INSTANCE;publiccommonj.sdo.DataObjectgetGreetings(Stringname)throwsRemoteException(DataObjectperson=dataFactory.create("http://helloworld","Person");String[]names=name.split("");person.setString("firstName",names[0]);person.setString("lastName",names[1]);person.setString("greeting","Hello");returnperson;}}清单6中的代码显示了HelloWorldService接口的实现,可允许服务使用者使用个人的全名调用getGreetings操作或方法。该代码预期接受包含该人的问候消息的SDO。在此getGreetings(String)方法中,将使用DataFactory.create方法并传入命名空间(在WSDL中定义)及类型的名称(在本例中为Person)来创建新SDO。这将创建Person类型的SDO。然后使用commonj.sdo.DataObject提供的API来设置Person类型的属性。HelloWorldWeb客户机——Web服务使用者在清单7中所示的Web服务应用程序的客户机部分中,HelloWorld.jsp首先使用HTML<Form>标记提示用户输入名称。输入了用户全名后,JSP会转向Web服务提供者(HelloWorldService)检索用户的问候信息并进行显示。为此,JSP首先通过调用CurrentCompositeContext.getContext()来获取SCA组合的上下文。接下来,JSP按照在default.scdl中定义的SCA组件名称查找HelloWorldService。然后,JSP调用前面部分中描述的getGreetings操作。将向JSP返回包含三个属性(firstName、lastName和greeting)的动态SDO,以向用户显示。清单7.HelloWorld.jsp<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><HTML><HEAD><%@pagelanguage="java"contentType="text/html;charset=ISO-8859-1"pageEncoding="ISO-8859-1"session="true"autoFlush="true”isThreadSafe="true"isErrorPage="false”import="java.lang.reflect.Method”import="java.io.PrintWriter”import="java.io.StringWriter”import="org.osoa.sca.CurrentCompositeContext”import="org.osoa.sca.CompositeContext”import="commonj.sdo.DataObject”import="commonj.sdo.helper.XSDHelper”import="helloworld.HelloWorldService”%><METAhttp-equiv="Content-Type"content="text/html;charset=ISO-8859-1"><METAname="GENERATOR"content="IBMSoftwareDevelopmentPlatform"><TITLE>HelloWorldDynamicSDOWebApplicationSample</TITLE><%Stringname=request.getParameter("name");%></HEAD><BODY><H2>HelloWorldDynamicSDOWebApplicationSample</H2><P> </P><FORMaction="HelloWorld.jsp"method="get">Nameplease:   <INPUTtype="text"id="i1"name="name"size="40"maxlength="220"value="<%=null==name?"JohnDoe":name%>"><BR><BR><INPUTtype="submit"name="submit"value="Submit"></FORM><BR><%try{if(null!=name){CompositeContextcompositeContext=CurrentCompositeContext.getContext();System.out.println("compositeContextis:"+compositeContext);//LocatetheHelloWorldserviceHelloWorldServicehelloworldService=(HelloWorldService)compositeContext.locateService(HelloWorldService.class,"HelloWorldServiceComponentDSDOClient");//InvoketheHelloWorldserviceDataObjectperson=<HR><P><%=person.get("greeting")%> <%=person.get("firstName")%> <%=person.get("lastName")%>!!!!<%}}catch(Exceptione){e.printStackTrace();StringWritersw=newStringWriter();PrintWriterpw=newPrintWriter(sw);e.printStackTrace(pw);pw.flush();%>Whoops!<BRclear="all"><PRE>Exception"<%=e.getClass().getName()%>"Exceptionmessage:"<%=e.getMessage()%>"<BRclear="all"><%=sw.toString()%></PRE><%}%></BODY></HTML>为了从动态SDO检索属性,必须按照与创建数据对象时设置属性类似的方法使用commonj.sdo.DataObject接口提供的API。运行示例应用程序的步骤随本文提供的hwddynamicsdo-service.jar和hwddynamicsdo-reference.war示例应用程序包含HelloWorldWeb服务及客户机应用程序的源代码和二进制文件,可以将其部署在IBMWebSphereApplicationServerVersion6.1FeaturePackforSOA的Beta1版上。示例应用程序提供了本文中的概念的工作示例,遵循了图2中所示的关系图。下面的步骤说明了如何安装和运行这些应用程序。在此示例中,WebSphere实例使用9080缺省端口作为HTTP端口。(请参见下面的说明。)要安装HelloWorldWeb服务应用程序,请执行以下步骤:安装WAS6.1。安装IBMWebSphereApplicationServerVersion6.1FeaturePackforSOA的Beta1版。将hwddynamics

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论