科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件在Web服务中使用SDO2.1的动态数据API

在Web服务中使用SDO2.1的动态数据API

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文将说明构建使用动态对象的 Web 服务应用程序所需的步骤,可以下载一个可部署应用程序,以帮助说明如何在 Web 环境中使用动态对象。

作者:Fuhwei Lwo 来源:论坛整理 2007年11月26日

关键字: 软件

  • 评论
  • 分享微博
  • 分享邮件
SDO 的动态数据 API

  动态 API 场景并不要求为数据模型中的对象生成类型接口、工厂类或实现类。相反,可以选择使用规范中定义的标准 SDO API 来创建数据模型的实例,以将数据传输到其他应用程序。为此,必须首先注册您的数据模型。直接将 XSD 文档传入 XSDHelper.define() 方法。注册了数据模型后,就可以使用 DataFactory 类来创建数据模型的实例。此实例与静态数据 API 创建的实例的主要区别在于,该实例类型为 commonj.sdo.DataObject 而不是表示数据对象的类型接口。这意味着,用户可以仅使用 DataObject 接口中定义的方法类获取和设置数据对象的属性,而无需使用静态 API 场景中生成的 API。

  表 1 显示了如何使用静态和动态数据 API 设置和检索清单 1 中定义的 Person 类型的属性。

  表 1. 静态与动态 SDO 在检索和设置属性方面的区别

 Person 的属性  静态数据 API  动态数据 API
 firstName  Person.getFirstName() Person.setFirstName(String fname)  DataObject.getString(“firstName”) DataObject.setString(“firstName”, fname)
 Id  Person.getId() Person.setId(int id)  DataObject.getInt(“id”) DataObject.setInt(“id”, id);

  使用 SDO 的动态数据 API 的 Web 服务应用程序

  接下来,本文将说明如何实现使用 SDO 的动态数据 API 来传输数据的 Web 服务应用程序。对于此应用程序,创建向 Web 服务提供者发送请求的客户机,该 Web 服务提供者将随后使用 commonj.sdo.DataObject 格式的通用数据对象进行响应。客户机将随后记录数据对象中的数据,然后将此信息输出到用户。图 2 显示了此应用程序中的客户机和服务交互的简要视图。

  图 2. 使用动态数据 API 的 Web 服务应用程序

  使用动态数据 API 的 Web 服务应用程序

  Helloworld Web 服务——Web 服务提供者

  以下是使用服务组件体系结构(Service Component Architecture,SCA)术语的 Web 服务提供者的情况(即“此 SCA 组合的情况”)。在 Tuscany 中,此工作是使用清单 3 中所示的 default.scdl 文件完成的。此处的 default.scdl 文件描述使用哪个数据绑定技术来支持数据传输、提供哪个服务以及定义了哪个组件。有关 SCA 组合、服务和组件的定义的更多信息,请参考 SCA 规范(请参见参考资料)。

  在清单 3 中,以下代码行是 default.scdl 中与 SDO 相关的 XML 元素,作为 SCA 数据绑定技术使用:

<dbsdo:import.sdo  location="wsdl/helloworld.wsdl"/>

  此代码使 SCA 运行时在 SDO 运行时中注册 helloworld.wsdl 中描述的数据模型,以便稍后在服务实现中使用 SDO 的动态数据 API,而不用担心数据模型注册的事情。

  清单 3. default.scdl:描述 SCA 组合的文件

<?xml version="1.0" encoding="UTF-8"?>
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" 
  xmlns:wsdli="http://www.w3.org/2006/01/wsdl-instance"
      xmlns:dbsdo="http://incubator.apache.org/tuscany/xmlns/
        databinding/sdo/1.0-incubator-M2"
  name="helloworldDSDOservice">

   <dbsdo:import.sdo  location="wsdl/helloworld.wsdl"/>


    <service name="HelloWorldWebServiceDSDO">
        <interface.wsdl interface="http://helloworld#wsdl.interface(HelloWorld)"
        wsdli:wsdlLocation="http://helloworld wsdl/helloworld.wsdl" />
        <!--<interface.java interface="helloworld.HelloWorldService"/>-->
       
    <binding.ws endpoint="http://helloworld#wsdl.endpoint(HelloWorldService/
        HelloWorldSoapPort)"
        location="wsdl/helloworld.wsdl" uri="HWWSSDO"/>
         
        <reference>HelloWorldServiceDSDOComponent</reference>
    </service>

    <component name="HelloWorldServiceDSDOComponent">
        <implementation.java class="helloworld.HelloWorldImpl"/>
    </component>
</composite> 

  接下来定义 Web 服务提供者。通常,WSDL 文件用于定义所提供的服务、输入和输出消息,以及传递到这些消息中的数据所对应的类型。清单 4 提供了代表示例服务的简单 helloworld WSDL 文件。

  清单 4. helloworld.wsdl:描述服务的 WSDL 文件

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://helloworld" xmlns:tns="http://helloworld"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns:xsd=http://www.w3.org/2001/XMLSchema name="helloworld">

    <wsdl:types>        
          <schema elementFormDefault="qualified"
targetNamespace="http://helloworld"
xmlns="http://www.w3.org/2001/XMLSchema">

            <complexType name="Person">
                <sequence>
                    <element name="firstName" type="string"/>
                    <element name="lastName" type="string"/>
                    <element name="greeting" type="string"/>
                </sequence>
            </complexType>
           
            <element name="getGreetings">                
                 <complexType>                    
                      <sequence>                        
                           <element name="name"
type="xsd:string"/>                    
                                  </sequence>                
                            </complexType>            
                     </element>
                    
                     <element name="getGreetingsResponse">                
                           <complexType>                    
                                 <sequence>                        
                                       <element name="getGreetingsReturn"
type="xsd:anyType"/>                    
                                   </sequence>                
                              </complexType>            
                       </element>        
                  </schema>    
             </wsdl:types>
            
             <wsdl:message name="getGreetingsRequest">        
                   <wsdl:part element="tns:getGreetings" name="parameters"/>    
             </wsdl:message>
            
             <wsdl:message name="getGreetingsResponse">        
                  <wsdl:part element="tns:getGreetingsResponse"
name="parameters"/>    
             </wsdl:message>


               <wsdl:portType name="HelloWorldService">        
                  <wsdl:operation name="getGreetings">            
                       <wsdl:input message="tns:getGreetingsRequest"
name="getGreetingsRequest"/>
                       <wsdl:output message="tns:getGreetingsResponse"
name="getGreetingsResponse"/>
                   </wsdl:operation>
              </wsdl:portType>
             

              <wsdl:binding name="HelloWorldSoapBinding"
type="tns:HelloWorldService">
                <wsdlsoap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>        
                <wsdl:operation name="getGreetings">            
                     <wsdlsoap:operation soapAction=""/>            
                     <wsdl:input name="getGreetingsRequest">
                           <wsdlsoap:body use="literal"/>            
                     </wsdl:input>            
                     <wsdl:output name="getGreetingsResponse">
                           <wsdlsoap:body use="literal"/>            
                     </wsdl:output>       
                 </wsdl:operation>    
              </wsdl:binding>
             
              <wsdl:service name="HelloWorldService">        
                 <wsdl:port binding="tns:HelloWorldSoapBinding"
name="HelloWorldSoapPort">            
                           <wsdlsoap:address location=""/>        
                  </wsdl:port>    
               </wsdl:service>
              
</wsdl:definitions>  

  在清单 4 中,使用 WSDL 1.1 portType 定义了名为 HelloWorldService 的服务接口。此服务接口包含一个名为 getGreetings 的操作。为了调用此操作,客户机将传递消息 getGreetingsRequest 并接收消息 getGreetingsResponse。消息 getGreetingsRequest 的类型定义为 xsd:string,而消息 getGreetingsResponse 的类型定义为 xsd:anyType。根据 SDO 2.1 规范中的规定,xsd:string 映射到 SDO String 类型,而 xsd:anyType 映射到 SDO DataObject 类型。表 2 表示 XSD 类型、SDO 类型和 Java 实例类之间的映射。

  表 2. XSD 类型、SDO 类型和 Java 实例类之间的映射

 XSD 类型  SDO 类型  Java 实例类
 xsd:string String  java.lang.String
 xsd:anyType  DataObject commonj.sdo.DataObject

  清单 5 中所示的 Java 接口描述服务所提供的操作以及输入和输出,这些内容与清单 4 中的 WSDL 文档描述的 定义对应。可以使用 Apache Tuscany 的服务组件体系结构实现提供的工具由 Apache Axis 2.0 或手动生成此 Java 接口。

  清单 5. helloworld.wsdl——HelloWorldService.java:描述服务的 Java 接口

package helloworld;

@Service
@Remotable
@DataType(name = "commonj.sdo.DataObject")
public interface HelloWorldService {
    public commonj.sdo.DataObject getGreetings(
    java.lang.String param0) throws java.rmi.RemoteException;

  清单 5 定义了名为 getGreetings 的单个远程服务操作,该操作接受字符串作为输入,并向客户机返回任何类型的 SDO。@DataType 是一个 Annotation,用于描述 Apache Tuscany 的 Java 方法或属性的输入和输出参数的数据绑定类型。

  现在创建 Java 接口的实现,如清单 6 中所示。

  清单 6. HelloWorldImpl.java:服务的 Java 实现

package helloworld;

import java.rmi.RemoteException;

import org.osoa.sca.annotations.Service;

import commonj.sdo.DataObject;
import commonj.sdo.helper.DataFactory;

/**
* This class implements the HelloWorld service.
*/
@Service(HelloWorldService.class)
public class HelloWorldImpl implements HelloWorldService {

    DataFactory dataFactory = DataFactory.INSTANCE;

    public commonj.sdo.DataObject getGreetings(String name) throws RemoteException {
        DataObject person = dataFactory.create("http://helloworld", "Person");
        String[] names = name.split(" ");

        person.setString("firstName", names[0]);
        person.setString("lastName", names[1]);
        person.setString("greeting", "Hello");

        return person;
    }

  清单 6 中的代码显示了 HelloWorldService 接口的实现,可允许服务使用者使用个人的全名调用 getGreetings 操作或方法。该代码预期接受包含该人的问候消息的 SDO。

  在此 getGreetings(String) 方法中,将使用 DataFactory.create 方法并传入命名空间(在 WSDL 中定义)及类型的名称(在本例中为 Person)来创建新 SDO。这将创建 Person 类型的 SDO。然后使用 commonj.sdo.DataObject 提供的 API 来设置 Person 类型的属性。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章