WebService的讲解 和 CXF 的初步使用
1. 复习准备
1.1. Schema约束
几个重要知识:
相当于schema文件的id
用来指定schema文件的namespace的值
引入一个约束, 它的值是一个schema文件的namespace值
用来指定引入的schema文件的位置
schema规范中: 1. 所有标签和属性都需要有schema文件来定义 2. 所有的schema文件都需要有一个id, 但在这里它叫namespace, 3. namespace的值由什么来指定? 由targetNamespace属性来指定, 它的值是一个url(很有可能不存在) 4. 如何引入一个Schema约束? 属性: 用xmlns属性 属性值: 对应的schema文件的id(namespace值) 5. 如果引入的schema不是w3c组织定义, 必须指定schema文件的位置 6. schema文件的位置由什么属性来指定? 属性: schemaLocation 属性值: namespace path 7. 如果引入了N个约束, 需要给n-1个取别名
|
1.2. HTTP协议
几个重要知识:
1. 请求的组成:
请求行(请求方式 path http1.1)
请求头
请求体: 只有post请求有
2. 响应的组成
响应状态行:
响应头
响应体 : 浏览器解析显示的数据
3. 请求的过程
2. 面试问题
1.webservice相当于HTTP+?+?
? : xml
? : schema
2.wsdl是什么?
webservice定义语言, 对应.wsdl文档, 一个webservice会对应一个唯一的wsdl文档,
定义了客户端与服务端发送请求和响应的数据格式和过程
3.如何发布一个webservice?
定义SEI @webservice @webMethod
定义SEI的实现
发布: Endpoint.publish(url, SEIImplObject)
4. 如何请求一个webservice?
1.根据wsdl文档生成客户端代码 jdk/cxf
2.根据生成的代码调用webService
3. 关于Web Service的几个问题
3.1. Web service是什么?
1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据)
2. 一个跨语言、跨平台的规范(抽象)
3. 多个跨平台、跨语言的应用间通信整合的方案(实际)
以各个网站显示天气预报功能为例:
气象中心的管理系统将收集的天气信息并将数据暴露出来(通过WebService Server),
而各大站点的应用就去调用它们得到天气信息并以不同的样式去展示(WebService Client).
网站提供了天气预报的服务,但其实它们什么也没有做,
只是简单了调用了一下气象中心服务器上的一段代码而已。
3.2. 为什么要用Web service?
web service能解决:
跨平台调用
跨语言调用
远程调用
3.3. 什么时候使用web Service?
1. 同一家公司的新旧应用之间
2. 不同公司的应用之间
分析业务需求:天猫网与中通物流系统如何交互?
3. 一些提供数据的内容聚合应用:天气预报、股票行情
4. Web Service中的几个重要术语
4.1. WSDL:web service definition language
直译 : WebService定义语言
1. 对应一种类型的文件.wsdl
2. 定义了web service的服务器端与客户端应用交互传递请求和响应数据的格式和方式
3. 一个web service对应一个唯一的wsdl文档
4.2. SOAP:simple object access protocal
直译: 简单对象访问协议
- 是一种简单的、基于HTTP和XML的协议, 用于在WEB上交换结构化的数据
- soap消息:请求消息和响应消息
http+xml片断
4.3. SEI:WebService EndPoint Interface(终端)
直译: web service的终端接口,
- 就是WebService服务器端用来处理请求的接口
@Webservice
@WebMethod
4.4. CXF:Celtix + XFire
一个apache的用于开发webservice服务器端和客户端的框架
5. 开发webservice
5.1. 概述
- 开发手段:
– 使用JDK开发(1.6及以上版本)
– 使用CXF框架开发(工作中)
- 组成:
– 服务器端
– 客户端
5.1. 使用JDK开发WebService
1).开发服务器端
- Web Service编码:
– @WebService( SEI和SEI的实现类)
– @WebMethod(SEI中的所有方法)
1 import javax.jws.WebMethod; 2 import javax.jws.WebService; 3 4 /** 5 * SEI 6 * @author Administrator 7 * 8 */ 9 @WebService 10 public interface HelloWs { 11 12 @WebMethod 13 public String sayHello(String name); 14 }
1 import javax.jws.WebService; 2 3 import com.ittest.ws.service.HelloWs; 4 /** 5 * SEI 的实现 6 * @author Administrator 7 * 8 */ 9 @WebService 10 public class HelloWsImpl implements HelloWs { 11 12 public String sayHello(String name) { 13 System.out.println("service sayHello() "+name); 14 return "Hello "+name; 15 } 16 17 }
- 发布Web Service:
– Endpoint(终端, 发布webservice)
1 import javax.xml.ws.Endpoint; 2 3 import com.ittest.ws.service.impl.HelloWsImpl; 4 5 /** 6 * 发布webservice 7 * @author Administrator 8 * 9 */ 10 public class TestService { 11 12 public static void main(String[] args) { 13 String address = "http://192.168.1.100:8989/webService_01_sayService/hellows"; 14 Endpoint.publish(address, new HelloWsImpl()); 15 System.out.println("发布 webService_01_sayService 成功"); 16 } 17 }
2). 开发客户端
- 使用eclipse提供的web service浏览器访问
– 查看对应的wsdl文档:…..?wsdl (一般浏览器)
– 请求webService并查看请求和响应消息(webservice浏览器)
- 创建客户端应用编码方式访问
– 借助jdk的wsimort.exe工具生成客户端代码:
wsimport -keep url //url为wsdl文件的路径
– 借助生成的代码编写请求代码
5.2. 监听请求: 使用Eclipse的TCP/IP工具(端口转发)
- 将服务器端的WSDL文档保存到客户端本地
- 修改文档: 将端口号从8989改为8080
- 根据本地的wsdl文档生成客户端代码, 并编写客户端的调用代码
- 配置eclipse的TCP/IP,启动监听
- 执行客户端代码发送WebService请求
5.3. 调用免费的web service(天气预报)
- Google”免费WebService”, 找到提供天气预报Webservice的网络地址
– http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx
- 使用eclipse的web service浏览器访问
- 客户端编码方式访问
– 借助命令工具自动生成客户端代码
– 借助生成的代码编写请求代码
异常说明: 直接生成客户端代码会抛异常, 无法生成客户端代码, 解决办法:
- 将对应的wsdl文档保存到本地
- 修改wsdl文档的部分内容:
将 <s:element ref="s:schema" /><s:any /> 替换成
<s:any minOccurs="2" maxOccurs="2"/>
备注: 这个是Java调用net的webservice都有的问题
5.4. 使用CXF开发web service
EndPoint: 加入cxf的jar包即可,其它不需要改动
Client: 加入cxf的jar包即可,使用cxf的 wsdl2java 命令生成代码(加入path)
D:\javaeclipsWorkSpace\javaeeProject\webService_01_cxf_client3\src>wsdl2java D:\javaeclipsWorkSpace\javaeeProject\webService_01_cxf_client3\hellows.wsdl
wsdl2java 异常说明:
G:\myeclipseworkspace\WS-client\src>wsdl2java http://192.168.1.4/server?wsdl
Exception in thread "main" java.lang.AssertionError: org.xml.sax.SAXParseExcepti
on; systemId: jar:file:/F:/apache-cxf-3.0.0/lib/jaxb-xjc-2.2.7.jar!/com/sun/tool
s/xjc/reader/xmlschema/bindinfo/binding.xsd; lineNumber: 52; columnNumber: 88; s
chema_reference: 由于 accessExternalSchema 属性设置的限制而不允许 'file' 访问,
因此无法读取方案文档 'xjc.xsd'。
原因: Cxf 和 jdk的版本不匹配 .
微博文章: http://blog.csdn.net/yajun0628/article/details/74458351