您的位置:首页 > 其它

RESTLET开发实例(一)基于JAX-RS的REST服务

2012-09-11 17:20 549 查看
RESTLET介绍

Restlet项目为“建立REST概念与Java类之间的映射”提供了一个轻量级而全面的框架。它可用于实现任何种类的REST式系统,而不仅仅是REST式Web服务。

Restlet项目受到Servlet API、JSP(Java Server Pages)、HttpURLConnection及Struts等Web开发技术的影响。该项目的主要目标是:在提供同等功能的同时,尽量遵守Roy Fielding博士论文中所阐述的REST的目标。它的另一个主要目标是:提出一个既适于客户端应用又适于服务端的应用的、统一的Web视图。

Restlet的思想是:HTTP客户端与HTTP服务器之间的差别,对架构来说无所谓。一个软件应可以既充当Web客户端又充当Web服务器,而无须采用两套完全不同的APIs。

准备工作

1、Restlet提供了多个版本:Java SE、Java EE、android、Google AppEngine、Google Web Toolkit、Android。

这里我们下载jee版本。

restlet-jee-2.0.6.zip 下载地址:http://www.restlet.org/downloads/2.0/restlet-jee-2.0.6.zip

2、restlet-jee-2.0.6.zip解压到硬盘,这里以%RESTLET_HOME%表示为解压的文件目录。

一、基于JAX-RS的REST服务

JAX-RS (JSR-311) 是一种 Java API,可使 Java Restful 服务的开发变得迅速而轻松。这个 API 提供了一种基于注释的模型来描述分布式资源。注释被用来提供资源的位置、资源的表示和可移植的(pluggable)数据绑定架构。在本文中,学习如何使用 JAX-RS 在 Java EE 环境内实现 RESTful 服务架构的潜能。

1、新建 web project RestService工程



2、%RESTLET_HOME%\lib 复制到 \RestService\WebRoot\WEB-INF\lib 下,并加入工程引用。为了测试方便可以将全部的lib包加入进去。实

际上面,你可以根据实际需要只复制相应的包进去即可。下面的图片是我加入的相关的jar包:





org.restlet.jar这个是必须的,如果是用于JAX-RS发布rest的话,还需要这几个包:

javax.ws.rs.jar

javax.xml.bind.jar

org.json.jar

org.restlet.ext.jaxrs.jar

org.restlet.ext.json.jar

org.restlet.ext.servlet.jar

3、创建Student实体类,用于返回数据。Student使用JAXB绑定技术,自动解析为xml返回给客户端或浏览器。

JAXB是一套自动映射XML和Java实例的开发接口和工具。JAXB使XML更加方便的编译一个XML SCHEMA到一个或若干个JAVA CLASS。可以从

使用
JAXB 进行数据绑定 获得详细介绍。

@XmlRootElement(name="Student")

public class Student {

private int id;

private String name;

private int sex;

private int clsId;

private int age;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getSex() {

return sex;

}

public void setSex(int sex) {

this.sex = sex;

}

public int getClsId() {

return clsId;

}

public void setClsId(int clsId) {

this.clsId = clsId;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

4、Restlet架构主要是Application和Resource的概念。程序上可以定义多个Resource,一个Application可以管理多个Resource。

创建应用类:StudentApplication 继承了抽象类:javax.ws.rs.core.Application,并重载getClasses()方法。代码如下:

Set<Class<?>> rrcs = new HashSet<Class<?>>();

rrcs.add(StudentResource.class);

StudentApplication类代码:

package com.lifei.app;

import java.util.HashSet;

import java.util.Set;

import javax.ws.rs.core.Application;

import com.lifei.resource.StudentResource;

public class StudentApplication extends Application {

@Override

public Set<Class<?>> getClasses() {

// TODO Auto-generated method stub

Set<Class<?>> rrcs = new HashSet<Class<?>>();

rrcs.add(StudentResource.class);

return rrcs;

}

}

绑定了StudentResource。有多个资源可以在这里绑定。你可以有Course等其他更多资源,相应的可以定义为:CourseResource及Course,然后加入rrcs.add(CourseResource.class)。

创建资源类:StudentResource管理Student实体类

@Path("student")

public class StudentResource {

@GET

@Path("{id}/xml")

@Produces("application/xml")

public Student getStudentXml(@PathParam("id") int id) {

return ResourceHelper.getDefaultStudent();

}

}

其中:

@Path("student")执行了uri路径,student路径进来的都会调用StudentResource来处理。

@GET 说明了http的方法是get方法。

@Path("{id}/xml") 每个方法前都有对应path,用来申明对应uri路径。

@Produces("application/xml") 指定返回的数据格式为xml。

@PathParam("id") int id 接受传递进来的id值,其中id为 {id}定义的占位符要一致。

和上面类似,我们可以定义返回json格式方法,如下

@GET

@Path("{id}/json")

@Produces("application/json")

public Student getStudentJson(@PathParam("id") int id) {

return ResourceHelper.findStudent(id);

}

其中:

@Produces("application/json") 指定返回的数据格式为json。

StudentResource类代码:

package com.lifei.resource;

import com.lifei.model.Student;

import com.lifei.resource.ResourceHelper;

import javax.ws.rs.GET;

import javax.ws.rs.Path;

import javax.ws.rs.PathParam;

import javax.ws.rs.Produces;

@Path("student")

public class StudentResource{

@GET

@Path("{id}/xml")

@Produces("application/xml")

public Student getStudentXml(@PathParam("id") int id) {

return ResourceHelper.getDefaultStudent();

}

@GET

@Path("{id}/json")

@Produces("application/json")

public Student getStudentJson(@PathParam("id") int id) {

return ResourceHelper.findStudent(id);

}

public String getsayHello(){

return "hello world ,i'm here !";

}

}

5、定义了相应的Resource和Application后,还要创建运行环境。RESTlet 架构为了更好的支持 JAX-RS 规范,定了 JaxRsApplication 类来初始化基于 JAX-RS 的 Web Service 运行环境。

创建运行类:RestJaxRsApplication 继承了类:org.restlet.ext.jaxrs.JaxRsApplication。构造方法代码如下:

public RestJaxRsApplication(Context context) {

super(context);

this.add(new StudentApplication());

}

将StudentApplication加入了运行环境中,如果有多个Application可以在此绑定。

RestJaxRsApplication类代码:

package com.lifei.app;

import org.restlet.Context;

import org.restlet.ext.jaxrs.JaxRsApplication;

public class RestJaxRsApplication extends JaxRsApplication {

public RestJaxRsApplication(Context context) {

super(context);

this.add(new StudentApplication());

}

}

二、发布和部署restlet服务

1、将Restlet服务部署到 Tomcat容器中

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">

<display-name></display-name>

<servlet>

<display-name>JAX-RS REST Servlet</display-name>

<servlet-name>JAX-RS REST Servlet</servlet-name>

<servlet-class>

com.sun.jersey.spi.container.servlet.ServletContainer

</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>JAX-RS REST Servlet</servlet-name>

<url-pattern>/services/*</url-pattern>

</servlet-mapping>

<context-param>

<param-name>org.restlet.application</param-name>

<param-value>com.lifei.app.RestJaxRsApplication</param-value>

</context-param>

<servlet>

<servlet-name>RestletServlet</servlet-name>

<servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>RestletServlet</servlet-name>

<url-pattern>/*</url-pattern>

</servlet-mapping>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

</web-app>

启动tomcat没报错的话,说明你配置正常。

2、将Restlet服务当做单独的Java 程序进行部署

创建类 RestJaxRsServer,代码如下:

public static void main(String[] args) throws Exception {

Component component = new Component();

component.getServers().add(Protocol.HTTP, 8085);

component.getDefaultHost().attach(new RestJaxRsApplication(null));

component.start();

}

该类中创建一个新的 Http Server,添加监听端口8085。将RestJaxRsApplication加入到 Http Server 中。运行该代码,下图说明你启动成功。



三、测试Restlet服务

1、浏览器模式

访问xml数据 http://localhost:8085/RestService/student/1/xml





如果访问不成功的话用一下URL试试:http://localhost:8080/RestService/student/1/xml



访问json数据 http://localhost:8085/RestService/student/1/json 提示下载数据,下载后打开数据内容为

{"name":"Steven","id":1,"age":0,"sex":1,"clsId":201001}





如果访问Json不成功的话用一下URL试试:http://localhost:8080/RestService/student/1/json



如果是独立部署的话,直接访问:http://localhost:8085/student/1/xml 即可。

2、Restlet自带了客户端测试代码,目前提供了jee、webkit、android等版本,调用rest服务,非常方便。

新建Client类,代码如下:

//public static String url="http://localhost:8085/";

public static String url="http://localhost:8085/RestService/";

public static void testXml() {

ClientResource client = new ClientResource(url+"student/1/xml");

try {

System.out.println(client.get().getText());

} catch (ResourceException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public static void testJson() {

ClientResource client = new ClientResource(url+"student/1/json");

try {

System.out.println(client.get().getText());

} catch (ResourceException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

通过junit测试代码分别输出:







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: