CXF初步教程

1 CXF概述


1.1 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已是一个正式的Apache顶级项目。java

Apache CXF 是一个开源的Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 能够支持多种协议,好比:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,而且能够在多种传输协议上运行,好比:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的建立,同时它继承了 XFire 传统,同样能够自然地和 Spring 进行无缝集成。web

2 CXF版的HelloWorld

咱们使用MyEclipse集成开发环境学习CXF。spring

2.1 新建WebProject,并加入依赖包


图1 依赖包
apache

2.2 写一个服务接口

首先是服务接口:编程

这里的接口须要使用Annotation @WebService  描述,接口中的方法若是有参数,须要使用@WebParam来修饰,并使用属性name来定义名字,否则发布后,参数会使用默认的args0…app

package org.ygy.service;

import javax.jws.WebParam;
import javax.jws.WebService;

@WebService
public interface HelloWorldService {
	public String sayHello();
	
	public String sayHelloWithName(@WebParam(name="name") String name);
}


接下来写一个接口的实现类:框架

package org.ygy.service.impl;

import org.ygy.service.HelloWorldService;

public class HelloWorldServiceImpl implements HelloWorldService {

	@Override
	public String sayHello() {
		System.out.println("sayHello()");
		
		return "Hello World !";
	}

	@Override
	public String sayHelloWithName(String name) {
		System.out.println("sayHello(" + name + ")");
		
		return "Hello , " + name;
	}

}


2.3 声明服务

在WEB-INF文件夹下新建一个beans.xml。jsp

这是一个Spring的配置文件,首先要导入几个cxf使用的xml文件,而后定义咱们刚才写好的服务。ide

注:若项目中bean被spring管理,则implemorimplemor="#HelloWorldServiceImpl"这样拿的是spring管理的bean,不然拿到的是null学习

<?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:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

	<import resource="classpath:META-INF/cxf/cxf.xml" />
	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

	<jaxws:endpoint id="hello" implementor="org.ygy.service.impl.HelloWorldServiceImpl" address="/HelloWorldService" />

</beans>

2.4 配置Servlet

咱们来看一下web.xml的配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	
	<listener>
	  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/beans.xml</param-value>
	</context-param>

	<servlet>
		<servlet-name>HelloWorldService</servlet-name>
	        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>HelloWorldService</servlet-name>
		<url-pattern>/services/*</url-pattern>
	</servlet-mapping>
	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
	
</web-app>

 


2.5 写一个测试程序

package org.ygy.test;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;

import org.junit.Test;
import org.ygy.service.HelloWorldService;

public class HelloClient {
	@Test
	public void testSayHello() throws MalformedURLException {
		URL wsdlURL = new URL("http://localhost:8080/CXFTest_HelloWorld/services/HelloWorldService?wsdl");
		QName SERVICE_NAME = new QName("http://impl.service.ygy.org/", "HelloWorldServiceImplService");
		Service service = Service.create(wsdlURL, SERVICE_NAME);
		
		HelloWorldService client = service.getPort(HelloWorldService.class);
		String result = client.sayHello();
		
		System.out.println("result==>" + result);
	}
	
	@Test
	public void testSayHelloWithName() throws MalformedURLException {
		URL wsdlURL = new URL("http://localhost:8080/CXFTest_HelloWorld/services/HelloWorldService?wsdl");
		QName SERVICE_NAME = new QName("http://impl.service.ygy.org/", "HelloWorldServiceImplService");
		Service service = Service.create(wsdlURL, SERVICE_NAME);
		
		HelloWorldService client = service.getPort(HelloWorldService.class);
		
		String result = client.sayHelloWithName("路飞");
		System.out.println("result-->" + result);
		
		result = client.sayHello();
		System.out.println(result);
	}
}

至此,咱们的项目结构如图 2所示。


图2 项目目录结构

2.6 将项目部署到Tomcat

将项目成功部署到Tomcat后,启动Tomcat,访问

http://localhost:8080/CXFTest_HelloWorld/services,会看到如图 3所示的页面


图3 发布的WebService

单击连接,能够打开WSDL。


图4 WSDL文件

至此,咱们的第一个WebService发布完成。

相关文章
相关标签/搜索