这不仅从移动 Web 服务的角度来看是适用的,而且从 Web 服务设计和(更高的层次)面向对象的软件设计来看也是适用的。正如您所知道的,接口是客户端和服务提供程序之间的契约,而且保持稳定非常重要(因为正如您所知道的,实现容易改变)。
定义功能接口非常直接和直观——只需考虑:
- 您的目标
- 您需要获取什么信息
- 您需要将何种结果返回到客户端
然后,您应该将该接口的相关要点写下来,并在这些要点的指导下完成所有实现细节。
这是一条简单的设计指导原则。了解您的目标非常重要,目标可以驱动您编写测试用例,并且指导您编写功能实现,这也是为什么测试驱动开发 (TDD) 广泛地应用于各种开发技术的原因。
目前,JAX-RPC 支持三种操作模式:
- RPC/encoded。其优点在于简单,接收方可以轻松地将消息发送到操作的实现。其缺点在于类型编码信息的开销较大,这会降低吞吐量性能。
- RPC/literal。其优点与 RPC/encoded 相同,而且 遵循 WS-I 组织制定的规范。
- 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 作为编码样式,则您是最安全的。
在使用 Java 编程语言公开服务时,需要考虑两种类型的服务提供程序:
- 从 JavaBean 组件生成 Web 服务
- 使用无状态会话 EJB 组件
虽然在某些情况下,EJB 组件非常有用,但是 JavaBeans 组件常常是更好的选择,特别是在开发移动 Web 服务时。实现使用 JavaBean 组件生成的服务提供程序比较简单和容易,而且与相应的会话 EJB 组件相比,JavaBean 组件更稳定。但是,如果您需要从使用 EJB 组件开发的现有 J2EE 应用程序公开 Web 服务,则请使用 EJB 组件。
如果数组的数组、复杂类型的数组或包含另一个自定义复杂类型的复杂类型等嵌套太深,则将大大影响 Web 服务的性能。清单 1 显示一个 XML 描述示例——一个自定义数据类型 Task
类的数组:
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;
}
}
|
[2]
【责编:Peng】
--------------------next---------------------
阅读(109) | 评论(0) | 转发(0) |