`
iamweiming
  • 浏览: 40986 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

RESTLET开发实例(二)使用Component、Application的REST服务

 
阅读更多

 

上一篇文章,我们介绍了基于JAX-RS的REST服务,本篇文章我们介绍不基于JAX-RS的模式。JAX-RS其实就是一个简单的Application服务。和我们接下来介绍的Application基本一致,唯一不同的地方就是,不使用JAX-RS自动映射为xml。restlet的一些基本概念可以参考上篇文章 RESTLET开发实例(一)基于JAX-RS的REST服务 的介绍,这里不再阐述。

一、基于ServerResource的REST,来实现JAX-RS中get方法。

1、新建RestApplication Web工程。

然后把相应的restlet的lib下的全部jar加入工程引用中,然后在web.xml,加入如下配置:

<context-param>

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

<param-value>org.lifeba.ws.app.RestSimpleApplication</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>

上面的配置和基于JAX-RS的配置一样的。

2、新建RestSimpleApplication对象。将应用程序和资源类绑定在一起,代码如下:

public class RestSimpleApplication extends org.restlet.Application{

@Override

public Restlet createInboundRoot() {

Router router = new Router(getContext());

router.attach("/student/{studentId}", StudentResource.class);

return router;

}

}

和JAX-RS不同主要有2个地方:

1)RestSimpleApplication直接扩展了Application对象,而不是JAX-RS中的JaxRsApplication对象。

2)重载了createInboundRoot通过attach方法绑定资源类,并且制定了访问路径。而JAX-RS中调用了this.add(new StudentApplication())来绑定资源类,并且不用指定访问路径,因为是在资源类中指定。

3、新建Student对象,代码如下:和JAX-RS的区别就是少了@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;

}

public String toString(){

return "Id:"+this.id+"\r\nName:"+this.name+"\r\nClass:"+

this.clsId+"\r\nSex:"+this.sex+"\r\nAge:"+this.age;

}

}

4、新建StudentResource类,该类扩展ServerResource类。代码如下:

public class StudentResource extends ServerResource{

private int id;

@Override

protected void doInit() throws ResourceException {

id = Integer.valueOf((String) getRequestAttributes().get("studentId"));

}

@Get

public Representation get(Representation entity) {

Student student = ResourceHelper.findStudent(id);

return new StringRepresentation(student.toString());

}

}

上面的代码实现的功能和JAX-RS中的下面的代码的功能一样,都是根据ID来获取对应的student信息。

@GET

@Path("{id}/xml")

@Produces("application/xml")

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

return ResourceHelper.findStudent(id);

}

非JAX-RS模式的,扩展了ServerResource类,并且重载了doInit()方法用来获取传递过来的studentId占位符的值。因为没有传递method方法,默认是调用@Get标注的无参方法,最后返回StringRepresentation对象(你也可以返回xml或json的Representation对象)。

JAX-RS的也是类似,不过他的方法是带参数,并且返回一个Student对象(会根据@Produces("application/xml")自动封装xml数据)。

5、完成了上面的主要类得创建和编写,你就可以在tomcat中运行了,启动tomcat后,访问http://localhost:8085/RestApplication/student/1,你将看到下面界面:

二、实现更新、删除、添加(delete,put,post)及列表展示

1、上面的介绍,我们实现将JAX-RS中的get方法,用ServerResource方式的来实现。根据rest规范,对StudentResource,除了有get方法外,还有delete及put方法。

@Delete

public Representation delete() {

int status = ResourceHelper.deleteStudent(id);

return new StringRepresentation(String.valueOf(status));

}

@Put

public Representation put(Representation entity)

throws ResourceException {

Form form = new Form(entity);

Student student = ResourceHelper.findStudent(id);

String name = form.getFirstValue("name");

int clsId = Integer.parseInt(form.getFirstValue("clsId"));

int sex = Integer.parseInt(form.getFirstValue("sex"));

student.setClsId(clsId);

student.setName(name);

student.setSex(sex);

return new StringRepresentation(String.valueOf(ResourceHelper.updateStudent(student)));

}

2、测试更新和删除:

1)通过页面修改用户资料

update.jsp页面中加入:

<form action="/RestApplication/student/1?method=put" method="post">

用户名:<input type="text" name="name"><br>

班级:<input type="text" name="clsId"><br>

性别:<input type="text" name="sex"><br>

<input type="submit" value="提交">

</form>

提交后访问,返回1表示修改成功。

访问http://localhost:8085/RestApplication/student/1就会看到名字已经修改了。

2)通过客户端删除用户资料。新建Client类,加入如下代码,执行成功返回1.

public void student_delete(){

try {

ClientResource client = new ClientResource("http://localhost:8085/RestApplication/student/1");

Representation representation =client.delete();

System.out.println(representation.getText());

} catch (Exception e) {

e.printStackTrace();

}

}

这个时候访问 http://localhost:8085/RestApplication/student/1 ,会提示错误。因为找不到这个1的用户。

3、添加一个student,及显示全部student信息

1)StudentResource资源,按照restlet的规范,包含了get put delete方法。所以添加一个student及显示全部student信息我们需要再加入一个资源类StudentsResource,代码如下:

@Get

public Representation get(Representation entity) {

StringBuilder sb = new StringBuilder();

Iterator it = ResourceHelper.students.keySet().iterator();

while(it.hasNext()){

sb.append(ResourceHelper.students.get(it.next()).toString()+"\r\n\r\n");

}

return new StringRepresentation(sb.toString());

}

@Post

public Representation post(Representation entity)

throws ResourceException {

Form form = new Form(entity);

String name = form.getFirstValue("name");

int clsId = Integer.parseInt(form.getFirstValue("clsId"));

int sex = Integer.parseInt(form.getFirstValue("sex"));

Student student = new Student();

student.setClsId(clsId);

student.setName(name);

student.setSex(sex);

ResourceHelper.maxId++;

int id = ResourceHelper.maxId;

student.setId(id);

return new StringRepresentation(String.valueOf(ResourceHelper.addStudent(student)));

}

添加了上面代码后,我们还要在RestSimpleApplication添加下面代码,指定下资源类StudentsResource的访问路径才可以。

router.attach("/student", StudentsResource.class);

2)首先我们添加一个id为2的student对象,client类中加入下面代码,执行成功后返回新添加的studentid:2。

public void student_post(){

try {

Form queryForm = new Form();

queryForm.add("name","steven3");

queryForm.add("clsId","201002");

queryForm.add("sex","2");

queryForm.add("age","12");

ClientResource client = new ClientResource("http://localhost:8085/RestApplication/student");

Representation representation =client.post(queryForm.getWebRepresentation());

System.out.println(representation.getText());

} catch (Exception e) {

e.printStackTrace();

}

}

访问http://localhost:8085/RestApplication/student 如下,返回了全部的student资料:

可以看到我们已经成功添加了一个2的student。

三、使用Component绑定多个Application

我们已经实现了一个student的application。里面包含了2个资源类(StudentResource和StudentsResource)。如果我们加入一个course的资源类,我们可以按照上面的方式直接建立CourseResource,然后在RestSimpleApplication中绑定下 router.attach("/course/{courseId}", CourseResource.class)。不过这样处理会把业务逻辑混在一起,并不是很好的方法。因此我们建立一个RestCourseApplication,然后在这里绑定CourseResource类,来实现业务逻辑的分离。

RestCourseApplication代码如下:

public class RestCourseApplication extends org.restlet.Application{

@Override

public Restlet createInboundRoot() {

Router router = new Router(getContext());

router.attach("/course/{courseId}", CourseResource.class);

return router;

}

}

CourseResource代码如下:

public class CourseResource extends ServerResource{

private int id;

@Override

protected void doInit() throws ResourceException {

id = Integer.valueOf((String) getRequestAttributes().get("courseId"));

}

@Get

public Representation get(Representation entity) {

return new StringRepresentation("course id:"+id);

}

}

现在我们有2个Application了,web.xml中就不能使用org.restlet.application了,必须使用org.restlet.component。

<context-param>

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

<param-value>org.lifeba.ws.app.RestSimpleApplication</param-value>

</context-param>

把上面的代码改为:

<init-param>

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

<param-value>component</param-value>

</init-param>

新建RestComponent类,代码如下,因为必须执行路径,所以在访问的时候记得要带上对应的前缀。

public class RestComponent extends org.restlet.Component{

public RestComponent(){

getDefaultHost().attach("/a", new RestSimpleApplication());

getDefaultHost().attach("/b", new RestCourseApplication());

}

}

访问:http://localhost:8085/RestApplication/a/student

访问:http://localhost:8085/RestApplication/b/course/1

四、资源下载

RestApplication工程项目

 

 

转载自Life吧 本文永久链接地址:http://www.lifeba.org/arch/restlet_develop_application_component_2.html

分享到:
评论

相关推荐

    Restlet开发实例

    接下来,我们进入"RESTLET开发实例(二)使用Component、Application的REST服务.doc"。在Restlet框架中,Component是整个应用的基础,它负责管理和协调多个Application。Application则是实际处理HTTP请求的实体,它...

    RESTLET开发实例

    总结来说,"RESTLET开发实例"是一个介绍如何使用RESTlet框架创建REST服务的学习资源。这个实例可能包括了服务的配置、资源的定义、HTTP方法的处理,以及必要的依赖库。开发者可以通过这个实例深入了解RESTful服务的...

    restlet restful

    在Restlet框架中,"RestApplication"可能是一个实现了Restlet Application接口的类,负责初始化和管理REST服务的路由和行为。 总的来说,"restlet restful"项目是一个基于RESTlet框架的RESTful Web服务实现,提供了...

    RESTLET开发

    ### RESTLET开发实例详解 #### 一、RESTLET框架简介 **RESTLET**是一个轻量级且全面的框架,旨在实现REST(Representational State Transfer)原则与Java类之间的映射。该框架支持广泛的REST式系统构建,不仅仅...

    基于Spring的Restlet实例

    标题"基于Spring的Restlet实例"意味着我们将探讨如何在Spring环境中集成和使用Restlet库来开发REST服务。这通常涉及以下几个关键知识点: 1. **RESTful服务基础**:REST是一种软件架构风格,强调通过HTTP协议暴露...

    Restlet Client 插件安装包

    总之,`Restlet Client`是一款强大的REST API测试工具,它为开发者提供了便捷的API测试环境,是进行SpringBoot或其他基于REST架构项目开发时不可或缺的助手。通过熟练使用,可以极大地提升开发效率和质量。

    Restlet开发的Basic认证

    Restlet是一个轻量级的Java Web服务开发框架,它提供了构建RESTful(Representational State Transfer)应用程序的工具和API。REST是一种架构风格,强调简洁、无状态和可缓存的网络交互,常用于构建高性能、高可用性...

    REST服务示例入门

    2. 由于【1】的改动,使得只有以/rest开头的URL才能映射到某资源,使用rest服务时,必须要加上/rest。 3. 由于【1】的改动,RestComponent类注册application时将资源字符串加上了/rest。 4. 由于【1】的改动和本人...

    RESTLET开发(三)

    ### RESTLET开发(三):基于Spring的REST服务 #### 一、基于Spring配置的Rest简单服务 在本文档中,我们将深入探讨如何利用RESTlet框架与Spring框架结合,构建高效的RESTful服务。Spring框架因其强大的功能和灵活...

    RESTlet-jee-2.0.9自用.rar

    "RESTLET开发实例(一)基于JAX-RS的REST服务"可能是包含的一个教程或指南,它向读者展示了如何使用RESTlet和JAX-RS来构建REST服务。这个实例可能涵盖以下内容: 1. **基本概念**:解释RESTful原则和JAX-RS的核心...

    Restlet所需要的所有jar包

    5. **开发工具**:为了简化开发过程,Restlet还提供了IDE插件(如Eclipse和IntelliJ IDEA)以及测试工具,帮助开发者调试和测试REST服务。 在Java Web服务开发中,正确配置和使用这些jar包至关重要。首先,你需要将...

    Web Api调试工具 Chrome插件Restlet-Client-REST-API-Testing

    总之,Restlet Client - REST API Testing是Web API开发者和测试人员的得力助手,它提供了直观的界面和强大的功能,有助于提升API开发和测试的效率。无论是在开发过程中调试API,还是在项目完成后进行集成测试,这款...

    restlet-jee-2.0.6.zip_Restlet 2..0_Restlet framework2.0_org.rest

    Restlet框架是一个开源的、基于Java的REST(Representational State Transfer)应用开发框架,它为构建Web服务和轻量级应用程序提供了丰富的工具和支持。标题"restlet-jee-2.0.6.zip_Restlet 2..0_Restlet framework...

    restlet实现最简单的restful webservice

    本文将深入探讨如何使用Restlet来实现一个最简单的RESTful Web服务。 首先,了解REST的基本概念是必要的。REST强调的是资源的概念,通过URI(Uniform Resource Identifier)来标识,使用HTTP协议中的方法(如GET、...

    Restlet Client - REST API Testing

    Restlet Client - REST API Testing,用来发送请求,可用于测试后端代码,简单易用

    Restlet-Client-REST-API-Testing_v2.8.0.1

    总的来说,Restlet Client v2.8.0.1是针对REST API开发和测试的重要辅助工具,尤其适合前端开发者、API接口设计者和系统集成人员使用。其易用性和强大的功能使它在同类工具中脱颖而出,能够有效地帮助用户测试和优化...

    Restlet Client - REST API Testing(DHC)

    在现代软件开发中,REST (Representational State Transfer) API已经成为构建分布式系统和服务交互的主要方式。它们提供了轻量级、无状态和基于HTTP协议的接口,使得不同的应用和系统能够轻松地进行数据交换。为了...

    Restlet与Spring 集成

    `BaseApplication`类是自定义的Restlet应用程序,它使用`component.context`和`restRoute`。`restRoute`是一个Spring路由器,通过`attachments`映射将URL路径与处理资源的Spring Bean关联。 - **userContext.xml**...

Global site tag (gtag.js) - Google Analytics