WEB服务及实现(二)

一、如何实现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发布成功,返回了正确结果。









  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值