• 1. SOA/WebService
  • 2. 课程目标使用CXF框架消费WebService 使用CXF框架布署WebService
  • 3. Apache CXF关于 Apache CXF Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。 Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成。
  • 4. CXF 功能特性 支持 Web Services 标准: CXF 支持多种 Web Services 标准,包含 SOAP、Basic Profile、WS-Addressing、WS-Policy、WS-ReliableMessaging 和 WS-Security。 Frontends: CXF 支持多种“Frontend”编程模型,CXF 实现了 JAX-WS API (遵循 JAX-WS 2.0 TCK 版本),它也包含一个“simple frontend”允许客户端和 EndPoint 的创建,而不需要 Annotation 注解。CXF 既支持 WSDL 优先开发,也支持从 Java 的代码优先开发模式。 容易使用: CXF 设计得更加直观与容易使用。有大量简单的 API 用来快速地构建代码优先的 Services,各种 Maven 的插件也使集成更加容易,支持 JAX-WS API ,支持 Spring 2.0 更加简化的 XML 配置方式,等等。 支持二进制和遗留协议: CXF 的设计是一种可插拨的架构,既可以支持 XML ,也可以支持非 XML 的类型绑定,比如:JSON 和 CORBA。
  • 5. CXF 项目目标(1)支持多种标准 支持 JAX-WS、 JAX-WSA、JSR-181 和 SAAJ; 支持 SOAP 1.1、1.2、WS-I BasicProfile、WS-Security、WS-Addressing、WS-RM 和 WS-Policy; 支持 WSDL 1.1 、2.0; 支持 MTOM; 多种传输方式、Bindings、Data Bindings 和 Format Bindings:SOAP、REST/HTTP; Data Bndings:目前支持 JAXB 2.0、Aegis 两种,默认是 JAXB 2.0。XMLBeans、Castor 和 JiBX 数据绑定方式将在 CXF 2.1 版本中得到支持; 格式(Format):XML、JSON; 传输方式:HTTP、Servlet、JMS 和 Jabber; 可扩展的 API 允许为 CXF 增加其它的 Bindings,以能够支持其它的消息格式,比如:CSV 和固定记录长度。
  • 6. CXF 项目目标(2)灵活部署 轻量级容器:可在 Tomcat 或基于 Spring 的容器中部署 Services; 集成 JBI:可以在如 ServiceMix, OpenESB or Petals 等等的 JBI 容器中将它部署为一个服务引擎; 集成 SCA:可以部署在如 Tuscany 之类的 SCA 容器中; 集成 J2EE:可以在 J2EE 应用服务器中部署 Services,比如:Geronimo、JOnAS、JBoss、WebSphere Application Server 和 WebLogic Application Server,以及 Jetty 和 Tomcat; 独立的 Java 客户端/服务器。
  • 7. CXF 项目目标(3)支持多种编程语言 全面支持 JAX-WS 2.0 客户端/服务器编程模型; 支持 JAX-WS 2.0 synchronous、asynchronous 和 one-way API's; 支持 JAX-WS 2.0 Dynamic Invocation Interface (DII) API; 支持 wrapped and non-wrapped 风格; 支持 XML messaging API; 支持 JavaScript 和 ECMAScript 4 XML (E4X) ,客户端与服务端均支持; 通过 Yoko 支持 CORBA; 通过 Tuscany 支持 SCA; 通过 ServiceMix 支持 JBI ;
  • 8. CXF 项目目标(4)代码生成 Java to WSDL; WSDL to Java; XSD to WSDL; WSDL to XML; WSDL to SOAP; WSDL to Service;
  • 9. CXF 开发环境CXF版本: 下载apache-cxf-2.2.3 配置环境变量 CXF_HOME, 并将%CXF_HOME%\bin;添加到PATH 下载httpcomponents-client-4.0 JDK版本: jdk6.0_11以上 否则需将jaxb-*.jar copy至jdk/jre/lib/endorse 目录下 Tomcat版本: Apache Tomcat6 Eclipse: Window->Preferences->Java->Build Path->User Libraries 新建cxf, 添加cxf_home\lib 目录下所有jar包 新建http, 添加httpcomponents\lib 目录下所有jar包
  • 10. 查看天气预报 HttpGet get = new HttpGet( "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/ getWeatherbyCityName?theCityName=珠海"); HttpClient httpclient = new DefaultHttpClient(); HttpResponse response = httpclient.execute(get); InputStream ins = response.getEntity().getContent(); byte[] b = new byte[1024]; StringBuilder sb = new StringBuilder(); while (ins.read(b) != -1) { sb.append(new String(b, "UTF-8")); } System.out.println(sb.toString());
  • 11. 查看股票信息HttpGet get = new HttpGet( "http://www.webxml.com.cn/WebServices/ ChinaStockWebService.asmx/getStockImageByCode?theStockCode=" ); HttpClient client = new DefaultHttpClient(); HttpResponse response = client.execute(get); InputStream is = response.getEntity().getContent(); FileOutputStream fos = new FileOutputStream("d:/stock.gif"); BufferedInputStream bis = new BufferedInputStream(is); BufferedOutputStream bos = new BufferedOutputStream(fos); int b = 0; while ( (b=bis.read()) !=-1) { bos.write(b); } bis.close(); bos.close();
  • 12. REST/ HelloWorld@Path("/hello/") public class HelloWS { @GET @Path("/hi") public String sayHi(@QueryParam("name") String name) { return "hello " + name; } } public class HelloServer { public static void main(String[] args) { JAXRSServerFactoryBean server = new JAXRSServerFactoryBean(); server.setResourceClasses(HelloWS.class); server.setAddress("http://localhost:9009"); server.create(); } }
  • 13. CXF 与Spring:CXF 可以很好的与Spring 整合,这样可以为我们省去很多的代码,你需要的是简单的Spring配置即可。
  • 14. 使用Spring发布SOAP方式的Web服务使用Spring 发布Web 服务很简单,首先将web.xml 改为如下的形式: contextConfigLocation /WEB-INF/beans.xml org.springframework.web.context.ContextLoaderListener CXFServlet org.apache.cxf.transport.servlet.CXFServlet 1 CXFServlet /services/*
  • 15. beans.xml
  • 16. jaxws&jaxrsjaxws 是配置SOAP 方式的Web 服务, jaxws:server、 jaxws:endpoint、 jaxws:client jaxrs是REST 方式的Web 服务, jaxrs:server、 jaxrs:client
  • 17. jaxws //同样,你也可以使用serviceClass 属性指向一个类 //使用Spring开发SOAP方式的客户端: //下面是我们在JSP 中书写的调用代码: IHelloService helloService = (IHelloService) WebApplicationContextUtils .getWebApplicationContext(application) .getBean("helloServiceClient"); out.print(helloService.selectMaxAgeStudent(c1, c2).getName());
  • 18. jaxrs使用Spring发布REST风格的Web服务: beans.xml 代码如下所示:
  • 19. 总结 使用CXF框架消费WebService 使用CXF框架布署WebService