WebService
标签(空格分隔): webService
一、什么是webService:
webService即WEB服务。它使一种跨编程语言和操作系统的远程调用技术。
1、采用标准的SOAP(Simple Object Access Protocol)协议传输。SOAP属于w3c标准。
2、采用wsdl作为描述语言的webService使用说明书,wsdl属于w3c标准。
3、xml是webService跨平台的基础。
二、webService的使用场景
1、多个异构系统的集成
2、发布公共的服务接口
三、webService的三要素
1、SOAP
SOAP是一种简单对象访问协议(Simple Object Access Protocol)是一种简单的基于XML的协议。它使用成语通过HTTP来交换信息,可以理解为:SOAP = HTTP + XML。
SOAP不是webService的专有协议,其他应用协议也使用SOAP传输数据。如:SMTP等。
2、WSDL(webService description language)
是基于xml的御用描述webService及函数,参数,返回值。也就是说wsdl是webService的使用说明书。
3、UDDI
UDDI是一种目录服务,企业经自己开发的webService注册在UDDI,也可以使用别的企业在UDDI上注册的服务,从而达到资源共享,促进全球经济合作。
四、使用JAX-WS开发webService
JAX-WS 的全称为 Java API for XML-Based Webservices ,早期的基于SOAP 的JAVA 的Web 服务规范JAX-RPC(Java API For XML-RemoteProcedure Call)目前已经被JAX-WS 规范取代。从java5开始支持JAX-WS2.0版本,Jdk1.6.0_13以后的版本支持2.1版本,jdk1.7支持2.2版本。
- 编程思路
1、编写SEI(Service Endpoint Interface)
2、发布服务类
3、根据服务地址查看wsdl(使用说明书)
4、根据wsdl生成客户端代码
使用命令:wsimport -s . -p 包名 wsdl地址
5、客户端调用 编码
编写SEI(ServiceEndpoint Interface),SEI在webservice中称为portType,在java中称为接口
/** * 天气服务接口 * @author MOTUI * */ public interface WeatherService { /** * 根据城市名称获得天气情况 * @param cityName * @return */ public String getWeather(String cityName); }
编写SEI实现类,此类作为webservice提供服务类
/** * 服务接口实现类 * @author MOTUI * */ @WebService public class WeatherServiceImpl implements WeatherService { @Override public String getWeather(String cityName) { if ("北京".equals(cityName)) { return "阴转多云,18~25摄氏度"; } return "其他地区正在完善"; } }
发布服务
/** * 发布服务 * @author MOTUI */ public class TestPublishService { public static void main(String[] args) { System.out.println("发布Service"); /** * 两个参数 * 参数1:对外访问地址 * 参数2:发布的Service实现类 * 地址中的端口号自己定义,只要不冲突即可 */ Endpoint.publish("http://localhost:9999/ws", new WeatherServiceImpl()); } }
测试服务是否发送成功
wsdl的阅读
a.wsdl从上往下阅读
b.首先在wsdl中找到service 的name 也就是服务视图名
c.通过服务视图名找到对应的binding,通过binding找到对应的type
d.通过type找到对应的portType,要调用的方法,参数,返回值,描述都在PortType中生成客户端代码
a.Wsimport介绍wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码).当然,无论服务器端的WebService是用什么语言写的,都可以生成调用webservice的客户端代码,服务端通过客户端代码调用webservice。 wsimport.exe位于JAVA_HOME\bin目录下.
b.常用参数为:
-d<目录> - 将生成.class文件。默认参数。 -s<目录> - 将生成.java文件。 -p<生成的新包名> -将生成的类,放于指定的包下。 (wsdlurl) http://server:port/service?wsdl,必须的参数。 示例:wsimport -s . -p 包名 wsdlurl 注意:-s不能分开,-s后面有个小点
客户端调用
方式一:/** * 测试客户端 * @author MOTUI * */ public class TestClient { public static void main(String[] args) { //获得WeatherServiceImplService对象 WeatherServiceImplService serviceImplService = new WeatherServiceImplService(); //通过WeatherServiceImplService对象获得WeatherServiceImpl核心类 WeatherServiceImpl serviceImplPort = serviceImplService.getWeatherServiceImplPort(); //调用方法 String weather = serviceImplPort.getWeather("北京"); System.out.println(weather); } }
方式二【标准的webService调用方式】:
/** * 测试客户端 * @author MOTUI * */ public class TestClient1 { public static void main(String[] args) throws Exception { //服务器地址 URL url = new URL("http://localhost:9999/ws?wsdl"); /** * 参数1:wsdl 中的targetNamespace * 参数2:wsdl 中的服务视图名称 */ QName qName = new QName("http://service.motui.com/","WeatherServiceImplService"); /** * 参数1:wsdl 地址 * 参数2:QName */ //创建服务器对象 Service service = Service.create(url,qName); //获取protType WeatherServiceImpl port = service.getPort(WeatherServiceImpl.class); //调用方法 String weather = port.getWeather("北京"); System.out.println(weather); } }
五、webService的优缺点
优点:1、采用xml支持跨平台远程调用 2、基于http的SOAP协议,可跨越防火墙 3、支持面向对象开发 4、有利于软件和数据的重用,实现松耦合。
缺点:
由于SOAP是基于xml传递数据,xml本身传递数据时会传输一些无关数据从而效率不高,随着SOAP协议的不断完善,SOAP协议增加了许多内容,这样那个就导致了使用SOAP协议去完成简单的数据传输的效率不高。