科技行者

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

知识库

知识库 安全导航

至顶网软件频道设计移动 Web 服务

设计移动 Web 服务

  • 扫一扫
    分享文章到微信

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

从何时选择移动 Web 服务到总体设计指导原则再到用于移动 Web 服务的值类型,本文提出了在设计用于移动设备的 Web 服务时需要考虑的许多设计事项。文中还介绍了许多设计移动 Web 服务方面的最佳实践。

作者:中国IT实验室 来源:中国IT实验室 2007年9月22日

关键字:

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

在本页阅读全文(共4页)

    使用 Document/literal 作为编码样式

    目前,JAX-RPC 支持三种操作模式:

    1.RPC/encoded.其优点在于简单,接收方可以轻松地将消息发送到操作的实现。其缺点在于类型编码信息的开销较大,这会降低吞吐量性能。

    2.RPC/literal.其优点与 RPC/encoded 相同,而且 遵循 WS-I 组织制定的规范(请参阅参考资料)。

    3.Document/literal.其优点在于没有类型编码信息,任何 XML 验证器都可以验证消息。其缺点在于 SOAP 消息中缺少操作名,所以发送消息很难甚至不可能。

    在一些资料中,您还可能发现名为 Document/encoded(使用这种模式的人不多)和 Document/literal wrapped(由 Microsoft 定义,但是没有相关规范,其缺点在于比其他模式复杂)的模式。对这些操作模式的详细解释可以在参考资料中的“Which style of WSDL should I use?”内找到。

    在这些模式中,WS-I 标准仅支持 RPC/literal 和 Document/literal.对于移动 Web 服务,JAX-RPC 实现必须使用 Document/literal 将基于 Web 服务描述语言 (WSDL) 的服务描述映射到相应的 Java 表示形式。因此,如果您只使用 Document/literal 作为编码样式,则您是最安全的。

    优先选择 JavaBeanser 组件而不是 EJB 组件作为服务提供程序

    在使用 Java 编程语言公开服务时,需要考虑两种类型的服务提供程序:

    1.从 JavaBean 组件生成 Web 服务

    2.使用无状态会话 EJB 组件

   虽然在某些情况下,EJB 组件非常有用,但是 JavaBeans 组件常常是更好的选择,特别是在开发移动 Web 服务时。实现使用 JavaBean 组件生成的服务提供程序比较简单和容易,而且与相应的会话 EJB 组件相比,JavaBean 组件更稳定。但是,如果您需要从使用 EJB 组件开发的现有 J2EE 应用程序公开 Web 服务,则请使用 EJB 组件。

    避免 XML 元素嵌套太深

    如果数组的数组、复杂类型的数组或包含另一个自定义复杂类型的复杂类型等嵌套太深,则将大大影响 Web 服务的性能。清单 1 显示一个 XML 描述示例――一个自定义数据类型 Task 类的数组:

    清单 1. 自定义数据类型


import java.io.Serializable;

public class Task implements Serializable {
    /**
     * The id of the task
     */
    private int taskID = 0;

    /**
     * Owner name of the task
     */
    private String ownerName;

    /**
     * public default non-argument constructor
     *  
     */
    public Task() {

    }

    /**
     * Constructor of the Task class
     * 
     * @param taskID
     *            id of the task
     * @param ownerName
     *            owner name of the task
     */
    public Task(int taskID, String ownerName) {
        this.taskID = taskID;
        this.ownerName = ownerName;
    }

    /**
     * @return Returns the ownerName.
     */
    public String getOwnerName() {
        return ownerName;
    }

    /**
     * @param ownerName
     *            The ownerName to set.
     */
    public void setOwnerName(String ownerName) {
        this.ownerName = ownerName;
    }

    /**
     * @return Returns the taskID.
     */
    public int getTaskID() {
        return taskID;
    }

    /**
     * @param taskID The taskID to set.
     */
    public void setTaskID(int taskID) {
        this.taskID = taskID;
    }
}

    如果一个方法返回如 清单 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_Task;ArrayOf_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 元素的嵌套(避免嵌套太深)和粒度考虑(使用粗粒度)之间的冲突。在实际运用中,嵌套和粒度之间应该有一个平衡。如果您更关注应用程序的性能,则应该仔细地权衡这两个考虑事项,以获得一个更好的解决方案。

 

查看本文来源

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

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

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