转载自: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方法例子的更多相关文章

  1. java 23种设计模式及具体例子 收藏有时间慢慢看

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代 码可靠性. 毫无疑问,设计模式 ...

  2. 24种设计模式--模版方法模式【Template Method Pattern】

    周三,9:00,我刚刚坐到位置,打开电脑准备开始干活.“小三,小三,叫一下其它同事,到会议室,开会”老大跑过来吼,带着淫笑.还不等大家坐稳,老大就开讲了,“告诉大家一个好消息,昨天终于把牛叉模型公司的 ...

  3. Scrapy里Selectors 四种基础的方法

    在Scrapy里面,Selectors 有四种基础的方法xpath():返回一系列的selectors,每一个select表示一个xpath参数表达式选择的节点css():返回一系列的selector ...

  4. .Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) 通过MVC控制器导出导入Excel文件(可用于java SSH架构)

    .Net MVC  导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) [原文地址] 通过MVC控制器导出导入Excel文件(可用于java SSH架构)   public cl ...

  5. .NET中常用的几种解析JSON方法

    一.基本概念 json是什么? JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是一种轻量级的数据交换格式,是存储和交换文本信息的语法. ...

  6. IOS开发-几种截屏方法

    IOS开发-几种截屏方法 1.        UIGraphicsBeginImageContextWithOptions(pageView.page.bounds.size, YES, zoomSc ...

  7. C语言的几种取整方法

    C语言的几种取整方法 来源:http://blog.sina.com.cn/s/blog_4c0cb1c001013ha9.html 1.直接赋值给整数变量.如: int i = 2.5; 或 i = ...

  8. VB几种函数参数传递方法,Variant,数组,Optional,ParamArray

    VB几种函数参数传递方法,Variant,数组,Optional,ParamArray 一) 过程的参数被缺省为具有 Variant 数据类型. 1)ByRef按 地址传递参数在 VB 中是缺省的 按 ...

  9. iOS中常用的四种数据持久化方法简介

    iOS中常用的四种数据持久化方法简介 iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data 1.属性列表涉及到的主要类:NSUserDefaults,一般 ...

随机推荐

  1. 理解Vue的计算属性

    计算属性是一个很邪门的东西,只要在它的函数里引用了 data 中的某个属性,当这个属性发生变化时,函数仿佛可以嗅探到这个变化,并自动重新执行. 上述代码会源源不断的打印出 b 的值.如果希望 a 依赖 ...

  2. LeetCode56:Jump Game

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  3. Azkaban配置

    1,新建azkaban目录,用于安置azkaban程序 2,azkaban web服务器安装  解压 azkaban-web-server-2.5.0.tar.gz tar -zvxf azkaban ...

  4. os.waitpid()无法获取sys.exit()退出时的status code

    [目的] 父进程使用os.waitpid()等待子进程退出,并检测子进程的exit code,以决定是否重启子进程. (常见的应用场景是:子进程接收外部命令,收到"stop"时退出 ...

  5. 使用two.js生成的卫星环绕动画效果

    来源:GBin1.com two.js是一个帮助你实现绘图和动画效果的类库,同时支持三种前端绘图实现: webgl svg 2d画布 使用这个类库,可以方便的支持这三种不同的实现,你只需要设置参数:T ...

  6. 如何使用Apache设置404页面

    方法一:[.htaccess文件配置404] 网上大部分解决办法是:首先你要开启Apache的rewrite_module模块,支持.htaccess,然后在网站根目录建立.htaccess文件(或已 ...

  7. asp.net页面生命周期之页面的终结阶段

    处理过回发事件之后,页面便为浏览器生成输出做好了准备.呈现阶段分为两部分:预呈现和标记生成.预呈现这个子阶段有两个事件表征,分别为:预处理和投递处理. PreRender事件 通过处理该事件,页面和控 ...

  8. C#秘密武器之特性

    一.概述 Attribute说白了就是一个类而已,里边一般含有一些附加信息,或者一些特殊的处理逻辑,以便告诉编译器应用该特性的东东是个奇葩,需要特殊对待! 二.使用时的注意事项 2.1. Attrib ...

  9. Android Freeline加速编译App方案 使用和总结

    Freeline简单介绍 在Android Studio还没推出Instant Run功能之前,每次改动Android project项目时都要将整个项目又一次编译一次,然后再将资源和代码文件打包成A ...

  10. 我的Go语言学习之旅二:入门初体验 Hello World

    好吧,全部的程序猿们都已经习惯了.学习不论什么一门语言,我们都会以Hello World实例開始我们的学习,我也不例外.先来一个简单的样例 打开编辑器 (能够用记事本,我已经习惯 Notepad++了 ...