zoukankan      html  css  js  c++  java
  • 使用CXF与Spring集成实现RESTFul WebService

    以下引用与网络中!!!
       
    一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
        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;
    
    @XmlRootElement
    public 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;
    
    @XmlRootElement
    public 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;
    
    @Component
    public 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

    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")
    	public String getStatus();
    
    	@GET
    	@Path("/students/{index}")
    	public StudentVo getStudentById(@PathParam("index") Integer id);
    
    	@GET
    	@Path("/students")
    	public StudentListVo 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

  • 相关阅读:
    关于软件生命周期以及软件过程
    尴尬!Jsp内置对象
    软件工程导论的课后作业
    Bing Maps进阶系列五:通过DeepEarth的MiniMap控件为Bing Maps扩展迷你小地图
    Bing Maps进阶系列四:路由功能服务(RouteService)
    Bing Maps进阶系列三:使用地图图像服务(ImageryService)
    Bing Maps进阶系列二:使用GeocodeService进行地理位置检索
    Bing Maps进阶系列一:初识Bing Maps地图服务
    在C#中实现listbox的项上下移动(winform) 标准
    C# LIstbox 解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题
  • 原文地址:https://www.cnblogs.com/xiaoxian1369/p/4332390.html
Copyright © 2011-2022 走看看