1.apache网站下载CXF http://cxf.apache.org/download.html

2.创建一个java工程,将以下jar包复制到工程的classpath下

所有的jar包都可以在${CXF_HOME}\lib目录中找到

一、CXF发布webservice--HelloWorld

3.定义服务接口IHelloWorldService

因为这个接口将会被我们暴露为webservice,所以给该接口加一个@WebService标注

package com.flyfox.service;
 
import javax.jws.WebParam;
import javax.jws.WebService;
 
@WebService
public interface IHelloWorldService {
    public String sayHello(@WebParam(name = "name") String name);
}

4.提供具体的webservice提供者HelloWorldService

这个实现类实现了我们上面的服务接口,除了要添加@WebService标注外,还要定义该服务的名称serviceName="HelloWorldTest" 和endpoint(服务接口),其他和普通类没有任何区别

package com.flyfox.service;
 
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
 

@WebService(endpointInterface = "com.flyfox.service.IHelloWorldService",serviceName = "HelloWorldTest")
@SOAPBinding(style = Style.RPC)
public class HelloWorldService implements IHelloWorldService{
  
 public String sayHello(@WebParam(name = "name") String name) {
        return name + " say: Hello World ";
    }
}

 

5.通过JAX-WS将类发布为服务

这个是个普通类,要发布一个webservice,首先要定义好这个webservice的访问地址和端口,然后需要知道把哪个类发布成服务,就这么简单?yes! 

package com.flyfox.service.deploy;

import javax.xml.ws.Endpoint;

import com.flyfox.service.HelloWorldService;

 

public class DeployHelloWorldService {
 
 public static void deployService() {
  System.out.println("Server start ……");
  HelloWorldService service = new HelloWorldService();
  String address = "http://localhost:9000/helloWorld";
  Endpoint.publish(address, service);
 }
 
 public static void main(String[] args) throws InterruptedException {
  //发布WebService
  deployService();
  System.out.println("server ready ……");
  Thread.sleep(1000 * 60 * 1);
  System.out.println("server exiting");
  //休眠60秒后就退出
  System.exit(0);
 }
}

6.通过URL访问WSDL看看是否显示正常http://localhost:9000/helloWorld?wsdl
分析输出的wsdl文件

 * 说明:
 * 1、endpointInterface对应的接口 serviceName wsdl的<wsdl:definitions name="HelloWorldTest">中的name
 * 2、<wsdl:definitions targetNamespace="http://service.flyfox.com/" >
 * 注意到我们的代码位于service.flyfox.com中,就是包路径翻过阿里,CXF就用了这种机制
 * 3、<xs:complexType name="sayHello">
 * 这个即是我们定义在服务接口中的方法,在wsdl文件中将接口中的方法定义成服务方法,里面的子元素定义了该方法的参数
 * 4、<xs:complexType name="sayHelloResponse">
 * 这个是对接口服务方法返回值的描述,默认遵循以下约定对方法的描述为sayHello,则返回值的描述为sayHelloResponse
 * 5、<wsdl:message name="sayHello">
 * 这个描述把服务和方法绑定起来,与Response是成对出现的
 * 6、<soap:address location="http://localhost:9000/helloWorld"/>
 * 这里就是我们上面在代码里完成的服务的访问地址

 

小结:

HelloWorld 是跑起来了,感觉比先前用的JAX-RPC要简单的多了,几分钟就可以搞定一个webservice--也许这就是框架的魅力,但是也有一些疑问,如要运行这么小一个helloWorld,要依赖20几个jar包,其中还有Jetty的jar包若干!竟然还有org.eclipse.jetty.*这种包,不知道设计这个框架的同学是怎么考虑的,为什么要把webservice和jetty或eclipse扯上关系,可能看的不够深,明天继续研究。

 

转自:http://blog.csdn.net/crazycoder2010/article/details/6673269

没有登录不能评论