Webservice 第一天 jaxws编程方法 综合案例
Webservice课程安排:
两天课:
第一天:
什么是webservice?
从案例(便民查询网站)分析如何实现?
使用socket实现。
使用jaxws开发webservice。
Webservice三要素
Wsdl(webservice使用说明书)重点掌握
Soap(jaxws开发webservice的传输协议)重点掌握
UDDI(了解)
Webservice的使用场景分析(掌握)
学会jaxws基本开发方法(重点)
Soap1.1和soap1.2区别:
跟踪soap协议
综合案例:
使用webservice传输xml数据(重点掌握)
第二天:
Jaxws的深入开发:
常用注解
测试jaxws传输复杂对象类型
CXF开发webservice:
CXF入门程序
Spring+cxf整合(重点)
CXF发布rest的webservice。(重点)
综合案例:
实现便民查询网站
1 便民网站分析
1.1 需求
通过便民网站,查询日常信息。
1.2 分析
客户端/服务器模式:
tcp:是一种传输层协议,是一种面向连接的协议,经过三次握手客户端和服务端连接一个连接(通道)。Tcp传输数据时稳定。
udp:是一种传输层协议,是一种数据报协议,速度是很快的,不稳定的。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去
最终采用tcp通信方式,客户端向服务端发起请求,查询天气信息。
1.3 Socket实现天气查询
1、jaxws开发webservice和socket对比分析
2、重视socket开发,企业开发后台服务常使用socket。
a)服务端要有可持续运行能力,保证线程一直在运行
b)并发处理能力,要使用多线程
分析
实现
准备环境:
Jdk1.7.0.72
Eclipse indigo
Mysql5.1
创建服务端:
创建客户端:
小结
使用socket传输数据需要程序员关注如何解析数据流。
设想,如果可以面向对象开发,直接传输java对象,减轻程序员开发的复杂度。
1.4 Java开发webservice
JAVA 中共有三种WebService 规范,分别是JAX-WS(JAX-RPC)、JAXM&SAAJ、JAX-RS。
Jaxws(掌握)
JAX-WS 的全称为 Java API for XML-Based Webservices ,早期的基于SOAP 的JAVA 的Web 服务规范JAX-RPC(Java API For XML-Remote Procedure Call)目前已经被JAX-WS 规范取代。从java5开始支持JAX-WS2.0版本,Jdk1.6.0_13以后的版本支持2.1版本,jdk1.7支持2.2版本。
Jaxws开发的webservice传输soap协议。
1.4.2 JAXM&SAAJ(了解)
JAXM(JAVA API For XML Message)主要定义了包含了发送和接收消息所需的API,SAAJ(SOAP With Attachment API For Java,JSR 67)是与JAXM 搭配使用的API,为构建SOAP 包和解析SOAP 包提供了重要的支持,支持附件传输等,JAXM&SAAJ 与JAX-WS 都是基于SOAP 的Web 服务,相比之下JAXM&SAAJ 暴漏了SOAP更多的底层细节,编码比较麻烦,而JAX-WS 更加抽象,隐藏了更多的细节,更加面向对象,实现起来你基本上不需要关心SOAP 的任何细节
JAXM&SAAJ 暴漏了SOAP更多的底层细节,编码比较麻烦,JAXM&SAAJ通常不使用。
1.4.3JAX-RS(掌握)
JAX-RS 是JAVA 针对REST(Representation State Transfer)风格制定的一套Web 服务规范,由于推出的较晚,该规范(JSR 311,目前JAX-RS 的版本为1.0)并未随JDK1.6 一起发行。
Rest定义参考:理解RESTful架构.docx
需要大家重视,当前比较流行,因为jax-RS可以发布 rest风格webservice,因为rest的webservice不采用soap传输,直接采用http传输,可以返回xml或json,比较轻量。
1.5 Jaxws实现天气查询
支持java面向对象开发。
服务端
定义java接口,提供天所查询方法。
SEI
编写SEI(Service Endpoint Interface),SEI在webservice中称为portType,在java中称为接口
public interface WeatherInterface {
//根据 城市名称查询天气信息
public String queryWeather(String cityName);
}
SEI实现类
发布webservice服务
错误:
发布服务,如果服务端口已被暂用报错:
验证webservice服务是否发布成功
在webservice的地址后边添加?wsdl,查询webservice的使用说明书内容是否完整,如果wsdl内容完整,表示webservice发布成功。
阅读 wsdl方法:
Wsdl是xml格式文档。
从下往上读。
找到service:
里边有port,
Binding
最终通过binding找到portType
portType有方法,调用webservice就是调用porttype的方法。
最终找到porttype,其中有方法,说明 wsdl文档基本上完整。必须存在调用服务类及方法。
客户端
支持面向对象开发。
客户端功能调用webservice,先知道webservice地址:
一般情况下,只要知道 wsdl的地址,就可以知道 webservice地址。
天气查询服务地址:http://127.0.0.1:12345/weather?wsdl
阅读wsdl
找到service(服务视图)
通过binding找到portType(服务端点)
使用wsimport生成webservice的客户端调用代码
Wsimport:是jdk提供的一个工具,作用是根据webservice的wsdl地址生成客户端调用代码。
单独创建一个工程wsimport存放生成代码.
通过cmd进入工程wsimport目录。
生成代码:
默认生成的代码所在包名,是wsdl中命名空间的倒序。
可以通过wsimport –p指定包名。
详细参见笔记。
将生成 的代码拷贝到客户端工程中
编写客户端程序:
2 Webservice与socket的区别(重点理解)
Socket:是一种传输层的协议。常用tcp、udp。Socket是操作系统 提供的一套网络接口,不同的编程语言都有实现 。Socket是跨平台的。
传输数据时需要程序员自己解析数据流。
优点 :传输速度很快。
应用场景:如果要考虑传输速度,优先使用Socket
Webservice使用soap协议:基于http的应用层协议,http也是应用层协议,基于socket传输数据。http或soap都是跨平台的。soap在http协议的基础上,一个基于XML的协议。
不同:都是底层的通信协议,请求包的格式不同而已,soap包是XML格式,http纯文本格式。
Jaxws开发Webservice,传输数据库是面向对象方式,不用程序员自己解析数据流。
Webservice如何传输数据:
因为webservice要经过两次序列化,传输速度不快。
缺点:传输速度慢。
优点:面向对象 开发,soap协议是一个标准协议,方便进行跨平台、跨公司进行接口开发。
应用场景:不考虑传输速度前提下,根据soap标准协议,方便进行接口定义。
3 什么是webservice
web 服务+跨平台+远程调用+soap协议传输数据
3.1 定义
Webservice即web 服务,是一种跨平台的远程调用技术,基于http的soap协议传输数据,也可以直接使用http传输数据。
Web service 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术。
采用标准SOAP(Simple Object Access Protocol) 协议传输,soap属于w3c标准。Soap协议是基于http的应用层协议,soap协议传输是xml数据。
采用wsdl作为描述语言即webservice使用说明书,wsdl属w3c标准。
xml是webservice的跨平台的基础,XML主要的优点在于它既与平台无关,又与厂商无关。
XSD,W3C为webservice制定了一套传输数据类型,使用xml进行描述,即XSD(XML Schema Datatypes),任何编程语言写的webservice接口在发送数据时都要转换成webservice标准的XSD发送。
当前非SOAP协议的webService以轻量为首要目标,比如rest webservice也是webservice的一种方式。
3.2 webService三要素
soap
soap协议是webservice是传输协议,即简单对象访问协议。Soap协议是xml格式,理解为基于http传输xml数据。
Soap=http+xml
wsdl
wsdl是webservice的使用说明书。根据wsdl去如何调用webservice。从下往上读,找到service服务视图,通过binding找到portType(服务类)。
UDDI(了解)
UDDI是一个目录服务,存储了全球的webservice地址。
UDDI旨在将全球的webservcie资源进行共享,促进全球经济合作。
3.3 Webservice应用场景
用于分布式应用集成,实现软件重用
系统A和系统B可以通过单点登陆系统进行用户身份认证。
单点登陆系统:将用户登陆功能抽取出来,组成一个单独系统,达到软件重用的目标。
用户信息可以在单点登陆系统一处存储,系统A和系统B不用记录用户信息,方便有效进行系统集成。
建议不用webservice
同构程序间通信可以不用webservice,前提是多个同构程序是相同的公司开发的。
比如:一个公司作了两个程序,都 是java,采用java提供一个远程调用技术,RMI。RMI 指的是远程方法调用 (Remote Method Invocation)。
RMI基于socket传输数据,支持面向对象,要比soap协议传输快。
Socket>RMI>soap
建议使用webservice
公开接口:
在互联网发布服务接口,不考虑客户端的类型,使用webservice发布服务。
因为webservice基于soap协议(w3c标准协议),所以使用soap发布服务。
调用webservice服务端
由于webservice服务端已确定,作为客户端别无选择。
3.4 Webservice优缺点
3.4.1优点:
1 、采用xml支持跨平台远程调用。
2、基于http的soap协议,可跨越防火墙。
(因为SOAP一般使用HTTP协议,而服务器的这个协议一般都是开放的,而且是可以穿过防火墙的)
3、支持面向对象开发。
4、有利于软件和数据重用,实现松耦合。
3.4.2缺点:
1、 由于soap是基于xml传输,本身使用xml传输会传输一些无关的东西从而效率不高,随着soap协议的完善,soap协议增加了许多内容,这样就导致了使用soap协议去完成简单的数据传输的效率不高。如果直接用http传输自定义数据内容比webservice开发更快捷,例如第三方支付公司的支持接口。
3.5 小结
Webservice是基于http发布web 服务,可以采用soap协议作为传输数据格式,也可以直接使用http传输数据,比如rest方式。
3.6再谈socket和webservice应用场景
Socket:
优点:传输速度快
缺点:需要手动解析数据流,如果用socket传输数据需要接口双方定义接口协议格式(传什么格式xml,传什么json???),自定义协议,不方便进行接口开发。
场景:要考虑传输速度,优先使用socket,但是需要自定义协议(接口双方定义一个传输的数据格式)。
Socket开发:
注意:socket服务可持续性,高并发性。
Webservice:
优点:采用标准soap协议,接口双方只要遵循标准协议开发使用接口。通过wsdl知道接口内容。方便进行接口开发。
缺点:传输速度慢。
场景:公开接口,在不考虑客户端类型或传输性能,接口面向整个互联网,优先考虑webservice。
Webservice性能差的原因:如果传输soap经过两次对象序列化,webservice的性能依赖中间件的性能。
4 wsdl
4.1 定义
WSDL 指网络服务描述语言(Web Services Description Language)。
WSDL是一种使用 XML 编写的文档。这种文档可描述某个 Web service。它可规定服务的位置,以及此服务提供的操作(或方法)。
WSDL 是一种 XML 文档
WSDL 用于描述网络服务
WSDL 也可用于定位网络服务
通过wsdl知道webservice如何调用。
4.2 说明书结构
从下往上读:
<service> 服务视图,webservice的服务结点,它包括了服务端点
<binding> 为每个服务端点定义消息格式和协议细节
<portType> 服务端点,描述 web service可被执行的操作方法,以及相关的消息,通过binding指向portType
<message> 定义一个操作(方法)的数据参数(可有多个参数)
<types> 定义 web service 使用的全部数据类型
4.3 公网天气查询开发
只需要开发查询公网天气客户端
阅读 wsdl
Service服务视图:
portType服务端点:
使用wsimport生成客户端调用代码
需要知道wsdl的地址。
Wsimport不支持soap1.2的客户端代码生成。
将生成代码拷贝到工程中,开发客户端
使用客户端生成代码调用服务端:
小结
使用客户端生成的代码调用服务端,缺点:
将webservice的地址封装在生成代码中,如果将来webservice地址改变,需要重新生成,修改客户端调用代码。
不方便系统维护。
5 上午课程回顾
什么是webservice?
Webservice即web服务,基于http的soap 协议传输,也可以只基于http传输数据。
什么是Wsdl?
Wsdl就是网络服务的描述语言,即webservice的使用说明书。
从下往上读:
先找到service服务视图
再通过binding找到portType
找到portType中的服务方法
Jaxws开发webservice步骤:
服务端开发:
定义SEI(service endpoint interface)服务端点,即portType,在java中是接口
定义SEI的实现类,类上边使用@webservice注解标记它是一个webservice服务类。
发布服务:
//第一个参数:webservice的地址
//第二个参数:使用@webService标记的服务对象
Endpoint.publish(“http://127.0.0.1:12345/weather“, new WeatherInterfaceImpl());
客户端开发:
第一种方法:
使用客户端生成代码调用webservice。
第一步:
Wsimport根据 wsdl生成客户端调用代码
第二步:
将生成的代码拷贝到工程中编写客户端代码
1》创建Service服务视图
2》通过服务视图得到portType
3》调用portType方法
此方法缺点:将webservice的地址在生成代码写死 了,如果webservice地址变更需要重新生成代码。系统维护不方便。
6 客户端开发第二种方法
Jaxws标准方法:
6.1 使用jdk的service类调用webservice。
6.2 使用jaxws标准方法调用公网天气查询:
6.3 小结
使用jaxws标准方法调用webservice可以指定webservice地调用地址,比通过生成代码调用webservice要灵活!!
7 soap
7.1 定义
soap,简单对象访问协议,基于http传输xml数据,soap协议体是xml格式。
SOAP 是一种网络通信协议
SOAP即Simple Object Access Protocol简易对象访问协议
SOAP 用于跨平台应用程序之间的通信
SOAP 被设计用来通过因特网(http)进行通信
SOAP = HTTP+XML,其实就是通过HTTP发xml数据
SOAP 很简单并可扩展支持面向对象
SOAP 允许您跨越防火墙
SOAP 将被作为 W3C 标准来发展
7.2 使用TCP/IP Monitor监视Soap协议
TCP/IP Monitor配置
TCP/IP Monitor:是eclipse自带的一个工具,通过代理的方法监视tcp协议内容。
通过TCP/IP Monitor监视soap协议内容。
TCP/IP Monitor配置:
测试:
编写webservice客户端,向代理端口中发送数据。
地址:http://127.0.0.1:54321/weather?wsdl
客户端请求的soap协议内容:
POST /weather HTTP/1.1
Accept: text/xml, multipart/related
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://server.weather.jaxws.ws.itcast.cn/WeatherInterfaceImpl/queryWeatherRequest"
User-Agent: JAX-WS RI 2.2.4-b01
Host: 127.0.0.1:54321
Connection: keep-alive
Content-Length: 226
Soap协议体内容:
Xml格式。
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:queryWeather xmlns:ns2="http://server.weather.jaxws.ws.itcast.cn/">
<arg0>郑州</arg0>
</ns2:queryWeather>
</S:Body>
</S:Envelope>
响应内容:
HTTP/1.1 200 OK
Transfer-encoding: chunked
Content-type: text/xml; charset=utf-8
Date: Tue, 30 Dec 2014 06:40:50 GMT
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:queryWeatherResponse xmlns:ns2="http://server.weather.jaxws.ws.itcast.cn/">
<return>晴</return>
</ns2:queryWeatherResponse>
</S:Body>
</S:Envelope>
Soap协议体内容
必需有 Envelope 元素,此元素将整个 XML 文档标识为一条 SOAP 消息
可选的 Header 元素,包含头部信息
必需有Body 元素,包含所有的调用和响应信息
可选的 Fault 元素,提供有关在处理此消息所发生错误的信息
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Header>
... ...
</soap:Header>
<soap:Body>
... ...
<soap:Fault>
... ...
</soap:Fault>
</soap:Body>
</soap:Envelope>
Soap协议常用1.1和1.2两个版本。
7.3 通过http发送soap协议体(xml)
思路
模拟一个http的客户端(相当于一个浏览器),客户端通过程序实现,向webservice的服务端发送soap协议(xml)。
http客户端意义(掌握):
在企业开发中,很多都 是http接口,需要写程序模拟http请求,请求数据解析数据。
实现
//开启 一个http链接
//webservice地址
URL url = new URL("http://127.0.0.1:12345/weather");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
//设置post请求,post是大写
httpURLConnection.setRequestMethod("POST");
//Content-Type: text/xml; charset=utf-8
httpURLConnection.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
//设置请求和响应
httpURLConnection.setDoInput(true);
httpURLConnection.setDoOutput(true);
String requestString = requestString("郑州");
//发送soap协议
httpURLConnection.getOutputStream().write(requestString.getBytes());
//接收响应内容
InputStream inputStream = httpURLConnection.getInputStream();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int len=-1;
byte[] b = new byte[1024];
//将inputStream内容写到byteArrayOutputStream
while((len= inputStream.read(b, 0, 1024))!=-1){
byteArrayOutputStream.write(b, 0, len);
}
//获取响应内容
String responseString = byteArrayOutputStream.toString();
System.out.println(responseString);
//解析响应的xml数据。
//....
inputStream.close();
byteArrayOutputStream.close();
课后作业
上网查找 httpclient的使用方法:
http://hc.apache.org/
Httpclient就是模拟http的请求,在企业开发中通过httpclient向http服务端请求,获取接口内容。
Soap1.2协议测试
如何将service类发布soap1.2:
在SEI实现类上添加如下注解
@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)
Soap1.2要发布,需要下载扩展包:
Jaxws实现soap1.2需要加入jaxws扩展包,从sun下载jaxws-ri-2.2.8,解压jaxws-ri-2.2.8并将lib下的jar包加载到java工程中。
修改service代码:
Wsdl内容,有soap12前缀:
soap1.2请求和响应:
请求内容:
POST /weather HTTP/1.1
Accept: application/soap+xml, multipart/related
Content-Type: application/soap+xml;
charset=utf-8;action="http://server.weather.jaxws.ws.itcast.cn/WeatherInterfaceImpl/queryWeatherRequest"
User-Agent: JAX-WS RI 2.2.4-b01
Host: 127.0.0.1:54321
Connection: keep-alive
Content-Length: 224
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body>
<ns2:queryWeather xmlns:ns2="http://server.weather.jaxws.ws.itcast.cn/">
<arg0>郑州</arg0>
</ns2:queryWeather>
</S:Body>
</S:Envelope>
响应内容:
HTTP/1.1 200 OK
Transfer-encoding: chunked
Content-type: application/soap+xml; charset=utf-8
Date: Tue, 30 Dec 2014 07:39:51 GMT
<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body>
<ns2:queryWeatherResponse xmlns:ns2="http://server.weather.jaxws.ws.itcast.cn/">
<return>晴</return>
</ns2:queryWeatherResponse>
</S:Body>
</S:Envelope>
Soap1.1和soap1.2对比
Soap1.1版本:
通过http进行post请求。
Content-Type: text/xml; charset=utf-8
Soap1.1命名空间:http://schemas.xmlsoap.org/soap/envelope/
Soap1.2版本:
Post请求
Content-Type: application/soap+xml;
soap1.2命名空间:http://www.w3.org/2003/05/soap-envelope
soap1.1的服务端需要soap11客户端调用
soap1.2的服务端soap1.1客户端和soap1.2客户端都 可以调用。
8 Webservice客户端开发方法总结
8.1 使用客户端生成代码方法
第一步:使用wsimport或其它工具(比如cxf的wsdl2java)生成客户端的调用
第二步:使用生成代码调用webservice服务端
使用生成的service服务视图类创建服务视图对象
调用service服务对象的getPortXXX方法得到portType。
//创建服务视图对象
WeatherInterfaceImplService weatherInterfaceImplService =new WeatherInterfaceImplService();
//通过服务视图得到portType(接口类型)
WeatherInterfaceImpl weatherInterfaceImpl = weatherInterfaceImplService.getWeatherInterfaceImplPort();
//调用webservice方法
String result = weatherInterfaceImpl.queryWeather("郑州");
8.2 使用jaxws标准方法(Service类)(推荐使用)
第一步:使用wsimport或其它工具(比如cxf的wsdl2java)生成客户端的调用
第二步:使用url、qname、service调用服务端
//wsdl的路径
URL wsdlDocumentLocation = new URL("http://127.0.0.1:54321/weather?wsdl");
//从wsdl中找到服务视图
//第一个参数:wsdl的命名空间
//第二个参数:服务视图名称
QName serviceName = new QName("http://server.weather.jaxws.ws.itcast.cn/", "WeatherInterfaceImplService");
//第一步使用Service创建服务视图
Service service =Service.create(wsdlDocumentLocation, serviceName);
//从服务视图得到portType对象
//参数:portType
WeatherInterfaceImpl weatherInterfaceImpl = service.getPort(WeatherInterfaceImpl.class);
8.3 模拟http客户端调用webservice服务(掌握)
使用HttpURLConnection或apache的Httpclient模拟http请求,调用webservice。
注意:使用此方法不需要生成客户端调用代码。。
9 webservice案例(webservice发送xml)
9.1 目标
企业开发中常用webservice发送xml或json数据。。
学会webservice发送xml数据的方法。
9.2 需求
创建区域查询webservice服务,客户端调用服务端查询区域信息,客户端向服务端传递xml格式数据,服务端向客户端响应xml格式数据。
为什么webservice发送xml数据
在soap协议体中发送xml数据,xml数据是区域信息(业务数据),企业开发中常用xml格式数据,因为xml是一种夸平台的数据格式,大家都认可,xml解析方便。
思路:定义一个webservice服务方法,方法接收字符串(xml数据),方法只有一个参数,比较简单。
单独 创建区域查询webservice服务有什么好处
Webservice是SOA服务架构使用方法。
系统A和系统B不需要开发区域管理,使用公用的区域管理系统,通过调用区域管理的服务接口,实现区域查询。
9.3 分析
9.4 定义接口格式
通常由服务端人员进行定义,接口定义好,和客户端调用方进行交流,修改完善接口。
服务端从数据库查询区域信息:
SELECT * FROM AREA WHERE parentid =’1.’ LIMIT 0,10
接口描述内容:区域查询
接口功能描述:系统A请求区域查询系统查询区域信息
接口方向:系统A–区域系统
接口协议:soap
接口数据描述(重点):详见下边的xml数据描述
…
Xml数据描述:
请求的xml格式:
<?xml version="1.1" encoding="utf-8"?>
<queryarea>
<parentid> </parentid>//父级区域id
<start></start>//起始记录,从1开始
<end></end>//结束记录
</queryarea>
响应的xml格式:
<?xml version="1.0" encoding="UTF-8"?>
<areas>
<area>
<areaid> </areaid>//区域id
<areaname></areaname>//区域名称
<arealevel></arealevel>//区域等级
<parentid></parentid>//父级区域id
</area>
//…..
</areas>
9.5 服务端实现
准备环境
Jar包:
Mysql数据库驱动
Dom4j包
dao
注意:dao面向mysql数据库的,接收的参数:
service
service面向的是客户端。
Service接口按照上边的接口描述定义,请求是xml串,响应的是xml串。
参考:
注意:public方法默认会自动发布为服务。私有方法不会发布为服务。
发布区域查询服务
9.6 客户端开发
准备环境:
加入 dom4j包
开发
使用jaxws标准方法:
第一步:使用wsimport生成客户端调用代码
9.7 小结
首先定义xml数据格式,定义接口协议。
使用jaxws发布webservice。
服务端和客户端都需要对xml接口数据进行解析。