用java调用webservices的三种方式
- 格式:pdf
- 大小:113.07 KB
- 文档页数:8
public class TestHelloClient{ public static void main(String[] args) { try { String endpoint = "http://localhost:8080/axis/Hello
"; Service service = new Service(); Call call = null; call = (Call) service.createCall(); call.setTargetEndpointAddress(new
public
String
sayHello
(String name) throws java.rmi.RemoteException;
}
编写并执行客户端程序 TestHelloClient.java
import import import import
.xml.rpc.Service; javax.xml.rpc.ServiceFactory; .URL; space.QName;
</service> 客户端调用程序如下 TestHelloClient.java: import org.apache.axis.client.Call; import org.apache.axis.client.Service;
import import import import
space.QName; javax.xml.rpc.ServiceException; .MalformedURLException; java.rmi.RemoteException;
不是基于容器管理的,就是在本地通过 java 程序直接调用服务的,服务查找是通过 JAX-RPC ServiceFactory 进行的,JAX-RPC ServiceFactory 是创建服务访问点的工厂,可以如下进 行使用获取服务:
javax.xml.rpc.Service service = ServiceFactory.newInstance().createService(...);
String namespace = ""; String portName = "Hello"; QName portQN = new QName(namespace, portName); String operationName = "getGreeting";
JSR101 和 JSR109
用 java 实现 web services 必须遵循两个规范,他们分别是: JSR 101: 用于基于 XML 的 RPC(Remote Procedure Call) 的 Java API(Java API for XML based RPC,JAX-RPC) JSR 109: 实现企业 Web 服务(Implementing Enterprise Web services)
两个规范提供了厂商的实现的一致性和互操作性需求。 JAX-RPC —— Java 到 XML 和 XML 到 Java 映射 API JAX-RPC 为基于 XML 的远程过程调用(Remote Procedure Call,RPC)和 Java 应用程序 编程接口(Java Application Programming Interface,API):
WSDL 到 Java 和 Java 到 WSDL 映射:例如,将 WSDL 端口类型映射到 Java 服 务端点接口(Java Service Endpoint Interface,SEI)。
XML 数据类型到 Java 数据类型和 Java 数据类型到 XML 数据类型映射,包括简 单类型、复杂类型和数组。
public class TestHelloClient { public static void main(String[] args) { try { String wsdlUrl = "http://localhost:8080/axis/Hello?w
1. 获取一个 JAX-RPC Service 。 2. 使用 JAX-RPC Service 的 createCall() 方法实例化 JAX-RPC Call 。 3. 使用它的 setter 方法来配置您的 Call 实例。 4. 使用 JAX-RPC Call 的调用方法来调用 Web 服务的操作。
public String sayHello(String name) {
return "hello "+name; } } 将上面的程序发布成一个 web 服务,在 web-info\server-config.wsdd 文件添加下列描述:
<service name="Hello" provider="java:RPC"> <parameter name="className" value=" com.lion.service .Hello"/> <parameter name="allowedMethods" value=" sayHello "/>
.URL(endpoint)); // 为 Call 设置服务的位置 call.setOperationName(“sayHello”); String res = (String) call.invoke(new Object[] {"lion"}); System.out.println("return value is " + res); } catch (Exception ex) { ex.printStackTrace(); } }
使用 DII Call 接口的优势在于,客户机可以调用远程过程而无需知道开发时的 WSDL URI 或 Web 服务操作的签名。这样当 Web 服务的细节改变时,很容易对代码进行修改。使 用 DII 客户机,不需要像动态代理或静态存根的情形那样由从 WSDL 到 Java 的映射工具 (Emitter)生成运行时类。然而,如果您知道您想要调用的 Web 服务不可能更改,就应该 使用动态代理,因为配置 Call 实例可能很复杂。 我以调用一个 axis 的 webservices 为例说明 DLL 如何调用。 编写服务端程序 Hello package com.lion.service public class Hello {
Call call = service.createCall(); call.setPortTypeName(portQN); call.setOperationName(new QName(namespace, operationName)); call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY, ""); call.setProperty(Call.OPERATION_STYLE_PROPERTY, "wrapped"); call.addParameter("param1", <xsd:string>,ParameterMode.IN); call.setReturnType(<xsd:string>); Object[] inParams = new Object[] {"Jane"}; String ret = (String) call.invoke(inParams);
}
2.使用动态代理(Dynamic Proxy)调用
复杂度中等,灵活性中等的调用方式 您可以使用代理从 JAX-RPC Service 中调用 Web 服务的操作。代理是实现 SEI (服务端点 接口 Service Endpoint Interface)的 Java 类。获得代理使用的是 JAX-RPC Service 的 getPort() 方法,它接受您想要调用的 Web 服务的端口的名称(存在于 WSDL 文档中)以 及代理实现的 SEI。它之所以称为 动态是因为该代理是在运行时创建的。动态代理客户机 的步骤如下:
应用程序客户机容器客户机 Web 容器客户机:JavaBean 或 Servlet EJB 容器客户机:EJB 他们通过 jndi 查找服务,一般是两个步骤: 1.实例化本地 JNDI 上下文。 2.在此上下文中对 Web 服务进行 JNDI 查找。 Context ic = new InitialContext(); Service service = (Service) ctx.lookup("java:comp/env/service/HelloService"); 然后可以使用获得的服务接口(Service Interface)来获取静态存根、动态代理或 DII Call 对象,来实现我下面描述的三种调用方式。
JAX-RPC 1.1 和 JSR 109 是 J2EE 1.4 的组成部分。