一.WebService技术介绍
远程调用技术
Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。应用场景
系统与系统之间的数据调用,从远程系统中获取业务数据。
案例:OA协同办公系统与档案管理系统之间的对接。
二.WebService三大要素
Soap:(Simple Object Access Protocol)
简单对象存取协议。是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。WSDL:(Web Services Description Language)
WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。
元素说明:
Service 用于聚合一组服务访问点构成一个Web Services的定义。
Port 为Binding(绑定)制定一个地址,从而定义一个服务访问点。
Binding 为特定PortType(端口类型)定义的操作和消息指派具体的传输协议和数据格式规范。
PortType 一个或多个端点支持的操作的抽象集合。每个操作一般会引用一条输入消息和一条输出消息。
Message 代表所传输数据的抽象定义。消息由一些逻辑片断构成,每个逻辑片断分别与某个类型系统中的定义相关联。
Type 提供用于描述所交换消息的数据类型定义(string、int)。
UDDI (Universal Description, Discovery, and Integration)
是一个主要针对Web服务供应商和使用者的新项目。在用户能够调用Web服务之前,必须确定这个服务内包含哪些商务方法,找到被调用的接口定义,还要在服务端来编制软件,UDDI是一种根据描述文档来引导系统查找相应服务的机制。UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。它采用XML格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。
三.案例说明(气象局—天气查询网站)
- 需求分析
气象局(服务端)——天气查询网站(客户端)
服务端:发布一个天气查询服务,接收客户端城市名,返回天气数据给客户端;
客户端:发送城市名称给服务端,接收服务端的返回数据,打印。
2.程序实现
a.服务端:
step1:创建SEI(Service Endpoint Interface)接口,本质上就是java接口;
/**
* step1:创建接口
* @author Administrator
*
*/
public interface WeatherInterface {
public String queryWeather(String cityName);
}
step2:创建SEI实现类;
@WebService // 表示该类是一个服务类,需要发布其中的public方法
public class WeatherInterfaceImpl implements WeatherInterface{
@Override
public String queryWeather(String cityName) {
// TODO Auto-generated method stub
System.out.println("from client..." + cityName);
String weather = "晴";
return weather;
}
}
step3:发布服务,Endpoint发布服务,publish方法,
两个参数:1.服务地址;2.服务实现类;
public class WeatherServer {
public static void main(String[] args){
/*
* Endpoint发布服务
* 参数解释:
* 1.address:服务地址
* 2.implementor:实现类
*/
Endpoint.publish("http://localhost:12345/weather",
new WeatherInterfaceImpl());
}
}
step4:测试服务是否发布成功,通过阅读使用说明书,
确定客户端调用的接口、方法、参数和返回值存在,证明服务发布成功。
url:http://localhost:12345/weather
注: WSDL地址:服务地址+“?wsdl”; WSDL阅读方式:从下往上(图片)。
b.客户端:
step1:wsimport命令生成客户端代码;
wsimport -s . http://localhost:12345/weather?wsdl
项目目录结构:
step2:根据使用说明书,使用客户端代码调用服务端
第一步:创建服务视图,视图是从service标签的那么属性获取;
第二步:获取服务实现类,实现类从portType的name属性获取;
第三步:获取查询方法,从portType的operation标签获取。
public class WeatherClient {
public static void main(String[] args) {
// 创建服务视图(加载接口信息、实现类等)
WeatherInterfaceImplService weatherInterfaceImplService
= new WeatherInterfaceImplService();
// 获取服务实现类
WeatherInterfaceImpl weatherInterfaceImpl
= weatherInterfaceImplService
.getPort(WeatherInterfaceImpl.class);
// 调用查询方法,打印
String weather = weatherInterfaceImpl.queryWeather("北京");
System.out.println(weather);
}
}
3.运行结果