-------------------------------------------PS:这个WebService 服务必须一直开着,关闭就没法访问了
Web Service 教程
一、webservice介绍
1.使用场景
- 不同的移动客户端访问
- 需要访问第三方的项目
2.访问第三方应用的方式
ISO的七层模型 : 物理层、数据链路层、网络层、传输层、表示层、会话层、应用层
- Socket访问 : Socket属于传输层,它是对Tcp/ip协议的实现,包含TCP/UDP,它是所有通信协议
的基础,Http协议需要Socket支持,以Socket作为基础
Socket通信特点:
1. 开启端口,该通信是 长连接的通信 ,很容易被防火墙拦截,可以通过心跳机制
来实现 ,开发难度片段
2. 传输的数据一般是字符串 ,可读性不强
lj|16|1|60|up
3. socket端口不便于推广
http:17.23.23.2:2345 www.jd.com www.360buy.com
4. 性能相对于其他的通信协议是最优的
- Http协议访问 :属于应用层的协议,对Socket进行了封装
1. 跨平台
2. 传数据不够友好 :
get请求: http://127.0.0.1:8888?username=lj&pwd=1234
3. 对第三方应用提供的服务,希望对外暴露服务接口
问题:
1. 数据封装不够友好 :可以用xml封装数据
2. 希望给第三方应用提供web方式的服务 (http + xml) = web Service
- Webservice
1.webService介绍
2.webservice的规则
- xml
- soap :(simple object access 协议) :简单对象访问协议
- wsdl : webservice描述语言 ,它也是xml实现的
3.webservice的优点
4.webservice专业名称
1. xml
2. wsdl
3. soap
二、调用第三方的WS服务
1.体验webservice www.webxml.com.cn
2.准备客户端,调用第三方的webservice服务,让本项目有手机查号的功能
- 一般访问方式 HttpClient
1. Http-GET //Soap 1.2不带支持低版本 所以一本用soap 1.1
2. Http-Post
3. Soap (http+xml)
问题:1. 如何解析结果
2. 如何传递对象参数
- 推荐的访问方式
在jdk 1.6 版本以后 ,通过jax-ws 包提供对webservice的支持
- 该方式通过注解的方式来声明webservice
- 通过 jdk EndPoint.publish()发布webserive服务
早期的版本 : jax-rpc (remote produce call)
webservice 纳入 w3c规范,其他的平台都支持该规范 :JEE\Php\.NET
都支持wsimport 方式 : 对远程的webservice生成本地代理,再通过本地代理
来访问webservice!!!!!!!
- wsimport 命令的位置:
C:\Program Files\Java\jdk1.7.0_04\bin
- 要求:
1. jdk的 版本要在 jdk 1.6.21及以上
2. 操作系统安装的jdk版本 与 MyEclispe 及 默认指定的版本要一致
- wsimport使用:
记得设置jdk\bin 环境变量 指定path
语法 wsimport [opations] <wsdl_uri>
- wsdl_uri:wsdl 的统一资源标识符
- d :指定要输出的文件的位置
- s :表示要解析java的源码 ,默认解析出的是class字节码
- p : 指定输出的包名
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.调用webService:不论是php,.net 、java 都会使用本地代理
2. Java 使用的是
wsimport -s ./ -p cn.it.ws.c http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL 获取服务然后调用
-----------------------------------------------------------发布WebService----------------------------------------------------------------------------------------
PS:WebService 是的发布是Java JDK中的一种,SE中的一种
PS:如果多次指定报错,就要这样添加注释
package bee.test; import javax.jws.WebMethod; import bee.model.Phone; public static void main(String[] args) { |
三、自定义及发布一个webservice服务
- 声明 某个业务服务为webservice服务
通过@webservice 注解来声明
- 发布webservice服务
Endpoint.publish()发布
- 通过wsimport生成本地代理来访问自己发布的webservice
wsimport
四、webservice传输实体对象
五、练习:
1. 调用教师机的ws服务
步骤:
1. 系统jdk环境与myeclipse jdk 环境一致 ,1.6.021以上
2. 知道服务端的WDSL路径
http://192.168.114.10:8888/ws/phoneService?WSDL
3. 命令行 wsimport -s ./ -p cn.itcast.ws.d http://192.168.114.10:8888/ws/phoneService?WSDL
4. 导入通过wsimport 解析的java类,再编写一个main测试
MoblieOsInfoService ws=new MoblieOsInfoService();
MoblieOsInfo phoneServicePort = ws.getMoblieOsInfoPort()
PhoneOs phone=phoneServicePort.getMobileOsInfo("android");
2. 创建自己的ws服务并发布、调用
步骤: 1.声明webservice服务 (@webService)2. 发布webservice(EndPoint.publish) 3. 客户端访问(wsimport)
1. 创建一个要通过webservice对外发布的java bean : PhoneService
2. 在java 的入口main方法 通过EndPoint 发布一个服务端点
String address1="http://192.168.19.10:8888/ws/phoneService";
Endpoint.publish(address1, new PhoneService());
System.out.println("adrress1的WSDL地址"+address1+"?WSDL");
六、WSDL文件介绍 :webservice服务说明
七、通过注解配置修改wsdl文件, 让它具有更好的可读性
需求:
1. 想改方法的输入参数名、返回参数名
2. 想改服务名,方法名
3. 对该业务类的某些方法不想对外发布
- 默认只有public 修饰的方法会以webservice的形式对外发布
而 private 受保护的,缺省的,都不会发布
- 某些public 方法也不想对外发布
实现:注解配置修改wsdl文件
重点:
1. webservice 的作用、规则、优点
2. 专业名词
wsdl 、 soap 、 xml
3. wsimport 生成本地代理
4. 通过JEE方式声明与发布webservice
- 声明 :@webservice
- 发布 :EndPoint
5. WSDL文件描述
6. 通过修改注解,配置wsdl文件,增强可读性
-------------------------------------------------------------------------------------------------------------------------------------------
通过Jdk
声明 :@Webservice
发布 :EndPoint
不足: 希望tomcat启动时,webservice服务能够开启 ,最好与Spring集成
希望有一个webservice的服务列表
通过Webservice框架来实现 :axis2 、xfire
四、使用CXF框架,发布webservice服务,并使用客户端远程访问webservice
1. CXF介绍 :soa的框架
* cxf 是 Celtrix (ESB框架)和 XFire(webserivice) 合并而成,并且捐给了apache
* CxF的核心是org.apache.cxf.Bus(总线),类似于Spring的 ApplicationContext
* CXF默认是依赖于Spring的
* Apache CXF 发行包中的jar,如果全部放到lib中,需要 JDK1.6 及以上,否则会报JAX-WS版本不一致的问题
* CXF 内置了Jetty服务器 ,它是servlet容器,好比tomcat
2.CXF特点
1. 与Spring、Servlet做了无缝对接,cxf框架里面集成了Servlet容器Jetty
2. 支持注解的方式来发布webservice
3. 能够显示一个webservice的服务列表
4. 能够添加拦截器:输入拦截器、输出拦截器 :
输入日志信息拦截器、输出日志拦截器、用户权限认证的拦截器
---------------------------------------------WebService传输时xml, RestFul是传输json---------------------------------------------------------------
PS:打Jar 包
五、Spring+CXF整合来管理webservice
/**通过cxf框架发布webservice Inbound Message public static void main(String[] args) { bean.create();//创建,发布webservice |
实现步骤:
1. 添加cxf.jar 包(集成了Spring.jar、servlet.jar ),spring.jar包 ,servlet.jar 包
2. 编写业务类,通过CXF来发布webservice
员工管理:
方法 :添加员工、查询员工
3. 添加一个CXF请求的 Servlet,用来处理webservice的请求
过滤的地址/ws/*
4. 配置Spring的配置文件: applicationContext.xml ,把cxf的bean在spring配置
5. 在web.xml中配置 CXF的 Servlet , 添加spring的监听
6. 通过wsimport生成本地代理 ,访问webservice
六、 练习:
Spring与CXF整合
- 添加 cxf.jar、添加Spring框架、Servlet.jar包
- web.xml 配置
1. 配置CXF的Servlet,用来处理所有 webservice请求
配置Servlet
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<url-pattern>/ws/*</url-pattern>
2. 加载spring监听器
- 业务类,通过cxf发布的webservice的业务bean
员工管理webservice服务
1. 添加员工
2. 查询所有员工
3. 通过List<Employee> 来保存员工
- spring 配置文件配置bean
配置cxf
- 客户端访问
测试
1.web.xml
2. 就这两个就可以了,Tomcat启动的时候服务就布上去了
--------------------------------------------------------------------------------------------------------
七、webservice测试工具
web service exprlorer
八、soap1.1与soap1.2区别
- Soa :面向服务的架构,它是一种思想
service 1、service2 、service3 所有服务面向web,即插即用
IBM大力提倡Soa架构 ,希望以组装电脑的方式来开发软件
- 提供各种服务的组件(webservice):硬盘、cpu 、内存条
- 企业服务总线 (Enterprise service bus):主板