2种实现CXF方法例子
转载自:http://www.blogjava.net/sai5201314vicky/articles/353078.html
大家好,今天我要介绍的现实webservice的一种技术——CXF
由于本人是一个菜鸟,所以下面所做的都是一些简单的小例子!希望能帮到有需要的同学!好了,废话就不多说了,直接进入正题!
开发环境:myeclipse8.5 + tomcat6.0 + jdk1.6
CXF版本:apache-cxf-2.3.5.zip(在这里介绍一个下载包的网址给大家:http://www.jar114.com)
把apache-cxf-2.3.5.zip解压出来后,如下图所示目录:(不做解析了)

下面所作的小例子都用到lib文件夹下面的包(不介意的话就全部加进项目里)!
新建一web项目,名称叫HelloWorldCXF
建一包:com.cxf.dao,在该包下新建一接口,命名为:HelloWorld,代码如下:
package com.cxf.dao;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
public String sayHello(String username);
}
建一包:com.cxf.service,在该包下新建一个类,命名为:HelloWorldImpl,代码如下:
package com.cxf.service;
import javax.jws.WebService;
import com.cxf.dao.HelloWorld;
@WebService
public class HelloWorldImpl implements HelloWorld {
public String sayHello(String username) {
System.out.println("say hello is called!");
return "Hello" + username;
}
}
新建一测试包:com.cxf.action,在该包下建一个类,类名为:HelloTest,代码如下:
package com.cxf.action;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import com.cxf.service.HelloWorldImpl;
public class HelloTest {
public static void main(String[] args) {
JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();
// Web服务的地址
factoryBean.setAddress("http://localhost:8081/hello");
// Web服务对象调用接口
factoryBean.setServiceClass(HelloWorldImpl.class);
Server server = factoryBean.create();
server.start();
}
}
执行代码后,在浏览器打开:http://localhost:8081/hello?wsdl 能如下显示的,证明服务器已经发布成功!

新建一web项目,名称叫HelloWorldCXFClient
新建一个包,这个包的名称和服务器包的名称一样的:com.cxf.dao,里面的接口和方法也必须和服务器的一样:
package com.cxf.dao;
import javax.jws.WebService;
@WebService
public interface Hello {
//这里的接口方法必须跟服务器接口里面的方法一致
public String sayHello(String username);
}
新建一个测试类:代码如下
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import com.cxf.dao.Hello;
public class ClientTest {
public static void main(String []trgs){
JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
//获取服务器端
factoryBean.setAddress("http://localhost:8081/hello");
//通过客户端的接口获取服务器端的接口
factoryBean.setServiceClass(Hello.class);
Hello hello =(Hello) factoryBean.create();
System.out.println(hello.sayHello("和谐dota"));
}
}
执行代码,控制台能打印出:Hello和谐dota!
到这,一个完整的CXF小例子就完成了!
不知道大家有没有注意到,上面的接口和现实类都存在有一个标签:@WebService
这个标签的作用是:指明接口是Web 服务
当然你也可以不用这个方式去实现,直接用手动的去进行指明也是可以的!!下面就是用手动这种方式现实功能的,希望大家能找出这2个方法的不同之处!
新建一web项目,名称叫HelloWorldCXF
建一包:com.cxf.dao,在该包下新建一接口,命名为:HelloWorld,代码如下:
package com.cxf.dao;
import javax.jws.WebService;
public interface HelloWorld {
public String sayHello(String username);
}
建一包:com.cxf.service,在该包下新建一个类,命名为:HelloWorldImpl,代码如下:
package com.cxf.service;
import javax.jws.WebService;
import com.cxf.dao.HelloWorld;
public class HelloWorldImpl implements HelloWorld {
public String sayHello(String username) {
System.out.println("say hello is called!");
return "Hello" + username;
}
}
新建一测试包:com.cxf.action,在该包下建一个类,类名为:HelloTest,代码如下:
package com.cxf.action;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import com.cxf.service.HelloWorldImpl;
public class HelloTest {
public static void main(String[] args) {
//发布服务器
ServerFactoryBean factoryBean = new ServerFactoryBean();
// 获取Web服务的地址
factoryBean.setAddress("http://localhost:8080/hello");
// Web服务对象调用接口
factoryBean.setServiceClass(Hello.class);
// Web服务对象调用实现接口类
HelloImpl hello = new HelloImpl();
factoryBean.setServiceBean(hello);
// 发布web服务器
factoryBean.create();
}
}
执行代码后,在浏览器打开:http://localhost:8081/hello?wsdl 能如下显示的,证明服务器已经发布成功!

新建一web项目,名称叫HelloWorldCXFClient
新建一个包,这个包的名称和服务器包的名称一样的:com.cxf.dao,里面的接口和方法也必须和服务器的一样:
package com.cxf.dao;
import javax.jws.WebService;
public interface Hello {
//这里的接口方法必须跟服务器接口里面的方法一致
public String sayHello(String username);
}
新建一个测试类:代码如下
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import com.cxf.dao.Hello;
public class ClientTest {
public static void main(String []trgs){
//客户端对象
ClientProxyFactoryBean factoryBean = new ClientProxyFactoryBean();
//获取服务器端
factoryBean.setAddress("http://localhost:8080/hello");
//通过客户端的接口获取服务器端的接口
factoryBean.setServiceClass(Hello.class);
Hello hello ;
hello =(Hello) factoryBean.create();
System.out.println(hello.sayHello("和谐dota"));
}
}
执行代码,控制台能打印出:Hello和谐dota!
到这,就完成了现实CXF的2种不同方法!!接下来和大家一起完成CXF整合Spring的小例子!
2种实现CXF方法例子的更多相关文章
- java 23种设计模式及具体例子 收藏有时间慢慢看
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代 码可靠性. 毫无疑问,设计模式 ...
- 24种设计模式--模版方法模式【Template Method Pattern】
周三,9:00,我刚刚坐到位置,打开电脑准备开始干活.“小三,小三,叫一下其它同事,到会议室,开会”老大跑过来吼,带着淫笑.还不等大家坐稳,老大就开讲了,“告诉大家一个好消息,昨天终于把牛叉模型公司的 ...
- Scrapy里Selectors 四种基础的方法
在Scrapy里面,Selectors 有四种基础的方法xpath():返回一系列的selectors,每一个select表示一个xpath参数表达式选择的节点css():返回一系列的selector ...
- .Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) 通过MVC控制器导出导入Excel文件(可用于java SSH架构)
.Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) [原文地址] 通过MVC控制器导出导入Excel文件(可用于java SSH架构) public cl ...
- .NET中常用的几种解析JSON方法
一.基本概念 json是什么? JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是一种轻量级的数据交换格式,是存储和交换文本信息的语法. ...
- IOS开发-几种截屏方法
IOS开发-几种截屏方法 1. UIGraphicsBeginImageContextWithOptions(pageView.page.bounds.size, YES, zoomSc ...
- C语言的几种取整方法
C语言的几种取整方法 来源:http://blog.sina.com.cn/s/blog_4c0cb1c001013ha9.html 1.直接赋值给整数变量.如: int i = 2.5; 或 i = ...
- VB几种函数参数传递方法,Variant,数组,Optional,ParamArray
VB几种函数参数传递方法,Variant,数组,Optional,ParamArray 一) 过程的参数被缺省为具有 Variant 数据类型. 1)ByRef按 地址传递参数在 VB 中是缺省的 按 ...
- iOS中常用的四种数据持久化方法简介
iOS中常用的四种数据持久化方法简介 iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data 1.属性列表涉及到的主要类:NSUserDefaults,一般 ...
随机推荐
- Discuz常见小问题2-如何在新建的页面上只显示一部分板块
切换到论坛-版块管理,记住要只显示的板块的gid(比如我的是36) 为某个主导航设置一个单独的php页面(名字自己取) 如果这个页面内容跟首页forum.php完全一样,只是第三行增加了一句话 ...
- CF无法全屏怎么办
方法1:把桌面的分辨率调成800X600,然后运行CF就全屏了,接着再退出游戏,把桌面重新调回原来的分辨率. 方法2:在运行中输入regedit.可以打开打开注册表编辑器,定位到HKEY_LOCAL_ ...
- 从word中导出图片
想把word里面的图片导出来,可以这么操作: 1.右键word里面的图片,复制 2.打开电脑的画图工具,粘贴,然后保存
- Ubuntu 下安装adobe reader
ctrl+alt+t打开终端 wget ftp://ftp.adobe.com/pub/adobe/reader/unix/9.x/9.5.5/enu/AdbeRdr9.5.5-1_i386linux ...
- vue - 实例事件
1.$on(在构造器外部添加事件) 2.$once(执行一次的事件) 3.$off(关闭事件) 4.$emit(事件调用) <!DOCTYPE html> <html lang=&q ...
- 一步一步学Spring.NET——1、Spring.NET环境准备
Spring.NET 1.3.2下载地址:http://down.51cto.com/data/861700 下载后解压 Spring.NET-1.3.2.7z:这个里面有我们须要用到的全部东西. S ...
- hp-ux 集群,内存 小记
-----查看hp 集群状态信息 # cmviewcl -v CLUSTER STATUS dbsvr up NODE ...
- POJ2406-Power Strings(kmp循环节)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 31111 Accepted: 12982 D ...
- Drupal所能够理解的资源
Drupal能够识别哪些资源类型? profile,不知道怎么翻译,应该是指安装类型,固定地存放于profiles目录下. module,模块,可以存在于多个目录下:modules.profiles/ ...
- Python中给文件加锁
首先要引入库import fcntl打开一个文件f = open('./test')对该文件加密:fcntl.flock(f, fcntl.LOCK_EX)这样就对文件test加锁了,如果有其他进程要 ...