设计移动Web服务需要考虑的三个设计层次

来源: 作者: 2007-12-14 出处:pcdog.com

.net  j2me  java  linux  soa  
上一页 1 2 3 4 5 6 下一页 

    如果一个方法返回如 清单 1 中定义的 Task 的数组,则该方法的源代码包含在下面的清单中,方法 getTasks() 返回一个由五个 Task 对象组成的数组,如清单 2 所示。

清单 2. 返回自定义数据类型的数组的方法


    public Task[] getTasks(String name){
  Task[] tasks = new Task[5];
  for(int i=0; i<5; i++){
   tasks[i] = new Task(i, name);
  }
  return tasks;
 }
      


     当使用 getTasks()(如清单 3 所示)所属的 JavaBean 组件公开 Web 服务时,Task 类映射到其中包含 Task 类的名称空间的 tn2:Task。

清单 3. WSDL 定义中的 XML 数据类型

<complexType name="Task">
    <sequence
     <element name="ownerName" nillable="true" type="xsd:string"/>
     <element name="taskID" type="xsd:int"/>
    </sequence>
</complexType>
      


     同时,数据类型 Task[] 映射到 ArrayOf_tn2_TaskArrayOf_tn2_Task 的 XML 描述如清单 4 所示:

清单 4. ArrayOf_tn2_Task 的 XML 描述

<complexType name="ArrayOf_tns2_Task">
    <sequence>
     <element maxOccurs="unbounded" minOccurs="0" name="Task" 
       nillable="true" type="tns2:Task"/>
    </sequence>
   </complexType>
      


     如清单 4 所示,为单个自定义复杂类型数组生成的 XML 描述很长。相反,Java 语言中的单个 String 类型映射到 xsd:string,而没有生成 complexType 元素;诸如 boolean、int 和 byte 这样的基元类型分别映射到 xsd:boolean、xsd:int 和 xsd:byte。

     您可能已经注意到 XML 元素的嵌套(避免嵌套太深)和粒度考虑(使用粗粒度)之间的冲突。在实际运用中,嵌套和粒度之间应该有一个平衡。如果您更关注应用程序的性能,则应该仔细地权衡这两个考虑事项,以获得一个更好的解决方案

移动 Web 服务的设计考虑事项

    我已经讨论了设计 Web 服务的指导原则,现在我将把重点放在移动 Web 服务的考虑事项上。在大多数情况下,当将 JAX-RPC 值类型用于移动 Web 服务时需要考虑一些事情。JAX-RPC 值类型(遵循 JSR-101)是 Java 类,其值可以在服务客户端和服务端点之间移动。为了获得一致的值类型,必须遵循一系列规则。我只列出其中的几条,与本文关系最大的规则是:

您必须具有公共缺省构造器

    在反序列化的过程中,SOAP 运行时环境使用缺省构造器来构造对象。如果您试图在没有公共缺省构造器的情况下编写值类型(也称为数据传输对象),在当 JAX-RPC 运行时尝试序列化和反序列化数据对象时可能会遇到错误。对于像 IBM Rational® Application Developer (RAD) 6.0 这样的 IDE,将不为该数据类型生成序列化和反序列化 Helper 类(由 RAD 通过前缀 _Helper_Ser_Deser 生成),所以在调用与自定义数据类型相关的方法时会出现序列化错误。不带参数的构造器确保可以根据序列化状态远程构造对象。

您必须具有用于网络传输字段的 setter 和 getter 方法

首先,看一看清单 5 中的类 FailTask 的源代码:

清单 5. FailTask 类的定义

public class FailTask {
    /**
     * The owner of the task
     */
    private int ownerid;
    /**
     * The name of the task
     */
    private String name;
    /**
     * Default public non-argument constructor 
     *
     */
    public FailTask(){
     
    }
    /**
     * Constructor of FailTask class
     * @param ownerid Owner of the task
     * @param name Name of the task
     */
    public FailTask(int ownerid, String name){
     this.ownerid = ownerid;
     this.name = name;
    }
    /**
     * Getter method
     * @return the ownerid of the task
     */
    public int getOwnerid(){
     return ownerid;
    }
    /**
     * Setter method
     * @param ownerid the ownerid to be set
     */
    public void setOwnerid(int ownerid){
     this.ownerid = ownerid;
    }
  }
      


 



上一页 1 2 3 4 5 6 下一页 
上一篇:怎么样配置Weblogic的数据源
下一篇:J2ME网络编程以及网络游戏的实现