webService之CXF框架

项目中经常用到开发webservice接口,及调用webService接口。这里讲解如何使用cxf开发webService接口。
webservice介绍及理解
webservice是一种跨平台,跨语言的规范,用于不同平台,不同语言开发的应用之间的交互。
比如,平台平台淘宝、京东想获取其他快递公司数据接口,需快递公司开放数据接口。
那么 webservice就是出于以上类似需求而定义出来的规范;无需关心对方什么平台上开发以及使用何种语言开发。
只关心调用对方发布webservice接口的一些对我们获取有用数据的方法。
开发人员一般就是在具体平台开发webservice接口,以及调用webservice接口;每种开发语言都有自己的webservice实现框架。
比如Java 就有 Apache Axis1、Apache Axis2、Codehaus XFire、Apache CXF、Apache Wink、Jboss RESTEasyd等等…
 其中CXF是java开发webService的一种实现框架技术。目前,CXF也是主流的webService实现框架。

  使用cxf开发需引入cxf开发相关jar包,maven项目中pom.xml配置如下:
<!--添加cxf支持  -->
     <dependency>
          <groupId>org.apache.cxf</groupId>
          <artifactId>cxf-rt-frontend-jaxws</artifactId>
         <version>3.1.9</version>
      </dependency>
     <dependency>
          <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-transports-http-jetty</artifactId>
         <version>3.1.9</version>
      </dependency>
      <dependency>
           <groupId>org.apache.cxf</groupId>
          <artifactId>cxf-core</artifactId>
          <version>3.1.9</version>
     </dependency>

如果是其他方式,只需要加入CXF的jar包即可,下载地址如下:http://cxf.apache.org/download.html

定义场景:
公司有两个系统A和B,现在需要把A系统的用户数据推送给B系统,B系统在根据业务需要进行业务操作,操作完成再返回给A系统结果。
分析场景得出:A系统为发送数据方(即客户端),B系统为接收方(即服务端)
服务端需要定义一个接口,并且实现,代码如下:

@WebService
public interface WebInterface {
	
	String HandleData(String data); 

}

本示例简历简单接口,参数是String ,返回类型为String
实现类如下:

public class WebInterfaceImpl implements WebInterface {
	@Override
	public String HandleData(String data) {
		// TODO Auto-generated method stub
		return "服务端返回了:"+data;
	}

}

@WebService注解: 实现 Web Service 的 Java 类必须指定 @WebService 或 @WebServiceProvider 注释。不能同时提供这两种注释。这个是必须指定的。

接下来则是发布WSDL

/import javax.xml.ws.Endpoint;

import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

import com.it.web.webInterface.WebInterface;
import com.it.web.webInterface.WebInterfaceImpl;

/**
 * 本类发布一个wsdl总地址
 * @author Administrator
 *
 */
public class webservice {
	//第一种使用通过JAX-WS提供的Endpoint来发布webservice  
	 public void Server1() throws Exception {            
          System.out.println("启动weservice接口发布");  
          WebInterface implementor = new WebInterfaceImpl();  
          //发布地址以及端口参数
          String address = "http://127.0.0.1:8080/helloWorld";  
          //发布
          Endpoint.publish(address, implementor);  
          System.out.println("发布成功,发布地址为:"+address);  
      }  
	 //通过CXF提供的JaxWsServerFactoryBean来发布webservice  
	 public void Server2() throws Exception {  
		 System.out.println("开始发布");
		 JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();  
		 //对外暴露的接口类
		 factory.setServiceClass(WebInterfaceImpl.class);   	  
		 //对外暴露地址
		 factory.setAddress("http://127.0.0.1:8080/webCXF");
		 //创建
		 org.apache.cxf.endpoint.Server server = factory.create();  
		 //启动
		 server.start();
		 System.out.println("发布成功:http://127.0.0.1:8080/webCXF");
     }  
 public static void main(String[] args) {
                //测试
		 webservice webservice = new webservice();
		 try {
			webservice.Server2();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

以上就是发布webservice的WDSL的两种方式。
运行main方法,现在访问:http://127.0.0.1:8080/webCXF?wsdl
出现如下wsdl
这个就是发布的wsdl了。
wsdl就是用来描述webservices提供的服务,相当与告诉别人你这个接口的详细参数、接口名称,返回参数类型等等信息。
接下来我们来看看客户端是如何编写的。
代码如下:

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;

import com.it.web.webInterface.WebInterfaceImpl;

public class cxfClient {
	//直接调用
	public void getCXFInfoStatis(){
		JaxWsServerFactoryBean jaxWsServerFactoryBean = new JaxWsServerFactoryBean();
		jaxWsServerFactoryBean.setAddress("http://127.0.0.1:8080/webCXF?wsdl");
		jaxWsServerFactoryBean.setServiceClass(WebInterfaceImpl.class);
		WebInterfaceImpl w =(WebInterfaceImpl) jaxWsServerFactoryBean.create();
		String str = 	w.HandleData("客户端发送请求");
		System.out.println(str);
		
	}
	//动态调用
	public void getCXFInfo(){
		 JaxWsDynamicClientFactory  f =  JaxWsDynamicClientFactory.newInstance();
		 Client c = f.createClient("http://127.0.0.1:8080/webCXF?wsdl");
		 try {
			 //invoke(调用地址的方法名,发送参数);
			 Object [] objects = 	c.invoke("HandleData", "ssss");
		 System.out.println("返回长度:"+objects.length);
		 if(objects.length>0){
			 System.out.println("返回内容为:"+objects[0].toString());
		 }
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	public static void main(String[] args) {
		cxfClient cxfClient = new cxfClient();
		
		cxfClient.getCXFInfo();
	}

}

不推荐直接调用,因为直接调用的话,你需要吧wsdl保存文件,在解析成服务端的实现类啥的,比较麻烦。
推荐直接使用第二种动态解析wsdl。
至此,cxf的客户端和服务端已经编写完毕。
一般在实际开发过程中,也差不多是这样的流程。
如果您在现有的项目中,使用非maven方式,可能会引起jar包冲突。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值