WEB开发网
开发学院软件开发Java JAX-RPC 与 JAX-WS 的比较,第 3 部分:服务端点接... 阅读

JAX-RPC 与 JAX-WS 的比较,第 3 部分:服务端点接口

 2009-11-03 00:00:00 来源:WEB开发网   
核心提示: 在 JAX-RPC 中,没有用于 WSDL 操作的异步映射,JAX-RPC 与 JAX-WS 的比较,第 3 部分:服务端点接口(8),所以这里没有办法进行比较,然而,以及它不需要提前生成 SEI,另一方面,重要的是,异步映射仅适用于客户端

在 JAX-RPC 中,没有用于 WSDL 操作的异步映射,所以这里没有办法进行比较。然而,重要的是,异步映射仅适用于客户端。对于服务端点,不存在类似的异步映射,只能用于客户端。

比较 IN/OUT 参数

JAX-RPC 和 JAX-WS 都支持称为 IN/OUT 参数的参数。在清单 14 中,您可以看到在清单 1 的 WSDL 中添加了一个 IN/OUT 参数。请注意,不管对于输入还是输出,都出现了名为“inout”的参数。在这个场景中,JAX-RPC 和 JAX-WS 将该参数映射为一个 Holder 参数,但是对于不同的映射,其效果是不同的。


清单 14. 带 IN/OUT 参数的 WSDL
<xsd:element name="hello"> 
 <xsd:complexType> 
  <xsd:sequence> 
   <xsd:element name="name" nillable="true" type="xsd:string" /> 
   <xsd:element name="inout" nillable="true" type="xsd:string" /> 
  </xsd:sequence> 
 </xsd:complexType> 
</xsd:element> 
 
<xsd:element name="helloResponse"> 
 <xsd:complexType> 
  <xsd:sequence> 
   <xsd:element name="response" nillable="true" type="xsd:string" /> 
   <xsd:element name="inout" nillable="true" type="xsd:string" /> 
  </xsd:sequence> 
 </xsd:complexType> 
</xsd:element> 

清单 15 提供了 Holder 参数的 JAX-RPC 映射,而清单 16 提供了 JAX-WS 映射。


清单 15. 带 IN/OUT 参数的 JAX-RPC SEI
public interface HelloWorld extends java.rmi.Remote { 
  public java.lang.String hello( 
    java.lang.String name, 
    javax.xml.rpc.holders.StringHolder inout) throws java.rmi.RemoteException; 
}


清单 16. 带 IN/OUT 参数的 JAX-WS SEI
@WebService(name = "HelloWorld", targetNamespace = "urn:helloWorld/sample/ibm/com") 
public interface HelloWorld { 
 
  @WebMethod(action = "urn:helloWorld/sample/ibm/com/hello") 
  @RequestWrapper(localName = "hello", 
    targetNamespace = "urn:helloWorld/sample/ibm/com", 
    className = "helloworld.sample.ibm.com.Hello") 
  @ResponseWrapper(localName = "helloResponse", 
    targetNamespace = "urn:helloWorld/sample/ibm/com", 
    className = "helloworld.sample.ibm.com.HelloResponse") 
  public void hello( 
    @WebParam(name = "name", targetNamespace = "") 
    String name, 
    @WebParam(name = "inout", targetNamespace = "", mode = Mode.INOUT) 
    Holder<String> inout, 
    @WebParam(name = "response", targetNamespace = "", mode = Mode.OUT) 
    Holder<String> response); 
 
}

对于 JAX-RPC,规范中为各种已知的类型定义了一组类作为 Holder 类。这些类型包括 java.lang.String 和其他基本数据类型。对于用户定义的类型,JAX-RPC 需要生成能够处理用户定义类型的自定义的 Holder 类。另一方面,对于 JAX-WS,可以使用 Java 5 的泛型编程特性,提供适用于所有类型(包括用户定义类型)的单个类。

另一个有趣的内容是返回类型的区别。JAX-WS 并不像 JAX-RPC 那样保存返回类型,而是让方法的返回类型为 void,并使用 Holder 来获取返回值。根据 JAX-WS 中的规则,如果对于一个操作存在多个可以作为 OUT 参数的参数,那么返回类型必须为 void,并且将所有的 OUT 参数映射为 Holder 类型。

总结

上面的示例说明,尽管 JAX-RPC 和 JAX-WS 之间存在很多的区别,但是从 WSDL 到服务端点接口结构的映射是非常类似的。关键的区别包括:

包名不同。

JAX-RPC 需要 java.rmi.Remote 和 java.rmi.RemoteException,而 JAX-WS 不需要。

对 Holder 进行了不同的定义。

即使存在这些类似的地方,但是有一个主要的区别,使得 JAX-WS SEI 不同于 JAX-RPC。JSR-181 注释的使用,使得 JAX-WS SEI 可以以 Java 为中心或者以 WSDL 为中心来表示 Web 服务。可以包括大量的注释,以便将 Java 信息映射回 WSDL 构件。JAX-RPC SEI 无法通过任何形式来提供这类信息。还有一些特性是 JAX-WS 所特有的,即异步调用模型,以及它不需要提前生成 SEI。另一方面,JAX-RPC 也具备一些 JAX-WS 所没有的特性:它支持 RPC/encoded WSDL。

上一页  3 4 5 6 7 8 

Tags:JAX RPC JAX

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接