一、说明:

前面介绍了使用axis2来发布Webservice服务,现在介绍一种更popular,更高效的Webservice服务发布技术:CXF

Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。目前它仍只是 Apache 的一个孵化项目。

Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成。

CXF 框架是一种基于 Servlet 技术的 SOA 应用开发框架,要正常运行基于 CXF 应用框架开发的企业应用,除了 CXF 框架本身之外,还需要 JDK 和 Servlet 容器的支持。

二、利用CXF进行简单webservice服务的发布与调用

①.  新建一个Java Project  ,CXFDemo ,并在工程下新建lib文件夹,加入CXF的jar包:

cxf-core-3.1.4.jar
jaxb-core-2.2.11.jar
jaxb-impl-2.2.11.jar
neethi-3.0.3.jar
wsdl4j-1.6.3.jar
xmlschema-core-2.2.1.jar

然后build path ,将架包加入到类路径下。

②.  在src下,新建3个package ,并分别在各个包下创建对应的相关接口和类:

com.elgin.cxf.entities
com.elgin.cxf.service
com.elgin.cxf.service.impl

❶、在service包下新建接口  HelloService

package com.elgin.cxf.service;

import javax.jws.WebParam;
import javax.jws.WebService; import com.elgin.cxf.entities.User; @WebService
public interface HelloService { public String sayHello(@WebParam(name="text")String text); public String sayHellloToUser(User user);
}

❷、在service.impl 包下新建接口的实现类 HelloServiceImpl

package com.elgin.cxf.service.impl;

import javax.jws.WebService;

import com.elgin.cxf.entities.User;
import com.elgin.cxf.service.HelloService; @WebService(endpointInterface="com.elgin.cxf.service.HelloService",serviceName="HelloService")
public class HelloServiceImpl implements HelloService { @Override
public String sayHello(String text) {
System.out.println("param text is :" + text);
return "hello " + text;
} @Override
public String sayHellloToUser(User user) {
System.out.println("param user is :" +user);
return "hello " + user.getName();
} }

❸、entities包下新建用到的User类:

package com.elgin.cxf.entities;

public class User {
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public User(){} public User(String name) {
super();
this.name = name;
} @Override
public String toString() {
return "User [name=" + name + "]";
} }

③.  新建package  :com.elgin.cxf.publish

并在此包下新建类: Server  用来发布webservice服务:

package com.elgin.cxf.publish;

import javax.xml.ws.Endpoint;

import com.elgin.cxf.service.impl.HelloServiceImpl;

public class Server {
public static void main(String[] args) {
System.out.println("cxf service start..");
HelloServiceImpl serviceImpl=new HelloServiceImpl();
String address="http://localhost:8080/service/hello";
Endpoint.publish(address, serviceImpl);
}
}

④  运行查看发布情况:

在浏览器输入:http://localhost:8080/service/hello?wsdl ,出现下图所示数据,表示发布webservice服务成功

⑤ 服务调用代码以及结果:

package com.elgin.cxf.client;

import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.soap.SOAPBinding; import com.elgin.cxf.entities.User;
import com.elgin.cxf.service.HelloService; public class Client {
private static final QName SERVICE_NAME
= new QName("http://impl.service.cxf.elgin.com/", "HelloService");
private static final QName PORT_NAME
= new QName("http://impl.service.cxf.elgin.com/", "HelloServicePort"); private Client() {} public static void main(String args[]) throws Exception {
rightInvoker();
exceptionInvoker();
} /*
* @Title: rightInvoker
* @Description: 可成功调用,返回正确的结果
* @throws Exception 参数
*/
public static void rightInvoker() throws Exception {
// Endpoint Address
String endpointAddress = "http://localhost:8080/service/hello";
URL url=new URL(endpointAddress);
Service service = Service.create(url,SERVICE_NAME); HelloService hs = service.getPort(HelloService.class);
System.out.println(hs.sayHello("World")); User user = new User("Jack");
System.out.println(hs.sayHellloToUser(user));
} /*
* @Title: exceptionInvoker
* @Description: 调用时出现异常错误信息:
*
* Exception in thread "main" javax.xml.ws.WebServiceException:
* WSDL Metadata not available to create the proxy,
* either Service instance or ServiceEndpointInterface com.elgin.cxf.service.HelloService should have WSDL information
*
* 对于造成上述异常的具体原因尚不明确,很有可能是缺少CXF某个jar包引起
*/
public static void exceptionInvoker(){
// Endpoint Address
Service service = Service.create(SERVICE_NAME);
String endpointAddress = "http://localhost:8080/service/hello";
service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);
HelloService hs = service.getPort(HelloService.class);
System.out.println(hs.sayHello("World")); User user = new User("Jack");
System.out.println(hs.sayHellloToUser(user));
}
}

正确运行结果:

hello World
hello Jack

使用CXF发布WebService服务简单实例的更多相关文章

  1. CXF发布webService服务以及客户端调用

    这篇随笔内容是CXF发布webService服务以及客户端调用的方法 CXF是什么? 开发工作之前需要下载CXF和安装 下载地址:http://cxf.apache.org 安装过程: <1&g ...

  2. cxf发布 webservice服务

    导包 antlr-2.7.7.jar aopalliance-1.0.jar asm-3.3.jar commons-collections-3.2.1.jar commons-lang-2.6.ja ...

  3. 使用CXF发布webservice服务及注意要点

    一.概念 1.什么是webservice Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用 ...

  4. JAVA项目中公布WebService服务——简单实例

    1.在Java项目中公布一个WebService服务: 怎样公布? --JDK1.6中JAX-WS规范定义了怎样公布一个WebService服务. (1)用jdk1.6.0_21以后的版本号公布. ( ...

  5. 使用Cxf发布Webservice服务,如果待发布的接口中有重载方法,怎么处理??

    使用 @WebMethod(operationName="multiParamByName")  重新指定名字. http://bbs.csdn.net/topics/270059 ...

  6. Spring整合CXF之发布WebService服务

    今天我们来讲下如何用Spring来整合CXF,来发布WebService服务: 给下官方文档地址:http://cxf.apache.org/docs/writing-a-service-with-s ...

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

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

  8. 使用CXF框架,发布webservice服务,并使用客户端远程访问webservice

    使用CXF框架,发布webservice服务,并使用客户端远程访问webservice  1. CXF介绍 :soa的框架    * cxf 是 Celtrix (ESB框架)和 XFire(webs ...

  9. [置顶] 利用CXF发布webService的小demo

    其实webService的发布不仅仅只有xfire,今天,给大家介绍一下用CXF发布一个webService的小demo,CXF也是我做webService用的第一个框架... 先将相关的jar引进来 ...

随机推荐

  1. jQuery 动画 _animate() 方法

    一.jQuery animate() 方法用于创建自定义动画. 必需的 params 参数定义形成动画的 CSS 属性. 可选的 speed 参数规定效果的时长.它可以取以下值:"slow& ...

  2. R语言中strptime返回值永远为NA的问题

    调用前加上以下代码,即可解决 Sys.setlocale("LC_TIME", "C");

  3. Qt环境搭建(Visual Studio)

    简述 经常有人问我编写Qt程序时使用什么IDE,其实这个真的很难回答(各有所长),只能说看个人爱好了,因为我两个都用,而且两个都很喜欢(比较多情吧O(∩_∩)O~)! 下面将进行Qt Creator与 ...

  4. HDU 3951 (博弈) Coin Game

    先考虑两种简单的情况: 如果先手能一次把硬币拿完,即 k >= n ,那么先手胜 如果每次只能拿一个硬币, 即 k = 1 ,那么如果有奇数个硬币先手胜,如果有偶数个硬币后手胜. 剩下的情况就是 ...

  5. UVa 10891 (博弈+DP) Game of Sum

    最开始的时候思路就想错了,就不说错误的思路了. 因为这n个数的总和是一定的,所以在取数的时候不是让自己尽可能拿的最多,而是让对方尽量取得最少. 记忆化搜索(时间复杂度O(n3)): d(i, j)表示 ...

  6. poj 3694 pku 3694 Network tarjan求割边 lca

    题意:给你一个连通图,然后再给你n个询问,每个询问给一个点u,v表示加上u,v之后又多少个桥.一个最容易想到的办法就是先加边找桥,加边找桥,这样可定超时.那么就可以缩点,因为如果一条边不是桥那么无论怎 ...

  7. HDU 1372 Knight Moves【BFS】

    题意:给出8*8的棋盘,给出起点和终点,问最少走几步到达终点. 因为骑士的走法和马的走法是一样的,走日字形(四个象限的横竖的日字形) 另外字母转换成坐标的时候仔细一点(因为这个WA了两次---@_@) ...

  8. IOS中用UIFont返回字体的行高、动态改变tableView中Cell的高度

    一.动态改变Cell的高度 1.利用tableView代理方法的返回值决定每一行cell的高度 - (CGFloat)tableView:(UITableView *)tableView height ...

  9. struts2拦截器配置;拦截器栈;配置默认拦截器;拦截方法的拦截器MethodFilterInterceptor;完成登录验证

    struts2.xml 内容 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...

  10. phonegap 清空页面缓存

    访问页面添加 <meta HTTP-EQUIV="pragma" CONTENT="no-cache"> <meta HTTP-EQUIV=& ...