webservice原理及基于cxf开发的基本流程
一、SOA和webservice
SOA(service-Oriented Architecture)是面向服务的架构,是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以使用一种统一和通用的方式进行交互。web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。web service是实现SOA架构的一种技术,XML+XSD,SOAP和WSDL就是构成WebService平台的三大技术。
1、XML+XSD:
XML是WebService平台中表示数据的格式。 WebService采用HTTP协议传输数据,采用XML格式封装数据(即XML中说明调用远程服务对象的哪个方法,传递的参数是什么,以及服务对象的返回结果是什么)除了易于建立和易于分析外,XML主要的优点在于它既是平台无关的,又是厂商无关的。
XSD(XML Schema)解决了数据数据类型的问题,例如,整形数到底代表什么?16位,32位,64位?它定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。WebService平台就是用XSD来作为其数据类型系统的。当你用某种语言(如VB.NET或C#)来构造一个Web service时,为了符合WebService标准,所有你使用的数据类型都必须被转换为XSD类型。
2、SOAP
SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML。WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP提供了标准的RPC方法来调用Web Service。 SOAP协议 = HTTP协议 + XML数据格式。
3、WSDL
WSDL是Web Service描述语言,用于描述Web Service及其函数、参数和返回值。它是WebService客户端和服务器端都能理解的标准格式。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的Web service生成WSDL文档,又能导入WSDL文档,生成调用相应WebService的代理类代码。WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,以便被人查找;2.直接告诉给客户端调用者。
二、调用webservice的本质
调用一次webservice的本质如下:
1、客户端把调用方法参数转换生成XML文档片段(SOAP消息),且该文档必须符合WSDL定义的格式;
2、通过http协议把XML文档片段传给服务器;
3、服务器接受到XML文档片段;
4、服务器解析XML文档片段,提取其中的数据;
5、服务器执行方法;
6、服务器把执行方法得到的返回值转换成符合WSDL定义的XML文档片段;
7、通过http协议把XML文档片段传输给客户端;
8、客户端接受XML文档片段;
9、客户端解析XML文档,提取其中的数据。
所以从本质上来看,要支持webservice,必须支持XML文档解析、生成以及支持网络传输。
三、基于CXF的webservice开发
(1)基本开发流程
1、服务器端
Ⅰ)开发web service业务接口,该接口用@WebService修饰;
Ⅱ)开发web service业务接口的实现类,也要用@WebService修饰;
Ⅲ)使用EndPoint类的静态方法publish()来发布web service。
2、客户端
Ⅰ)调用CXF提供的wsdl2java工具,根据WSDL文档生成相应的Java代码(任何语言实现web service都要暴露WSDL文档);
Ⅱ)找到wsdl2java所生成的类中一个继承了Service的类(该类的实例可当工厂使用);
Ⅲ)调用Service子类的实例的getXXXPort()方法,返回给远程web service的代理。
(2)使用CXF开发示例
1、下载CXF工具包apache-cxf-2.4.0,配置用户变量PATH,如D:\myeclipse\apache-cxf-2.4.0\bin;
2、服务器端:
创建一个Java project,工程名如:WS_Server
导入CXF工具包lib目录下的jar包
业务接口
package org.kfserver.ws;
import javax.jws.WebService;
@WebService
public interface PlaceIntrod {
public String getIntrod(String place);
}
业务接口实现
package org.kfserver.ws.impl; import javax.jws.WebService;
import org.kfserver.ws.PlaceIntrod; @WebService(endpointInterface="org.kfserver.ws.PlaceIntrod",serviceName="PlaceIntrodImpl")
public class PlaceIntrodImpl implements PlaceIntrod { public String getIntrod(String place) {
return "旅游"+place+",人间天堂。";
} }
发布服务
package kfs; import javax.xml.ws.Endpoint; import org.kfserver.ws.PlaceIntrod;
import org.kfserver.ws.impl.PlaceIntrodImpl; public class ServerMain { public static void main(String[] args) {
PlaceIntrod pi=new PlaceIntrodImpl();
Endpoint.publish("http://59.71.227.132/kfserver",pi);
} }
2、客户端:
创建一个Java project,工程名如:WS_Client
根据WSDL文档生成相应的Java代码:cmd->你的工程目录\src>wsdl2java http://59.71.227.132/kfserver?wsdl
通过wsdl2java生成的Service的子类如下
package org.kfserver.ws.impl; import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;
import javax.xml.ws.WebServiceFeature;
import javax.xml.ws.Service;
import org.kfserver.ws.PlaceIntrod; @WebServiceClient(name = "PlaceIntrodImpl",
wsdlLocation = "http://59.71.227.132/kfserver?wsdl",
targetNamespace = "http://impl.ws.kfserver.org/")
public class PlaceIntrodImpl extends Service { public final static URL WSDL_LOCATION; public final static QName SERVICE = new QName("http://impl.ws.kfserver.org/", "PlaceIntrodImpl");
public final static QName PlaceIntrodImplPort = new QName("http://impl.ws.kfserver.org/", "PlaceIntrodImplPort");
static {
URL url = null;
try {
url = new URL("http://59.71.227.132/kfserver?wsdl");
} catch (MalformedURLException e) {
java.util.logging.Logger.getLogger(PlaceIntrodImpl.class.getName())
.log(java.util.logging.Level.INFO,
"Can not initialize the default wsdl from {0}", "http://59.71.227.132/kfserver?wsdl");
}
WSDL_LOCATION = url;
} public PlaceIntrodImpl(URL wsdlLocation) {
super(wsdlLocation, SERVICE);
} public PlaceIntrodImpl(URL wsdlLocation, QName serviceName) {
super(wsdlLocation, serviceName);
} public PlaceIntrodImpl() {
super(WSDL_LOCATION, SERVICE);
} /**
*
* @return
* returns PlaceIntrod
*/
@WebEndpoint(name = "PlaceIntrodImplPort")
public PlaceIntrod getPlaceIntrodImplPort() {
return super.getPort(PlaceIntrodImplPort, PlaceIntrod.class);
} /**
*
* @param features
* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values.
* @return
* returns PlaceIntrod
*/
@WebEndpoint(name = "PlaceIntrodImplPort")
public PlaceIntrod getPlaceIntrodImplPort(WebServiceFeature... features) {
return super.getPort(PlaceIntrodImplPort, PlaceIntrod.class, features);
} }
客户端调用服务(PlaceIntrod pi相当于服务器端的代理)
package kfc; import org.kfserver.ws.PlaceIntrod;
import org.kfserver.ws.impl.PlaceIntrodImpl; public class ClientMain {
public static void main(String[] args) {
PlaceIntrodImpl pii=new PlaceIntrodImpl();
PlaceIntrod pi=pii.getPlaceIntrodImplPort();
System.out.println(pi.getIntrod("钟祥"));
} }
webservice原理及基于cxf开发的基本流程的更多相关文章
- 基于CXF开发crm服务
1 基于CXF开发crm服务 1.1 数据库环境搭建 1.2 web项目环境搭建 第一步:创建动态web项目 第二步:导入CXF相关jar包 第三步:配置web.xml <context-par ...
- 基于cxf开发的WebService
Node.jshttps://www.cnblogs.com/goldlong/p/8027997.htmlQQ音乐apihttps://juejin.im/post/5a35228e51882506 ...
- 基于cxf开发restful风格的Web Service
一.写在前面 webservice一些简单的其他用法和概念,就不在这里赘述了,相信大家都可以在网上查到,我也是一个新手,写这篇文章的目的一方面是想记录自己成长的历程,另一方面是因为学习这个的时候花了点 ...
- JAVAEE——BOS物流项目07:WebService入门、apache CXF入门、基于CXF发布CRM服务
1 学习计划 1.WebService入门 n 什么是WebService n 调用网络上的WebService服务 n SOAP和WSDL概念 n 基于JDK1.7发布一个简单的WebService ...
- 开发基于CXF的 RESTful WebService web 项目 webservice发布
配置步骤 开发基于CXF的 RESTful WebService 1.创建Web项目并导入CXF的jar 2.在Web.xml中配置 CXFServlet <servlet> <se ...
- 【转】构建基于CXF的WebService服务
构建基于CXF的WebService服务 Apache CXF = Celtix+ XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF.C ...
- 使用CXF开发JAX-WS类型的WebService
使用CXF记得要先加入CXF的jar包 方法1: Cxf编程实现: l 使用jaxwsServerFactoryBean发布 webservice服务端. 需要设置: jaxwsServerFacto ...
- 用cxf开发restful风格的WebService
我们都知道cxf还可以开发restful风格的webService,下面是利用maven+spring4+cxf搭建webService服务端和客户端Demo 1.pom.xml <projec ...
- struts1+spring+myeclipse +cxf 开发webservice以及普通java应用调用webservice的实例
Cxf + Spring+ myeclipse+ cxf 进行 Webservice服务端开发 使用Cxf开发webservice的服务端项目结构 Spring配置文件applicationCont ...
随机推荐
- 动态规划、记忆化搜索:HDU1978-How many ways
Problem Description 这是一个简单的生存游戏,你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的终点(n,m).游戏的规则描述如下: 1.机器人一开始在棋盘的起始点并有起始点所标 ...
- poj 3292 H-素数问题 扩展艾氏筛选法
题意:形似4n+1的被称作H-素数,两个H-素数相乘得到H-合成数.求h范围内的H-合成数个数 思路: h-素数 ...
- 关于IDEA 单元测试时 【empty test suite】异常的分析!!
IDEA功能很强大,配置很操蛋,自从用了之后掉了很多坑!!! 这几天要用单元测试,方法完好但是就是一直报empty test suite ,WTF,类找不到 在网上反复的找答案都没有合适 静下心想想, ...
- Python 拓展之特殊函数(lambda 函数,map 函数,filter 函数,reduce 函数)
写在之前 今天给大家介绍几个比较特殊的函数,他们具有函数式编程的特点,有人将它们视为 Python 可进行 "函数式编程" 的见证,至于什么是函数式编程,不是本篇文章的重点,感兴趣 ...
- Linux 基础命令、文档树 和 bash
最近发现了一个总结得更好的:bash cheatsheet 本文只是我对 linux 基础学习的一个总结,可能仅适用于复习用.算是我的 Linux 备忘录. 最基础 tab 补全 * 通配符 ctrl ...
- JavaScript: __proto__和prototype
图来源于:http://www.cnblogs.com/smoothLily/p/4745856.html 个人的理解: 1. 所有对象都有 __proto__属性,返回该对象的原型对象.例如f1由语 ...
- python技巧:拆分多层嵌套列表
方法一: >>> import itertools >>> a = [[1, 2], [3, 4], [5, 6]] >>> list(itert ...
- 函数的apply、call方法和length属性
函数的apply.call方法和length属性JavaScript为函数对象定义了两个方法:apply和call,它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数的方式有所区别:Fu ...
- 前端构建工具gulpjs的使用介绍及技巧(转)
http://www.cnblogs.com/2050/p/4198792.html gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学 ...
- Codeforeces 954C Matrix Walk
题目大意 考虑一个 $x\times y$ 的矩阵 $A_{x\times y}$ ,$A_{i,j} = (i-1)x+y$ . 从矩阵中的某个位置出发,每次可向上下左右移动一步,每到一个位置,记录 ...