JAX-RPC 与 JAX-WS 的比较,第 4 部分:动态调用接口
2009-11-03 00:00:00 来源:WEB开发网下面让我们了解一下这些抽象步骤的细节:
定义服务。通过使用 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();
}
}
}
更多精彩
赞助商链接