大家好,今天我要介绍的现实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

 

到这,就完成了现实CXF2种不同方法!!接下来和大家一起完成CXF整合Spring的小例子!