一、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. 爬山算法 | Java版HA_TSP

    嗯哼,今天记录下采用Java编写的爬山算法(Hill Algorithm)求解TSP问题. 爬山算法与其他智能算法类似,是一种用来求解多峰函数最值的算法,爬山算法的基本思想是新解不劣于当前解则转移,否 ...

  2. 3 View - Request对象

    1.HttpReqeust对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象 视图函数的第一个参数是HttpRequest对象 在django.http模块中定义了Htt ...

  3. Android stadio

    Android stadio 最近遇到大问题,就是主功能行.但是让它做库工程,他就不管用. 但是在eclipse里面就可以.

  4. vue-cli 中引入 jq

    vue-cli webpack 引入jquery   今天费了一下午的劲,终于在vue-cli 生成的工程中引入了jquery,记录一下.(模板用的webpack) 首先在package.json里的 ...

  5. IOS开发学习笔记006 - 指针

    C语言 指针 简单使用如下: int *p;//定义 int a = 10; p = &a;//赋值 int * b = &a;//定义并赋值 定义格式:类型 *指针变量名: 注意事项 ...

  6. java作业8

    interface Pet{ public String getName(); public String getColor(); public int getAge(); } class Cat i ...

  7. C++ 编程笔记

    图片有点大,请耐心下载!

  8. php 备份数据库代码(生成word,excel,json,xml,sql)

    单表备份代码: 复制代码代码如下: <?php class Db { var $conn; function Db($host="localhost",$user=" ...

  9. iOS动画-扩散波纹效果

    最终效果 实现思路 动画的表现形式是颜色以及大小的变化,整体效果可以看做多个单独的波纹效果的叠加.因此我们可以创建多个CALayer,分别赋予CABasicAnimation动画,组成最终的动画效果. ...

  10. P2165 [AHOI2009]飞行棋

    题目描述 给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列. 请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形. 输入输出格式 输入格式: 第一行为 ...