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("钟祥"));
    }

}
时间: 2024-08-05 12:13:25

webservice原理及基于cxf开发的基本流程的相关文章

基于CXF开发crm服务

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

基于cxf开发restful风格的Web Service

一.写在前面 webservice一些简单的其他用法和概念,就不在这里赘述了,相信大家都可以在网上查到,我也是一个新手,写这篇文章的目的一方面是想记录自己成长的历程,另一方面是因为学习这个的时候花了点时间,希望本文章能为大家节约点时间.当然描述的可能不到位,望谅解. 二.创建项目 2.1.创建公用接口project 为了方便服务端和客户端调用接口可以先创建一个接口java project,单独建一个接口project的用处后面再说. 然后导入对应jar包,可以去cxf官网下载http://cxf

028 基于CXF开发CRM服务 - bos

注意:理论上crm不应该由我们自己开发,应该有其他人开发,我们只负责调用 一.crm数据库幻境搭建 1.create database crm character set utf8 collate utf8_general_ci; 2.执行sql创建表 SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `t_customer` -- --------------------------

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

配置步骤 开发基于CXF的 RESTful WebService 1.创建Web项目并导入CXF的jar 2.在Web.xml中配置 CXFServlet <servlet> <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> </servlet> <servlet-

cxf开发基于web的webservice项目(转载)

其实开发服务端, 大体分为2种方式:一: 采用jdk给我们提供的jas-ws中的服务类来发布服务二: 采用第三方框架来开发webservice.那么为什么我们要选择第三方框架来发布一个webservice服务呢?首先, 我们开发的项目大部分都是javase项目, jdk不能用于javaee项目的开发. 并且jdk目前仅仅支持soap1.1协议. 不支持soap1.2协议 而为了客户端调用时能使用1.1协议, 也能使用1.2协议.通常我们发布的服务都是1.2协议的.下面, 就说下cxf开发服务端,

构建基于CXF的WebService服务(1)--创建HelloWorld服务

1.Apache CXF简介 Apache CXF = Celtix+ XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF.CXF 继承了 Celtix 和XFire 两大开源项目的精华,提供了对 JAX-WS全面的支持,并且提供了多种Binding .DataBinding.Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)

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

构建基于CXF的WebService服务 Apache CXF = Celtix+ XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF.CXF 继承了 Celtix 和XFire 两大开源项目的精华,提供了对 JAX-WS全面的支持,并且提供了多种Binding .DataBinding.Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL

构建基于CXF的WebService服务(3)-- 利用拦截器实现权限验证

CXF中的拦截器分为in拦截器和out拦截器,又有客户端拦截器和服务端拦截器. 拦截器使用流程:客户端(out)-> 服务端(in)->处理业务->服务端(out)->客户端(in),并不是每一步都需要拦截器.在这里我们用到的是客户端Out拦截器和服务端in拦截器.服务端in拦截器检查用户级权限,客户端out浏览器发送用户信息给服务端. 1.创建服务端验证 JaxWsServerFactoryBean或Endpoint都可以通过getInInterceptors方法,向WebSer

WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单

现在的项目中需要用到SOA概念的地方越来越多,最近我接手的一个项目中就提出了这样的业务要求,需要在.net开发的客户端系统中访问java开发的web系统,这样的业务需求自然需要通过WebService进行信息数据的操作.下面就将我们在开发中摸索的一点经验教训总结以下,以供大家参考. 我们项目的整个架构使用的比较流行的WSH MVC组合,即webwork2 + Spring + Hibernate; 1.首先集成Apacha CXF WebService 到 Spring 框架中; apache