Apche CXF WebService框架
一、介绍
1.CXF是apache旗下的开源框架,由Celtix + XFire这两门经典的框架合成,是一套非常流行的web service框架。
2.CXF的官方网站:
http://cxf.apache.org/download.html
下载apache-cxf-3.1.6版本
3.它提供了对JAX-WS的全面支持,只需要拷入jar包即可,不需要任何改动,同时它能与spring进行完美结合。
使用CXF创建并发布服务
1.实际的应用场景中,通常采用更为专业的Java EE应用服务器来发布Web服务。
2.CXF是流行的Web服务开发框架之一,代表着Celtix和Xfire项目的合并
一、实现步骤
- 添加所需要的jar文件(简单粗暴方式)
排除geronimo-servlet_3.0_spec-1.0.jar,javax.servlet-api-3.1.0.jar,WHICH_JARS
三个文件后的所有jar包共147个文件 - 设计并实现服务接口
1)在web.xml中配置CXFServlet来初始化CXF环境
2)在applicationContext.xml中配置cxf初始化监听器和配置
3)部署并访问发布地址,检查是否可以生成正确的wsdl文件
代码实现
一、web.xml中添加cxf和spring的配置信息。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springws.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<!-- 拦截器拦截services的所有请求 -->
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
二、添加WebService接口
@WebService
public interface WeatherService {
public Map<String,ArrayList<City>> getProvince();
public ArrayList<City> getCity(String province);
}
// City实体类
public class City {
private int id;
private String cityName;
private String code;
}
三、创建实现类,重写WeatherService接口。
@WebService
public class WeatherServiceImp implements WeatherService {
private static Map<String,ArrayList<City>> provincies;
static {
provincies = new HashMap<String, ArrayList<City>>();
ArrayList<City> guangdong = new ArrayList<City>();
guangdong.add(new City(1,"广州","111"));
guangdong.add(new City(2,"深圳","222"));
guangdong.add(new City(3,"佛山","333"));
ArrayList<City> hunan = new ArrayList<City>();
hunan.add(new City(4,"长沙","444"));
hunan.add(new City(5,"永州","555"));
hunan.add(new City(6,"岳阳","666"));
ArrayList<City> hubei = new ArrayList<City>();
hubei.add(new City(71,"武汉区","777"));
hubei.add(new City(8,"黄石区","888"));
hubei.add(new City(9,"襄阳区","999"));
provincies.put("广东省", guangdong);
provincies.put("湖南省", hunan);
provincies.put("湖北省", hubei);
}
@Override
public Map<String, ArrayList<City>> getProvince() {
return provincies;
}
@Override
public ArrayList<City> getCity(String province) {
return provincies.get(province);
}
}
四、Spring容器的配置。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://cxf.apache.org/configuration/beans"
xmlns:soap="http://cxf.apache.org/bindings/soap"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://cxf.apache.org/configuration/beans http://cxf.apache.org/schemas/configuration/cxf-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<!-- 实现类的地址 -->
<bean id="weatherService" class="com.znsd.webservice.service.WeatherServiceImp" />
<jaxws:endpoint id="wsServiceBean" implementor="#weatherService" address="/getWeather" publish="true" />
</beans>
配置完成后打开浏览器输入地址
http://localhost:8080/项目名/services
访问后会出现此页面
点击该路径跳转到:
记住此url
输入:wsimport -p com.lxit.weather(包名,任意自己取) -keep http://localhost:8080/cxf_web_service/services/getWeather?wsdl(上面的url)后回车即可如图即为成功
后刷新项目就会出现该包:
开始main 方法调用:
public static void main(String[] args) {
WeatherService service = new WeatherServiceImpService().getWeatherServiceImpPort();
Return province = service.getProvince();
List<Entry> entry = province.getEntry();
for (Entry e : entry) {
System.out.println(e.getKey());
}
System.out.println("==============");
List<City> city = service.getCity("湖南省");
for (City c : city) {
System.out.println(c.getCityName());
}
}
显示:
广东省
湖南省
湖北省
==============
长沙
永州
岳阳
使用CXF创建并发布服务功能完成。