前段时间在学习cxf Webservice的东西,写了不少的笔记。废话不多说,整理还没有完全,排版有点乱。我尽量按着学习时的步骤写。
1. 目的
本文主要简单介绍Apache CXF,以及介绍如何使用Apache CXF JAX-RS进行RESTful Web Services开发部署,以及客户端开发。
2. 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 的一个孵化项目。
Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成。
CXF 包含了大量的功能特性,但是主要集中在以下几个方面:
1. 支持 Web Services 标准:CXF 支持多种 Web Services 标准,包含 SOAP、Basic Profile、WS-Addressing、WS-Policy、WS-ReliableMessaging 和 WS-Security。
2. Frontends:CXF 支持多种“Frontend”编程模型,CXF 实现了 JAX-WS API (遵循 JAX-WS 2.0 TCK 版本),它也包含一个“simple frontend”允许客户端和 EndPoint 的创建,而不需要 Annotation 注解。CXF 既支持 WSDL 优先开发,也支持从 Java 的代码优先开发模式。
3. 容易使用: CXF 设计得更加直观与容易使用。有大量简单的 API 用来快速地构建代码优先的 Services,各种 Maven 的插件也使集成更加容易,支持 JAX-WS API ,支持 Spring 2.0 更加简化的 XML 配置方式,等等。
4. 支持二进制和遗留协议:CXF 的设计是一种可插拨的架构,既可以支持 XML ,也可以支持非 XML 的类型绑定,比如:JSON 和 CORBA。
详细介绍请参考 Apache CXF 官方网站:http://cxf.apache.org
3. JAVA开发环境
3.1 组件列表
下面这些组件都需要事先下载安装。
组件 | 描述 | 备注 |
JDK | Java环境,安装 | 一般1.6或以上 |
TOMCAT | DataNode&Task JobTracker | 一般6.0以上 |
APACHE CXF | RESTful Web Services开发jar以及工具 | 2.7.8版本,免安装 下载:http://cxf.apache.org |
3.2 组件安装
JDK和TOMCAT的安装不介绍。APACHE CXF下载后直接解压缩即可,目录结构如下:
apche-cxf-2.7.8:
RESTful Web Services开发的时候需要用到lib目录下的jar包。
4. Eclipse中RESTful Web Serives开发
4.1 场景介绍
创建一个Students的CXF RESTful Web Services,并部署到Tomcat,然后用户可以在客户端通过HTTP协议向服务端发送web请求来读取,创建,修改,删除Student资源。
主要包括:
l RESTful服务端开发
l RESTful服务部署
l RESTful客户端开发
4.2 CXF非集成服务端开发
Apache CXF很容易与其他框架集成,但是也可以单独使用,这里介绍非集成的开发过程。
新建Dynamic Web Project
新建一个Dynamic Web Project,项目名称:CXFRestWithoutSpring。
第一步:File->New->Dynamic Web Project
第二步:填写Web项目名称CXFRestWithoutSpring,其他保持默认。
第三步:点击Next,然后确认完成即可。Web项目目录结构如下:
4.2.1 添加jar到Build Path
从下载的Apache CXF目录apche-cxf-2.7.8中添加RESTful WebServices项目所需要的jar包到WebContent/WEB-INF/lib目录,并添加到Build Path:
添加到WebContent/WEB-INF/lib目录下的jar包:
Build Path配置:
4.2.2 新建POJO类
POJO(Plain Old Java Object)类就是一般的java类,主要是创建一些Web Services中需要用到的基础类。当然也可以不需要这些基础类,直接创建Web Services。
这里创建一个Student POJO类:
注意下面标记红色的代码是必须的,因为CXF在客户端与服务端通讯时候需要在java对象与XML之间转换,CXF通过HTTP协议传输的是XML格式。
package com.study; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "Student") publicclass Student { private String name; public String getName() { returnname; } publicvoid setName(String name) { this.name = name; } }
4.2.3 新建RESTful Web Services接口
接口很简单,主要是为了提供统一访问接口方式,方便不同的功能实现。可以将JAX-RS的标注添加到接口文件中,如:@PATH,@GET,@POST,@PUT,@DELETE等
package com.study; publicinterface ChangeStudentDetails { Student changeName(Student student); Student getName(); }
4.2.4 新建RESTful Web Services实现类
注意下面绿色的标注代码,这些标注是为了Java类标注成Web Services资源。
package com.study;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("/Students")
@Consumes("application/xml")
@Produces("application/xml")
public class ChangeStudentDetailsImpl implements ChangeStudentDetails {
@POST
@Path("/changeName")
public Student changeName(Student student) {
student.setName("HELLO " + student.getName());
return student;
}
@GET
@Path("/getName")
public Student getName() {
Student student = new Student();
student.setName("Rockey");
return student;
}
}
JAX-RS标注介绍:
@Path,标注资源类或者方法的相对路径
@GET,@PUT,@POST,@DELETE,标注方法是HTTP请求的类型。
@Produces,标注返回的MIME媒体类型
@Consumes,标注可接受请求的MIME媒体类型
@PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam,分别标注方法的参数来自于HTTP请求的不同位置,例如@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,@HeaderParam来自于HTTP请求的头信息,@CookieParam来自于HTTP请求的Cookie。
详细介绍请参考JSR-339标准。
4.2.5 配置web.xml
在WebContent/WEB-INF/web.xml配置文件的web-app节点里面添加如下类容:
注意红色部分。
<servlet> <description></description> <display-name>CXFNonSpringJaxrsServlet</display-name> <servlet-name>CXFNonSpringJaxrsServlet</servlet-name> <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class> <init-param> <param-name>jaxrs.serviceClasses</param-name> <param-value>com.study.ChangeStudentDetailsImpl</param-value> </init-param> <init-param> <param-name>jaxrs.address</param-name> <param-value>/rest</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFNonSpringJaxrsServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
4.2.6 运行REST Web Services
右键点击项目名称CXFRestWithoutSpring,选择Run As->Run on Server
4.2.7 查看运行结果
在IE中打开http://localhost:8080/CXFRestWithoutSpring/
点击http://localhost:8080/CXFRestWithoutSpring/rest?_wadl可查看RESTful Web Services定义。
4.2.8 IE测试RESTful WebServices
在IE中打开http://localhost:8080/CXFRestWithoutSpring/rest/Students/getName,即调用RESTful WebServices的getName方法。
返回结果:
4.3 CXF集成Spring服务端开发
CXF集成Spring服务端开发与非集成服务端开发的过程基本一致,只是需要添加几个与Spring相关的jar包,以及添加Spring的配置,和修改web.xml配置。
4.3.1 新建Dynamic Web Project
新建一个Dynamic Web Project,项目名称:CXFRestWithoutSpring。其他参考4.1.1章节。
4.3.2 添加jar到Build Path
从下载的Apache CXF目录apche-cxf-2.7.8中添加RESTful WebServices项目所需要的jar包到WebContent/WEB-INF/lib目录,并添加到Build Path:
添加到WebContent/WEB-INF/lib目录下的jar包:
注意红色圈圈里面的与Spring相关的jar:
4.3.3 新建POJO类
参考4.1.3章节。
4.3.4 新建RESTful Web Services接口
参考4.1.4章节。
4.3.5 新建RESTful Web Services实现类
参考4.1.5章节。
4.3.6 Spring集成配置
创建WebContent/WEB-INF/cxf.xml文件,用于配置CXF与Spring的集成。内容如下:
注意红色部分必须添加
<?xmlversion="1.0"encoding="UTF-8"?> <beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd"> <importresource="classpath:META-INF/cxf/cxf.xml"/> <jaxrs:serverid="base"address="/rest"> <jaxrs:serviceBeans> <refbean="StudentService"/> </jaxrs:serviceBeans> </jaxrs:server> <beanid="StudentService"class="com.study.ChangeStudentDetailsImpl"/> </beans>
4.3.7 配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/cxf.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> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
4.3.8 运行REST Web Services
参考4.1.7章节。
4.3.9 查看运行结果
在IE中打开http://localhost:8080/CXFRestWithSpring/
参考4.1.9章节。
4.3.10 IE测试RESTful WebServices
在IE中打开http://localhost:8080/CXFRestWithSpring/rest/Students/getName
参考4.1.9章节。
4.4 CXF Web Services部署
4.4.1 导出RESTful Web Services项目
将两个项目都导出,生成两个war文件:CXFRestWithoutSpring.war和CXFRestWithSpring.war。
4.4.2 部署RESTful Web Services
将上步导出的两个war文件都copy到Tomcat的webapps目录,重启Tomcat服务即可。
4.4.3 测试RESTful Web Services
可以使用IE进行测试,参考4.1.9和4.2.10。
4.5 CXF客户端开发
客户端开发的一般步骤:
第一步:建立与RESTful的连接,一般通过HttpURLConnection或HttpClient。
第二步:设置HTTP请求属性,如:HTTP请求方法,资源类型,HTTP头部信息等。
第三步:提交HTTP 修改请求信息,GET方法不需要。
第四步:获取HTTP返回信息,错误或者正常返回。
第五步:处理返回信息。
第六步:关闭连接请求。
4.5.1 新建Java Project
创建一个普通Java项目,项目名称:CXFRestClient。当然也可以是动态Web项目,这里只是为了方便才创建Java项目
4.5.2 GET方法调用RESTful服务
GetStudentClient.java内容如下:
package com.study;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Scanner;
// CXF JAX-RS client Invoking GET Method
public class GetStudentClient {
public static void main(String[] args) {
try {
URL url = new URL("http://localhost:8080/CXFRestWithoutSpring/rest/Students/getName");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-Type", "application/xml");
Scanner scanner;
String response;
if (conn.getResponseCode() != 200) {
scanner = new Scanner(conn.getErrorStream());
response = "Error From Server \n\n";
} else {
scanner = new Scanner(conn.getInputStream());
response = "Response From Server \n\n";
}
scanner.useDelimiter("\\Z");
System.out.println(response + scanner.next());
scanner.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.5.3 POST方法调用RESTful服务
PostStudentClient.java内容如下:
4.5.4 客户端测试
直接在GetStudentClient.java或PostStudentClient.java文件上右键点击,Run As->Java Application。
转载于:https://blog.51cto.com/striby/1402642