您的位置:首页 > 其它

WEB服务及实现(二)

2013-11-11 20:52 253 查看
一、如何实现WEB服务

WEB服务是实现分布式系统的一种技术。在考虑实现的时候分Client端、Web服务器端和消息通信协议三部分考虑。WEB服务的标准如下图所示:



二、Web服务实现功能的描述

服务提供端(Web服务Server端)
--------支持远程通信协议(HTTP,JMS…)
--------接收和处理SOAP消息(解析SOAP消息…)
--------将SOAP消息描述的数据类型、对象、方法、参数转换为对应的实现语言( type=“xsd:int“ 转换为 int …)
--------调用组件或者对象的方法

服务调用过程(服务端)

1.接受并预处理SOAP请求消息(包括SOAP消息校验、处理SOAP消息报文头(Header))
2.从消息中获取消息希望调用的接口和具体操作;
3.找到具体的实现对象,并调用该对象的接口;
4.将SOAP请求消息中的服务请求参数;
5.目标Java对象执行相应的操作,将计算结果以对象形式返回;
6.根据WSDL中的定义,将计算结果序列化为XML元素,并封装到SOAP回复消息中;
7.将SOAP回复消息发送回服务调用端。

服务调用端(Web服务Client端)
--------支持远程通信协议(HTTP,JMS…)
--------接收和处理SOAP消息
服务调用过程(客户端)

1.首先创建服务端点接口对象SEI(Service Endpoint Interface);
2.客户端通过SEI调用其中服装的Web服务接口;
3.根据WSDL的定义,将客户端的调用接口的参数转化成XML元素,再将该元素封装在SOAP请求消息里;
4.在同步调用模式下,在SOAP请求消息发出后,客户端会等待SOAP应答消息;异步模式下,客户端顺序执行后续代码;
5.解析从服务器端获得SOAP应答消息,将SOAP应答消息中的数据转化为客户端对象,该对象的值就是被调用服务的返回值。

三、web服务实现
使用axis2实现一个简单计算服务程序
1. 服务程序:

public class CalculateService {
public double plus(double x,double y){
return x+y;
}
public double minus(double x,double y){
return x-y;
}
public double multiply(double x,double y){
return x*y;
}
public double divide(double x,double y){
return x/y;
}

}

2. 部署:编译CalculateService类后,将CalculateService.class文件放到<Tomcat安装目录>webapps\axis2\WEB-INF\pojo目录中(如果没有pojo目录,则建立该目录)
3. 客户端调用webservice的程序:

package ming.testClient;
import javax.xml.namespace.QName;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

public class TestClient {

public static void main(String[] args) throws Exception
{
//  使用RPC方式调用WebService
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
//  指定调用WebService的URL
EndpointReference targetEPR = new EndpointReference(
"http://localhost:8080/axis2/services/CalculateService");
options.setTo(targetEPR);
//  指定加法方法的参数值
Object[] opAddEntryArgs = new Object[] {10.0,12.0};
//  指定plus方法返回值的数据类型的Class对象
Class[] classes = new Class[] {double.class};
//  指定要调用的plus方法及WSDL文件的命名空间
QName opAddEntry = new QName("http://ws.apache.org/axis2", "plus");
//  调用plus方法并输出该方法的返回值
System.out.println("the result of "+opAddEntryArgs[0]+" plus "+opAddEntryArgs[1]+" is :");
System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]);
//  下面是调用减法方法的代码,这些代码与调用plus方法的代码类似
Object[] opAddEntryArgs2 = new Object[] {12.0,10.0};
classes = new Class[] {double.class};
opAddEntry = new QName("http://ws.apache.org/axis2", "minus");
System.out.println("the result of "+opAddEntryArgs2[0]+" minus "+opAddEntryArgs2[1]+" is :");
System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs2, classes)[0]);
}

}

4. 返回结果:



这说明webservice发布成功,返回了正确结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐