CXF框架实现webservice教程
1 使用CXF实现一个简单的WEB SERVICE
首先介绍如何用CXF实现一个基本的hello world
首先到apache去下载CXF的开发jar包
ak//cxf/2.4.3/apache-cxf-2.4.3.zip
创建cxf webservice服务器端普通java项目,叫做HelloCxfServer,把必须用到的jar文件通过构建路径引入,为了省事,可以直接把所有的jar引入
此处注意:如果是jdk1.6启动服务器会发生如下错误
JAXB 2.1 API is being loaded from the bootstrap classloader, but this RI (from jar:file:/E:/javaLib/cxf_all_jar/jaxb-impl-2.2.1.1.jar!/com/sun/xml/bind/v2/model/impl/ModelBuilder.class) needs 2.2 API. Use the endorsed directory mechanism to place jaxb-api.jar in the bootstrap classloader.
这是由于jdk1.6的jar包和cxf的jar包冲突造成的,
需要把cxf lib中的endorsed目录拷入到D:\Program Files\Java\jdk1.6.0\jre\lib目录下
 创建一个接口HelloWorld和一个实现类HelloWorldImpl,只提供一个成员方法,叫做sayHello,给接口和实现类添加注解@WebService,这是最基本的注解
/test/HellWorld.java源码
package test;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
    String sayHello(String name);   
}
/test/HelloWorldImpl.java源码
package test;
import javax.jws.WebService;
@WebService
public class HelloWorldImpl implements HelloWorld {
    @Override
    public String sayHello(String name) {       
        System.out.println("sayHello方法被调用...");       
        return "hello," + name;
    }
}
CXF自带了一个Web Service容器Jetty,这是一个WEB容器,类似于tomcat,能够直接发布web service,下面创建一个发布服务类MainServer,执行这个类就会运行服务器,看到控制台输出日志信息,表示启动服务成功
/test/MainServier.java源码
package test;
import f.endpoint.Server;
import f.jaxws.JaxWsServerFactoryBean;
public class MainServer {   
    public static void main(String[] args) {       
        //创建一个JaxWs服务器工厂
        JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
        //设置发布类
        factory.setServiceClass(HelloWorldImpl.class);
        //设置服务发布的地址
        factory.setAddress("localhost:6666/MyCxfService");
       
        //根据设置创建一个服务器
        Server server = ate();
        //启动服务器
        server.start();       
    }
}
发布成功以后,可以通过浏览器去查看生成的WSDL,
在浏览器地址栏输入localhost:6666/MyCxfService?wsdl,效果如下:
下面创建访问WebService的客户端,可以重新创建一个项目,也可以就在这个项目里实现,我下面在同一个项目中创建一个类HelloWorldCient
/test/HelloWorldClient.java源码
package test;
import f.jaxws.JaxWsProxyFactoryBean;
import ing.jaxws.JaxWsPortProxyFactoryBean;
public class HelloWorldClient {   
    public static void main(String[] args) {       
        //创建一个JaxWs的代理工厂
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        //设置访问地址
        factory.setAddress("localhost:6666/MyCxfService");
        //设置接口类型
        factory.setServiceClass(HelloWorld.class);
        //获得代理类实例
        HelloWorld helloWorld = (HelloWorld) ate();
       
        //调用方法
        String str = helloWorld.sayHello("张三");
        System.out.println(str);
    }
}
运行客户端,会看到控制台,输出:hello,张三
2 WSDL结构分析
主要通过上一章生成的WSDL,来对WSDL语言的标签进行解释
Web Services Description Language的缩写,是一个用来描述Web服务和说明如何与Web服务通信的XML语言。为用户提供详细的接口说明书。
查看刚才生成的WSDL,可以分析出以下的知识点:
wsdl:definitions根标签
属性name="HelloWorldImplService":服务名称设置,HelloWorldImplService系统自动按照类名生成的,当然这个名字可以通过注解设置进行自定义
属性targetNamespace="test/" :名称空间设置,默认会用反写包名作为名称空间,例如,包名是st,那么名称空间就是test.icss/,通过注解设置也可以自定义
wsdl:types元素: 使用某种语法(如 XML 模式)的数据类型定义(string、int),描述了接口中方法的参数(输入参数)和返回值(输出参数)名称和类型
可以通过注解来给输入参数的名字和输出参数的名字进行自定义,默认是输出参数是return和第一个输入参数是arg0,被修改为sayHelloResult和name
@WebService
public interface HelloWorld {
    @WebResult(name="sayHelloResult")String sayHello(@WebParam(name="name")String name);   
}
wsdl:message元素:描述要传递的数据,web service是把请求和响应都包装成一个message来传递,客户端把请求封装成message传递给服务器,而服务器把响应封装成message发送回客户端
part元素:消息参数
wsdl:portType/ Interface元素:一个或多个端点支持的操作的抽象集。此名称已更改,因此可能会遇到两者中的任何一个。这个元素其实就是对应我们的接口。接口中的每一个方法被映射为一个Operation元素
wsdl:binding元素:特定端口类型的具体协议和数据格式规范,设置协议,一般都是soap协议
wsdl:service元素:一个接口就是一个portType,如果我们有很多接口,那么就组成一个service,包含很多访问地址
3 WebService工作原理以及SOAP简介
Webservice工作原理大致流程:客户端向服务器端发出一个GET请求,然后响应的就是WSDL,告诉客户端有哪些暴露的接口功能可以调用。Webservice提供一个工具类,叫做WSDL2Java,可以根据WSDL生成一系列的代理类。当客户端得到WSDL之后,就会向服务器端发出一个SOAP请求,这个SOAP请求就是一段XML,然后服务器端接收到SOAP请求,再对这个请求进行解析,然后再把请求的结果返回客户端。
在服务器端代码加入两个日志,可以看到每次请求和响应的日志信息,代码如下
//设置服务发布的地址
factory.setAddress("localhost:6666/MyCxfService");   
//加入一个接收请求日志
InInterceptors().add(new LoggingInInterceptor());
/
/加入一个返回响应日志
OutInterceptors().add(new LoggingOutInterceptor());
//根据设置创建一个服务器
下载apacheServer server = ate();
4 JAX-WS
JAX-WS规范是一组SUN公司提供的XML web services的标准JAVA API,主要提供两个包的类,分别是javax.jws和javax.jws.soap,例如@WebService就是这两个包中的注解
通过CXF下载包中bin目录中的wadl2java命令可以把一个wsdl文档转换为对应的java文件,这个就不掩饰了

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。