之前讲过webservice的jdk开发模式,现在来说说利用Apache cxf的方式发布服务的过程,在对cxf进行使用之前,我们先了解一下cxf
CXF (Celtix + XFire)是一个开源的Services框架。CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成。
我们在使用cxf之前,需要下载cxf并配置环境变量:
http://cxf.apache.org/download.html
下载之后,根据位置,配置环境
- 服务端发布
- 引入cxf相关jar,从下载后的apache-cxf-3.3.3中lib目录中选取。
2. 创建接口(接口上必写@WebService注解)
package com.ljm.server.webservice;
import java.io.UnsupportedEncodingException;
import javax.jws.WebService;
/**
* Created by linjiaming
*/
@WebService
public interface IWeatherService {
String query(String cityName) throws UnsupportedEncodingException;
}
2. 创建接口实现
package com.ljm.server.webservice;
import java.io.UnsupportedEncodingException;
import javax.jws.WebParam;
import javax.jws.WebService;
/**
* Created by linjiaming
*/
public class WeatherServiceImpl implements IWeatherService {
@Override
public String query( String cityName) throws UnsupportedEncodingException {
//乱码:原本的编码方式为utf-8,客户端传输参数传输过程中,被错误的转成GBK后又被转为UTF-8
System.out.println("查询"+new String(cityName.getBytes("GBK"),"UTF-8"));
return "大晴天";
}
}
3. 发布服务
package com.ljm.server.main;
import com.ljm.server.webservice.IWeatherService;
import com.ljm.server.webservice.WeatherServiceImpl;
import javax.xml.ws.Endpoint;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
/**
* @author linjiaming
* cxf发布形式
*/
public class WeatherServer {
public static void main(String[] args) {
JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
//设置发布地址
bean.setAddress("http://localhost:8080/weatherService");
//设置服务接口
bean.setServiceClass(IWeatherService.class);
//设置服务实现
bean.setServiceBean(new WeatherServiceImpl());
//创建服务
bean.create();
System.out.println("发布服务");
}
}
通过在地址栏输入发布地址+wsdl,发现生成完整的wsdl文档,所以服务端发布成功
- 客户端调用
1. 引入cxf相关jar包
2. 通过cxf命令生成客户端代码
3. 调用服务
package com.ljm.main;
import com.ljm.webservice.IWeatherService;
import com.ljm.webservice.UnsupportedEncodingException_Exception;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
/**
* Created by linjiaming
*/
public class WeatherClient {
/**
* 第一种方式调用方式
* @param args
*/
public static void main(String[] args) throws UnsupportedEncodingException_Exception {
JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
//设置地址
factoryBean.setAddress("http://localhost:8080/weatherService");
//设置服务接口
factoryBean.setServiceClass(IWeatherService.class);
//通过工厂创建对象
//IWeatherService service = (IWeatherService) factoryBean.create();
IWeatherService service = factoryBean.create(IWeatherService.class);
String s = service.query("北京");
System.out.println(s);
}
}