使用CXF与Spring集成实现RESTFul WebService

来源:互联网 发布:2016最好用的优化软件 编辑:程序博客网 时间:2024/05/22 05:12
以下引用与网络中!!!
   
一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
    REST(英文:Representational State Transfer,简称REST)描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。在目前主流的三种Web服务交互方案中,REST相比于SOAP(Simple Object Access protocol,简单对象访问协议)以及XML-RPC更加简单明了,无论是对URL的处理还是对Payload的编码,REST都倾向于用更加简单轻量的方法设计和实现。值得注意的是REST并没有一个明确的标准,而更像是一种设计的风格。
REST是REST之父Roy Thomas创造的,当时提出来了REST的6个特点:客户端-服务器的、无状态的、可缓存的、统一接口、分层系统和按需编码。其具有跨语言和跨平台的优势。
    对于资源的具体操作类型,由HTTP动词表示。
    常用的HTTP动词有下面五个(括号里是对应的SQL命令)
 
 
        GET(SELECT):从服务器取出资源(一项或多项)。
        POST(CREATE):在服务器新建一个资源。
        PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
        PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
        DELETE(DELETE):从服务器删除资源。
 
      下面是一些例子
        GET /zoos:列出所有动物园
        POST /zoos:新建一个动物园
        GET /zoos/ID:获取某个指定动物园的信息
        PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)
        PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)
        DELETE /zoos/ID:删除某个动物园
        GET /zoos/ID/animals:列出某个指定动物园的所有动物
        DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物
 
通过 REST 风格体系架构,请求和响应都是基于资源表示的传输来构建的。资源是通过全局 ID 来标识的,这些 ID 一般使用的是一个统一资源标识符(URI)。客户端应用使用 HTTP 方法(如,GET、POST、PUT 或 DELETE)来操作一个或多个资源。通常,GET 是用于获取或列出一个或多个资源,POST 用于创建,PUT 用于更新或替换,而 DELETE 则用于删除资源。

例如,GET http://host/context/employees/12345 将获取 ID 为 12345 的员工的表示。这个响应表示可以是包含详细的员工信息的 XML 或 ATOM,或者是具有更好 UI 的 JSP/HTML 页面。您看到哪种表示方式取决于服务器端实现和您的客户端请求的 MIME 类型。

RESTful Web Service 是一个使用 HTTP 和 REST 原理实现的 Web Service。通常,一个 RESTful Web Service 将定义基本资源 URI、它所支持的表示/响应 MIME,以及它所支持的操作。 
参考资料:
1)、使用 Spring 3 来创建 RESTful Web Services(http://www.ibm.com/developerworks/cn/web/wa-spring3webserv/)
2)、Apache CXF与Spring集成实现Soap Webservice与RESTFul WebService(http://blog.csdn.net/javacloudfei/article/details/38555803)
 
本人的实例:
配置pom.xml
 
复制代码
<properties>        <spring.version>4.0.5.RELEASE</spring.version>        <jackson.version>1.9.2</jackson.version>        <cxf.version>3.0.3</cxf.version>    </properties>        <dependencies>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>4.11</version>            <scope>test</scope>        </dependency>            <!--spring核心包-->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-core</artifactId>            <version>${spring.version}</version>        </dependency>                <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-beans</artifactId>            <version>${spring.version}</version>        </dependency>                <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-web</artifactId>            <version>${spring.version}</version>        </dependency>            <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context</artifactId>            <version>${spring.version}</version>        </dependency>                <dependency>            <groupId>log4j</groupId>            <artifactId>log4j</artifactId>            <version>1.2.17</version>        </dependency>            <!--JSTL标签类-->        <dependency>            <groupId>javax.servlet</groupId>            <artifactId>jstl</artifactId>            <version>1.2</version>        </dependency>                <dependency>            <groupId>javax.servlet</groupId>            <artifactId>servlet-api</artifactId>            <version>2.5</version>        </dependency>                <dependency>            <groupId>org.apache.commons</groupId>            <artifactId>commons-lang3</artifactId>            <version>3.3.2</version>        </dependency>        <!--cxf-->        <dependency>            <groupId>org.apache.cxf</groupId>            <artifactId>cxf-rt-frontend-jaxws</artifactId>            <version>${cxf.version}</version>        </dependency>        <dependency>            <groupId>org.apache.cxf</groupId>            <artifactId>cxf-rt-transports-http</artifactId>            <version>${cxf.version}</version>        </dependency>        <dependency>            <groupId>org.apache.cxf</groupId>            <artifactId>cxf-rt-frontend-jaxrs</artifactId>            <version>${cxf.version}</version>        </dependency>                <!--json-->        <dependency>              <groupId>org.codehaus.jackson</groupId>              <artifactId>jackson-core-asl</artifactId>              <version>${jackson.version}</version>          </dependency>          <dependency>              <groupId>org.codehaus.jackson</groupId>              <artifactId>jackson-mapper-asl</artifactId>              <version>${jackson.version}</version>          </dependency>         <dependency>              <groupId>org.codehaus.jackson</groupId>              <artifactId>jackson-jaxrs</artifactId>              <version>${jackson.version}</version>          </dependency>          <dependency>              <groupId>org.codehaus.jackson</groupId>              <artifactId>jackson-xc</artifactId>              <version>${jackson.version}</version>          </dependency>    </dependencies>
复制代码

配置application.xml

复制代码
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:context="http://www.springframework.org/schema/context"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xsi:schemaLocation="http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd       http://www.springframework.org/schema/context       http://www.springframework.org/schema/context/spring-context-4.0.xsd ">      <!--扫描器-->    <context:component-scan base-package="com.wangzhu"/>    </beans>
复制代码

 

配置applicationWebService.xml

复制代码
<?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"    xmlns:jaxrs="http://cxf.apache.org/jaxrs"    xsi:schemaLocation="http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd       http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd    http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.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-extension-jaxrs-binding.xml"/>        <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>-->    <jaxrs:server id="webService" address="/">        <!--输入拦截器设置-->        <jaxrs:inInterceptors>                    </jaxrs:inInterceptors>        <!--输出拦截器设置-->        <jaxrs:outInterceptors>                    </jaxrs:outInterceptors>                <!--serviceBeans:暴露的WebService服务类-->        <jaxrs:serviceBeans>            <ref bean="studentService"/>        </jaxrs:serviceBeans>                    <!--支持的协议-->        <jaxrs:extensionMappings>            <entry key="json" value="application/json"/>            <entry key="xml" value="application/xml"/>        </jaxrs:extensionMappings>        <!--编码格式-->        <jaxrs:languageMappings>                    </jaxrs:languageMappings>        <!--对象转换-->        <jaxrs:providers>            <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"/>        </jaxrs:providers>            </jaxrs:server></beans>
复制代码

备注:注意以上文件中的标记的地方!其中address可以用于指定Web Service的版本!


配置web.xml

复制代码
<!--全局配置文件-->    <context-param>        <param-name>contextConfigLocation</param-name>        <param-value>classpath*:applicationContext*.xml</param-value>    </context-param>        <!--spring的监听器-->    <listener>        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    </listener>        <!--cxf的Servlet-->    <servlet>        <servlet-name>CXFServlet</servlet-name>        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>    </servlet>    <servlet-mapping>        <servlet-name>CXFServlet</servlet-name>        <url-pattern>/services/*</url-pattern>    </servlet-mapping>    
复制代码

 

实体类StudentVo .java

复制代码
package com.wangzhu.vo;import java.io.Serializable;import javax.xml.bind.annotation.XmlRootElement;@XmlRootElementpublic class StudentVo implements Serializable {    /**     *      */    private static final long serialVersionUID = -5481609827444603990L;    private Integer id;    private String name;    private Integer age;    private String desc;    private Boolean status;    public StudentVo() {    }    public StudentVo(Integer id, String name, Integer age, String desc,            Boolean status) {        this.id = id;        this.name = name;        this.age = age;        this.desc = desc;        this.status = status;    }    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    public String getDesc() {        return desc;    }    public void setDesc(String desc) {        this.desc = desc;    }    public Boolean getStatus() {        return status;    }    public void setStatus(Boolean status) {        this.status = status;    }    @Override    public String toString() {        return "{id=" + id + ", name=" + name + ", age=" + age + ", desc="                + desc + ", status=" + status + "}";    }}
复制代码

 

实体类StudentListVo.java

复制代码
package com.wangzhu.vo;import java.io.Serializable;import java.util.List;import javax.xml.bind.annotation.XmlRootElement;@XmlRootElementpublic class StudentListVo implements Serializable {    /**     *      */    private static final long serialVersionUID = -2200047544608641662L;    private List<StudentVo> studentList;    public StudentListVo() {    }    public StudentListVo(List<StudentVo> studentList) {        this.studentList = studentList;    }    public List<StudentVo> getStudentList() {        return studentList;    }    public void setStudentList(List<StudentVo> studentList) {        this.studentList = studentList;    }    @Override    public String toString() {        return "{studentList=" + studentList + "}";    }}
复制代码

 

数据生成器StudentDateSet.java

复制代码
package com.wangzhu.dataset;import java.util.ArrayList;import java.util.List;import org.springframework.stereotype.Component;import com.wangzhu.vo.StudentVo;@Componentpublic class StudentDateSet {    private static List<StudentVo> list;    static {        StudentDateSet.list = new ArrayList<StudentVo>();        for (int i = 0; i < 10; i++) {            StudentVo vo = new StudentVo(i, "name" + i, Math.round(100.0f),                    "desc" + i, (i & 1) == 0);            StudentDateSet.list.add(vo);        }    }    public static List<StudentVo> getList() {        return StudentDateSet.list;    }}
复制代码

 

Web Service的接口StudentService.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.wangzhu.service;
 
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
 
import com.wangzhu.vo.StudentListVo;
import com.wangzhu.vo.StudentVo;
 
@Path("/studentService")
@Produces(MediaType.APPLICATION_JSON)
public interface StudentService {
 
    @GET
    @Path("/status")
    publicString getStatus();
 
    @GET
    @Path("/students/{index}")
    publicStudentVo getStudentById(@PathParam("index") Integer id);
 
    @GET
    @Path("/students")
    publicStudentListVo getStudentList();
}

 

Web Service的实现类StudentServiceImpl.java

复制代码
package com.wangzhu.service.impl;import java.util.List;import javax.ws.rs.GET;import javax.ws.rs.Path;import javax.ws.rs.PathParam;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import com.wangzhu.dataset.StudentDateSet;import com.wangzhu.service.StudentService;import com.wangzhu.vo.StudentListVo;import com.wangzhu.vo.StudentVo;@Component("studentService")public class StudentServiceImpl implements StudentService {    @Autowired    private StudentDateSet studentDateSet;    /**     * url:http://<host>:<port>/<appcontext>/services/studentService/status     */    @Override    @GET    @Path("/status")    public String getStatus() {        return "getStatus";    }    /**     * url:http://<host>:<port>/<appcontext>/services/studentService/students/{     * index}     */    @Override    @GET    @Path("/students/{index}")    public StudentVo getStudentById(@PathParam("index") Integer id) {        List<StudentVo> studentList = StudentDateSet.getList();        StudentVo vo = null;        if (studentList.size() > id) {            vo = studentList.get(id - 1);        }        return vo;    }    /**     * url:http://<host>:<port>/<appcontext>/services/studentService/students     */    @Override    @GET    @Path("/students")    public StudentListVo getStudentList() {        List<StudentVo> studentList = StudentDateSet.getList();        StudentListVo listVo = new StudentListVo(studentList);        return listVo;    }}
复制代码


备注:注意以上有标记的studentServiceapplicationWebService.xml中有同名的标记。

 

测试:

在浏览器的地址栏中输入:

1、http://<host>:<port>/<appcontext>/services/studentService/students

2、http://<host>:<port>/<appcontext>/services/studentService/students/1