一、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开发的基本流程的更多相关文章

  1. 基于CXF开发crm服务

    1 基于CXF开发crm服务 1.1 数据库环境搭建 1.2 web项目环境搭建 第一步:创建动态web项目 第二步:导入CXF相关jar包 第三步:配置web.xml <context-par ...

  2. 基于cxf开发的WebService

    Node.jshttps://www.cnblogs.com/goldlong/p/8027997.htmlQQ音乐apihttps://juejin.im/post/5a35228e51882506 ...

  3. 基于cxf开发restful风格的Web Service

    一.写在前面 webservice一些简单的其他用法和概念,就不在这里赘述了,相信大家都可以在网上查到,我也是一个新手,写这篇文章的目的一方面是想记录自己成长的历程,另一方面是因为学习这个的时候花了点 ...

  4. JAVAEE——BOS物流项目07:WebService入门、apache CXF入门、基于CXF发布CRM服务

    1 学习计划 1.WebService入门 n 什么是WebService n 调用网络上的WebService服务 n SOAP和WSDL概念 n 基于JDK1.7发布一个简单的WebService ...

  5. 开发基于CXF的 RESTful WebService web 项目 webservice发布

    配置步骤 开发基于CXF的 RESTful WebService 1.创建Web项目并导入CXF的jar 2.在Web.xml中配置 CXFServlet <servlet> <se ...

  6. 【转】构建基于CXF的WebService服务

    构建基于CXF的WebService服务 Apache CXF = Celtix+ XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF.C ...

  7. 使用CXF开发JAX-WS类型的WebService

    使用CXF记得要先加入CXF的jar包 方法1: Cxf编程实现: l 使用jaxwsServerFactoryBean发布 webservice服务端. 需要设置: jaxwsServerFacto ...

  8. 用cxf开发restful风格的WebService

    我们都知道cxf还可以开发restful风格的webService,下面是利用maven+spring4+cxf搭建webService服务端和客户端Demo 1.pom.xml <projec ...

  9. struts1+spring+myeclipse +cxf 开发webservice以及普通java应用调用webservice的实例

    Cxf + Spring+ myeclipse+ cxf 进行  Webservice服务端开发 使用Cxf开发webservice的服务端项目结构 Spring配置文件applicationCont ...

随机推荐

  1. POJ 2586 贪心+枚举

    Y2K Accounting Bug Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15626   Accepted: 78 ...

  2. Codeforces Round #462 (Div. 2) D. A Determined Cleanup

    D. A Determined Cleanup time limit per test1 second memory limit per test256 megabytes Problem Descr ...

  3. collections模块简介

    collections模块简介 除python提供的内置数据类型(int.float.str.list.tuple.dict)外,collections模块还提供了其他数据类型,使用如下功能需先导入c ...

  4. Android设为系统默认的短信应用

    要设为系统默认的短信应用首先要配置一下AndroidManifest.xml文件,添加下列: <!-- BroadcastReceiver that listens for incoming S ...

  5. LOJ #6008. 「网络流 24 题」餐巾计划

    #6008. 「网络流 24 题」餐巾计划 题目描述 一个餐厅在相继的 n nn 天里,每天需用的餐巾数不尽相同.假设第 i ii 天需要 ri r_ir​i​​ 块餐巾.餐厅可以购买新的餐巾,每块餐 ...

  6. Android stadio litepal

    今天看到技术交流群里有人招聘Android,要求会litepal. 我立马百度了下.嗯,我的学习技术的精神,是值得称赞的. litepal就是操作数据库的一个框架.git地址: https://git ...

  7. Python中bisect的使用方法

    Python中列表(list)的实现其实是一个数组,当要查找某一个元素的时候时间复杂度是O(n),使用list.index()方法,但是随着数据量的上升,list.index()的性能也逐步下降,所以 ...

  8. 【Luogu P1120】小木棍

    题目: 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过$50$.现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度.给出每段小木棍的长度,编程 ...

  9. Python-S9——Day84-ORM项目实战之权限、form以及modelform

    01 权限菜单显示 02 Django路径的自动添加问题 03 原生form实现增删改查 04 modelform实现增删改查 01 权限菜单显示 1.1 优先查找项目中的templates,如果没有 ...

  10. 区分Activity的四种加载模式【转载】

    此文为转载,文章来源:http://marshal.easymorse.com/archives/2950 文章作者:   Marshal's Blog 参考文章:http://blog.csdn.n ...