2011年10月11日星期二

JDev_028:使用JDeveloper开发WebService之六:RESTFul

开发环境:JDeveloper 11.1.2.1.0。
完成《Integrating RESTFul Web Services》。

实验导读:
在WebService的世界中,REpresentational State Transfer (REST) 正越来越受重视。
REST把所有URLs都看做资源(Resouces),资源无外乎增删改查这四种操作。
而HTTP方法:PUT、GET、POST、Delete恰好对应Create、Read、Update、Delete (CRUD)操作。
因此就用HTTP的这些方法就可以对资源进行所有的操作。
网络上的所有资源都可以用统一的方法来访问和操作,这个想法如果能够实现该是多么美好!

REST并不是一个标准,而是一种被推荐的Web应用架构。
REST只是利用Web应用中现有的标准,构成自己的架构体系。
这些标准其实大家都耳熟能详:HTTP、URL、URI、XML、HTML、image、video、Resource Types和MIME Types。

REST风格的架构包括Client和Server两部分,特别是无状态的Client和Server。
并不是一个标准,而是一种被推荐的Web应用架构。

Client发送请求到Server,Server处理请求并返回响应到Client。
从本质上讲,请求和响应不过是同一资源的不同表现形式。
资源可以是任何有意义的东东。
所谓表现形式是资源在某种状态下的呈现内容,比如一个XML文档。
无论在何时,Client要么处在请求资源的状态之中,要么就在“休息”之中。
这和我们访问页面的行为是一致的,要么我们发起一个请求等待响应,要么我们什么也不做。
在REST看来,Client发送请求时,资源是从一个状态转换成到另一个状态。

REST最初是基于HTTP,但实际上并不局限于该协议。
正如前面介绍的,REST是一种架构,可以用于其它应用层协议。
只要这些应用层协议提供了丰富的状态转换字典,比如HTTP协议就提供了内置的4个方法。
REST风格的应用最大限度地利用了协议自身已有的接口定义和内置操作,无需其它的规范和标准。

【JAX-RS】:Java API for RESTful Web Services。用来创建Restful WebService的Java API。

实验内容:
本实验分为两部分:(1)从POJO创建Restful WebService (2)用ADF调用Restful WebService
从前面的WebService实验,我们已经知道了POJO+元注释=WebService,把POJO变成Restful WebService也不例外。
只不过Restful中增加了一些特别的元注释而已。

重要步骤说明:

1. 创建Custom应用和项目。
教程本身提供了一个Project,为了彻底弄清创建Restful WebService的流程,我从头新建了应用。


2. 创建Emp.java和Service.java类,把内容复制过来。
Service.java会提示有错,选择“Create Project for JAX-RS Web Service”。

package restful;

import java.util.*;

import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;

@Path("/restlab")
public class Service {

    // Singleton Collection
    static ArrayList loe = new ArrayList();

    public Service() {
        super();
    }

    //Create
    public void addEmp(@QueryParam("id")
        int id, @QueryParam("exp")
        int exp, @QueryParam("name")
        String name, @QueryParam("sal")
        int sal) {
        Emp e = newEmp(exp, name, sal, id);
        loe.add(e);
    }

    //Read
    @GET
    @Produces("application/xml")
    public ArrayList getEmps() {
        return loe;
    }

    //Update
    public void upadteEmp(int delId, int id, int exp, String name, int sal) {
        deleteEmp(delId);
        addEmp(id, exp, name, sal);
    }

    //Delete
    @DELETE
    public void deleteEmp(@QueryParam("id")
        int id) {
        loe.remove(getObj(id));
    }

    //Helper Methods
    @PUT
    @Path("defaultEmp")
    public Response addEmp() {
        loe.add(new Emp("Adderley", 1, 5, 1000));
        loe.add(new Emp("Coltrane", 2, 6, 2000));
        loe.add(new Emp("Davis", 3, 7, 3000));
        return Response.ok().build();
    }

    Emp newEmp(int exp, String name, int sal, int id) {
        return new Emp(name, id, exp, sal);
    }

    public Emp getObj(int id) {
        Iterator i = loe.iterator();
        while (i.hasNext()) {
            Emp emp = (Emp)i.next();
            if ((emp.getId()) == id) {
                System.out.println(emp.getName());
                return emp;
            }
        }
        return null;
    }
}

完成后,会发现Service.java的图标变了,并且增加一些目录和文件。

JAX-RS的jar包也自动加进来了。

3. 测试WebService。

测试GET方法

测试PUT方法

测试DELETE方法

注意,以上的方法分别对应Service.java中的对应方法。

4. 创建ADF Web 应用,调用Restful WebService。
Restful WebService开发部署完毕,该如何调用呢?
这里使用ADF中URL Service Data Control。
GET URL Service Data Control:

GET URL Service Data Control返回值:

DELETE URL Service Data Control:

页面最终运行效果。


5. 在页面上,点击Delete按钮,记录没有被删除问题。
经检查发现是DataControls.dcx中行 Source="Restful/jersey/restlab?id=##id##. "
有错,改成Source="Restful/jersey/restlab?id=##id##"就好了。

6. 进一步思考,创建PUT URL Service Data Control,这样在页面上,所有功能就都有了。
这个任务留给聪明的你吧。

Project 下载:Restful.7z

没有评论: