WEB开发网
开发学院软件开发Java JAX-RPC 与 JAX-WS 的比较,第 4 部分:动态调用接... 阅读

JAX-RPC 与 JAX-WS 的比较,第 4 部分:动态调用接口

 2009-11-03 00:00:00 来源:WEB开发网   
核心提示: 下面让我们了解一下这些抽象步骤的细节:定义服务,通过使用 WSDL 的服务完全限定名称构造 javax.xml.rpc.Service 对象,JAX-RPC 与 JAX-WS 的比较,第 4 部分:动态调用接口(3),从此服务创建动态调用对象,在 JAX-RPC 中,JAX-WS 的动态 Dis

下面让我们了解一下这些抽象步骤的细节:

定义服务。通过使用 WSDL 的服务完全限定名称构造 javax.xml.rpc.Service 对象。

从此服务创建动态调用对象。在 JAX-RPC 中,动态调用对象为 javax.xml.rpc.Call。

构建消息。在此步骤中,将使用关于操作的信息填充 Call 对象。此处需要提出的一点是:我们将调用 call.setProperty(Call.OPERATION_STYLE_PROPERTY, "wrapped");。wrapped 不是 JAX-RPC 为此属性定义的值。JAX-RPC 仅定义 rpc 和 document。不过,rpc 实际上表示 RPC/Encoded,而 document 实际表示 Document/Literal, Non-Wrapped。自从 JAX-RPC 推出后,Document/Literal Wrapped 模式就成为了行业标准,因此其 Call 对象并不能很好地对其进行处理。可以完成此工作,但效果不太好。对此属性进行扩展,以包括 wrapped 值,这是 IBM 填补此规范空白的方法,但并非标准扩展。

调用操作。此示例中的输入是一个简单的字符串,因此将使用字符串填充参数,并将其传递给调用函数。响应也是字符串,在此示例中将直接对其进行显示。

JAX-WS 的动态 Dispatch 接口

JAX-WS 的 DII 是 Dispatch 对象 (javax.xml.ws.Dispatch)。清单 3 中给出了通过 Dispatch 对象调用清单 1 的 HelloWorld 服务的完整客户机主类。可以在清单 3 的介绍中看到对抽象步骤进行了说明。


清单 3. JAX-WS 的 DII 客户机
        import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import javax.xml.namespace.QName; 
import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 
import javax.xml.ws.Dispatch; 
import javax.xml.ws.Service; 
import javax.xml.ws.soap.SOAPBinding; 
 
public class HelloWorldClient { 
 
  public static void main(String[] args) { 
    try {    
      // Define the service. 
      QName svcQname = new QName( 
          "urn:helloWorld/sample/ibm/com", 
          "HelloWorldService"); 
      QName portQName = new QName( 
          "urn:helloWorld/sample/ibm/com", 
          "port"); 
      Service svc = Service.create(svcQname); 
      svc.addPort( 
          portQName, 
          SOAPBinding.SOAP11HTTP_BINDING, 
          "http://localhost:9080/JAXBSampleWebService/HelloWorldService"); 
 
      // Create the dynamic invocation object from this service. 
      Dispatch<Source> dispatch = svc.createDispatch( 
          portQName, 
          Source.class, 
          Service.Mode.PAYLOAD); 
 
      // Build the message. 
      String content = 
          "<ns2:hello xmlns:ns2=\"urn:helloWorld/sample/ibm/com\">" + 
           "<name>Georgie</name>" + 
          "</ns2:hello>"; 
      ByteArrayInputStream bais = new ByteArrayInputStream(content.getBytes()); 
      Source input = new StreamSource(bais); 
 
      // Invoke the operation. 
      Source output = dispatch.invoke(input); 
 
      // Process the response. 
      StreamResult result = new StreamResult(new ByteArrayOutputStream()); 
      Transformer trans = TransformerFactory.newInstance().newTransformer(); 
      trans.transform(response, result); 
      ByteArrayOutputStream baos = (ByteArrayOutputStream) result.getOutputStream(); 
 
      // Write out the response content. 
      String responseContent = new String(baos.toByteArray()); 
      System.out.println(responseContent); 
    } 
    catch (Throwable t) { 
      t.printStackTrace(); 
    } 
  } 
}

上一页  1 2 3 4  下一页

Tags:JAX RPC JAX

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