`
sb33060418
  • 浏览: 152090 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Restlet 2.0 边学边写(五)Restlet的POST、PUT和DELETE

    博客分类:
  • REST
阅读更多
上一次实践是将Restlet与spring集成,本次实践是将实现POST、PUT和DELETE方法。

参考:http://ajaxcn.iteye.com/blog/417596

1.pojo
在com.sunny.restlet.order包下创建Customer类,代码如下:
package com.sunny.restlet.order;

public class Customer {

	private String name;
	private String address;

	public Customer(String name, String address) {
		super();
		this.name = name;
		this.address = address;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	@Override
	public String toString() {
		return "Customer [name=" + name + ", address=" + address + "]";
	}
}

类定义了Customer的属性、构造方法和toString()方法。

2.Dao
修改com.sunny.restlet.order.OrderDao接口,代码如下:
package com.sunny.restlet.order;

public interface OrderDao {

	public String getOrderById(String orderId);

	public String getSubOrderById(String subOrderId);

	public Customer getCustomerById(String custId);
	
	public String addCustomer(Customer customer) ;
	
	public void updateCustomerById(Customer customer, String custId);
	
	public void deleteCustomerById(String custId);

}

接口中定义了对Customer的增删改查方法。

修改com.sunny.restlet.order.OrderDaoImpl类,代码如下:
package com.sunny.restlet.order;

import java.util.HashMap;
import java.util.Map;

public class OrderDaoImpl implements OrderDao {

	private Map<String, Customer> customers = new HashMap<String, Customer>();

	public Customer getCustomerById(String custId) {
		// TODO Auto-generated method stub
		return customers.get(custId);
	}

	public String addCustomer(Customer customer) {
		// TODO Auto-generated method stub
		String index = String.valueOf(customers.size());
		customers.put(index, customer);
		return index;
	}

	public void deleteCustomerById(String custId) {
		// TODO Auto-generated method stub
		customers.remove(custId);
	}

	public void updateCustomerById(Customer customer, String custId) {
		// TODO Auto-generated method stub
		customers.put(custId, customer);
	}

	public String getOrderById(String orderId) {
		// TODO Auto-generated method stub
		return "order" + orderId;
	}

	public String getSubOrderById(String subOrderId) {
		// TODO Auto-generated method stub
		return "subOrder" + subOrderId;
	}

}

接口中实现了对Customer的增删改查方法,并使用一个HashMap来模拟数据的持久化,新增Customer的key就是HashMap的size。

3.CustomerResource
接下来要修改com.sunny.restlet.order.CustomerResource类,重写父类ServerResource中的post/put/delete/get方法,代码如下:
package com.sunny.restlet.order;

import org.restlet.data.Form;
import org.restlet.representation.Representation;
import org.restlet.representation.StringRepresentation;
import org.restlet.resource.ResourceException;
import org.restlet.resource.ServerResource;

public class CustomerResource extends ServerResource {

	private OrderDao orderDao;

	@Override
	protected Representation delete() throws ResourceException {
		// TODO Auto-generated method stub
		String customerId = (String) getRequest().getAttributes().get("custId");
		orderDao.deleteCustomerById(customerId);
		return new StringRepresentation("delete customer id :" + customerId);
	}

	@Override
	protected Representation get() throws ResourceException {
		// TODO Auto-generated method stub
		String customerId = (String) getRequest().getAttributes().get("custId");
		return new StringRepresentation("get customer id :" + customerId + ","
				+ orderDao.getCustomerById(customerId));
	}

	@Override
	protected Representation post(Representation entity)
			throws ResourceException {
		// TODO Auto-generated method stub
		Form form = new Form(entity);
		String name = form.getFirstValue("name");
		String address = form.getFirstValue("address");
		Customer customer = new Customer(name, address);
		String id = orderDao.addCustomer(customer);
		return new StringRepresentation("post customer id :" + id + ","
				+ orderDao.getCustomerById(id));
	}

	@Override
	protected Representation put(Representation entity)
			throws ResourceException {
		// TODO Auto-generated method stub
		String customerId = (String) getRequest().getAttributes().get("custId");
		Form form = new Form(entity);
		String name = form.getFirstValue("name");
		String address = form.getFirstValue("address");
		Customer customer = new Customer(name, address);
		orderDao.updateCustomerById(customer, customerId);
		return new StringRepresentation("put customer id:" + customerId + ","
				+ orderDao.getCustomerById(customerId));
	}

	public void setOrderDao(OrderDao orderDao) {
		this.orderDao = orderDao;
	}
}

类中的post/put/delete/get方法分别对应POST/PUT/DELETE/GET请求。Restlet会自动根据请求类型不同来调用各自对应的方法。其中PUT/DELETE/GET请求需要custId参数,该参数从RequestURI的属性中获得;POST/PUT请求需要Customer数据,数据被封装在Representation entity中,通过Form类来读取。
方法中的处理结果都通过StringRepresentation来返回给调用者。

:我们删除了类变量customerId,改成了方法变量。因为在spring配置文件中,我们将CustomerResource bean定义为singleton单例模式,所有请求共用一个CustomerResource实例来提供服务。而单例模式中的类变量相当于static静态变量,后到的请求可能会修改前面请求中的customerId的值,导致运行参数错误,所以将customerId移至各方法中获取。同样,doInit()方法也不需要自行实现了。

4.测试页面
我们可以通过页面测试一下各个方法能否正常工作。
修改WebRoot/下的index.jsp,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>My JSP 'index.jsp' starting page</title>
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<meta http-equiv="description" content="This is my page">
	</head>

	<body>
		<form action="/firstSteps/spring/customers/0" method="post">
			name:
			<input type="text" name="name">
			<br>
			address:
			<input type="text" name="address">
			<br>
			<input type="submit" value="submit">
		</form>
	</body>
</html>

页面中定义了一个html form,将name和address属性通过POST方式提交。

5.运行
重新部署程序后,通过浏览器访问http://localhost:8080/firstSteps/可以看到页面和表单。填入name和address信息,如图所示。



点击提交,页面转向
http://localhost:8080/firstSteps/spring/customers/0,同时可以看到提示信息
  • post customer id :0,Customer [name=name1, address=address1]

说明通过form访问POST请求成功,新增的Customer编号为0。
在另一个页面中访问http://localhost:8080/firstSteps/spring/customers/0可以看到提示信息
  • get customer id :0,Customer [name=name1, address=address1]

说明访问GET请求成功。
将index.jsp中form的method修改为get,提交后也显示相同信息。
但默认的html from只能通过post/get,要想访问PUT和DELETE请求,可以使用Restlet提供的ClientResource类。

6.Test
在com.sunny.restlet.order包中创建Test类,代码如下:
package com.sunny.restlet.order;

import org.restlet.data.Form;
import org.restlet.representation.Representation;
import org.restlet.resource.ClientResource;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		try {
			ClientResource client = new ClientResource(
					"http://localhost:8080/firstSteps/spring/customers/0");
			Form form = new Form();
			form.add("name", "b");
			form.add("address", "b");
			Representation representation = client.post(form);
			System.out.println(representation.getText());
			representation = client.get();
			System.out.println(representation.getText());
			form.clear();
			form.add("name", "c");
			form.add("address", "c");
			representation = client.put(form);
			System.out.println(representation.getText());
			representation = client.get();
			System.out.println(representation.getText());
			representation = client.delete();
			System.out.println(representation.getText());
			representation = client.get();
			System.out.println(representation.getText());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

类中通过调用Restlet提供的ClientResource来进行测试。custId参数在创建ClientResource连接时传入;Customer数据通过Form来组装,调用post/put时传递。因为在CustomerResource中定义了返回结果类型是StringRepresentation,所以只需要调用representation.getText()就能得到返回数据。
调用顺序是POST>GET>PUT>GET>DELETE>GET。

7.运行
重新部署程序(重置通过页面POST的数据)后,运行Test类,可以看到控制台输出以下信息:
  • 2012-12-26 16:59:09 org.restlet.engine.http.connector.HttpClientHelper start
  • 信息: Starting the default HTTP client
  • post customer id :0,Customer [name=b, address=b]
  • get customer id :0,Customer [name=b, address=b]
  • put customer id:0,Customer [name=c, address=c]
  • get customer id :0,Customer [name=c, address=c]
  • delete customer id :0
  • get customer id :0,null

结合CustomerResource和Test类代码,我们可以分析程序运行流程:
  • 1a. 客户端 封装Customer数据[name=b, address=b],调用服务端POST请求,新增Customer;
  • 1b. 服务端 新增Customer,返回custId为0;
  • 2a. 客户端 调用服务端GET请求,查询custId为0的Customer;
  • 2b. 服务端 查询custId为0的Customer,返回Customer数据[name=b, address=b];
  • 3a. 客户端 封装新的Customer数据[name=c, address=c],调用服务端PUT请求,更新custId为0的Customer;
  • 3b. 服务端 更新custId为0的Customer,返回处理结果;
  • 4a. 客户端 调用服务端GET请求,查询custId为0的Customer;
  • 4b. 服务端 查询custId为0的Customer,返回Customer数据[name=c, address=c];
  • 5a. 客户端 调用服务端DELETE请求,删除custId为0的Customer;
  • 5b. 服务端 删除custId为0的Customer;
  • 6a. 客户端 调用服务端GET请求,查询custId为0的Customer;
  • 7b. 服务端 查询custId为0的Customer,返回null;

说明CustomerResource的POST/PUT/DELETE/GET方法测试调用成功。

8.思考
从index.jsp页面和Test类代码中我们都可以看到,在POST时指定了一个custId。这并不符合逻辑,因为在新增一个Customer之前我们并不知道它的custId,而且这个custId也并没有发挥作用,所以我们POST的对象应该是"/customers"而不是"customers/{custId}"。
在搭建MVC框架测试原型的时候,我们除了CRUD外还需要提供一个额外功能,那就是List,即显示所有资源。因为"customers/{custId}"中已经实现了get方法,可以通过"/customers"的get方法来实现。
我们需要新建一个CustomersResource,实现get/post方法来提供List和Post服务。

在com.sunny.restlet.order包中创建CustomersResource类,代码如下:
package com.sunny.restlet.order;

import java.util.Map;

import org.restlet.data.Form;
import org.restlet.representation.Representation;
import org.restlet.representation.StringRepresentation;
import org.restlet.resource.ResourceException;
import org.restlet.resource.ServerResource;

public class CustomersResource extends ServerResource {

	private OrderDao orderDao;

	@Override
	protected void doInit() throws ResourceException {
		// TODO Auto-generated method stub
		super.doInit();
	}

	@Override
	protected Representation get() throws ResourceException {
		// TODO Auto-generated method stub
		Map customers = orderDao.getAllCustomers();
		return new StringRepresentation(customers.toString());
	}

	@Override
	protected Representation post(Representation entity)
			throws ResourceException {
		// TODO Auto-generated method stub
		Form form = new Form(entity);
		String name = form.getFirstValue("name");
		String address = form.getFirstValue("address");
		Customer customer = new Customer(name, address);
		String id = orderDao.addCustomer(customer);
		return new StringRepresentation("post customer id :" + id + ","
				+ orderDao.getCustomerById(id));
	}

	public void setOrderDao(OrderDao orderDao) {
		this.orderDao = orderDao;
	}
}

类中定义了post/get方法,用来新增和显示所有Customer。

修改com.sunny.restlet.order.CustomerResource类,删除其中的post方法。

修改com.sunny.restlet.order.OrderDao接口,加入getAllCustomers方法:
	public Map getAllCustomers();


修改com.sunny.restlet.order.OrderDaoImpl类,实现getAllCustomers方法:
	public Map getAllCustomers() {
		// TODO Auto-generated method stub
		return customers;
	}

方法中只是简单的返回customers HashMap。

修改src/目录下的applicationContext.xml,加入如下配置:
	<bean name="/customers" id="customersResrouce"
		class="com.sunny.restlet.order.CustomersResource" />

配置中将CustomersResource发布到"/customers"路径。

修改WebRoot/目录下的index.jsp页面,将form的action地址修改为"/firstSteps/spring/customers"。

9.运行
重新部署程序后,通过浏览器访问http://localhost:8080/firstSteps/可以看到页面和表单。填入信息[name=name, address=address]。点击提交,页面转向
http://localhost:8080/firstSteps/spring/customers,同时可以看到提示信息
  • post customer id :0,Customer [name=name, address=address]

说明通过form访问"customers"的POST请求成功,新增的Customer编号为0。

再次访问http://localhost:8080/firstSteps/,填入信息[name=name1, address=address1]。点击提交,看到提示信息
  • post customer id :1,Customer [name=name1, address=address1]


在另一个页面中访问http://localhost:8080/firstSteps/spring/customers可以看到提示信息
  • {0=Customer [name=name, address=address], 1=Customer [name=name1, address=address1]}

说明访问"customers"的GET请求成功,并且显示了刚才新增的两个Customer。

将index.jsp中form的method修改为get,提交后也显示相同信息。

以上已经将"customers"的POST/GET和"customer"的PUT/DELETE/GET实现并测试完成。








  • 大小: 4.2 KB
分享到:
评论
3 楼 sb33060418 2014-05-20  
是不会调用方法还是方法里面有问题?如果是没有调用get方法,可能是因为没有加注释 @Override  或者版本不同的原因
2 楼 洋葱的逆袭与奋斗 2014-04-22  
首页改成get方法,取不到值啊
post可以。
1 楼 watson243671 2013-11-15  
不错,怎么做,写的非常详细。谢谢!

相关推荐

    Restlet 2.0 边学边写(八)使用jQuery和ajax实现对Restlet资源的CRUD操作

    在本篇博文中,我们将深入探讨如何利用jQuery和Ajax技术与Restlet 2.0框架进行交互,实现对Restful资源的创建(Create)、读取(Read)、更新(Update)和删除(Delete)操作,即CRUD操作。Restlet是一个开源的Java ...

    restlet2.0版本jee源代码

    在Restlet中,资源由一个或多个类实现,这些类处理特定的HTTP方法(如GET、POST、PUT、DELETE等)并返回适当的响应。 3. **引导器(Dispatcher)**: 引导器负责将HTTP请求路由到相应的资源。它可以基于URL路径、...

    restlet2.0+spring3.0+hibernate3.3.框架集成

    Restlet允许直接在类上使用HTTP方法注解,如`@Get`, `@Post`, `@Put` 和 `@Delete`。 - **集成Spring**:Spring可以作为Restlet应用的容器,管理Restlet组件的生命周期。同时,Spring的AOP功能可以用于事务管理和...

    restlet处理各种请求方式参考示例

    本示例将详细阐述如何使用Restlet框架处理HTTP协议中的各种请求方法,如GET、POST、PUT、DELETE等。 首先,让我们了解RESTlet的基本结构。在Restlet中,应用程序由资源(Resource)组成,这些资源是可交互的对象,...

    restlet

    REST是一种轻量级的架构风格,广泛应用于互联网应用的开发,它强调通过简单的HTTP方法(如GET、POST、PUT、DELETE)来操作资源,以实现高效、可扩展的网络通信。 RESTlet框架提供了客户端和服务器端的组件,使得...

    Restlet Client 插件安装包

    1. **请求构造**: `Restlet Client`允许用户手动输入或选择HTTP方法(GET、POST、PUT、DELETE等),设置URL,添加查询参数,以及定义HTTP头信息。对于POST、PUT等需要提交数据的方法,它支持多种数据格式,如JSON、...

    Restlet开发实例

    在这个实例中,你将学习如何使用Restlet框架结合JAX-RS来定义资源、处理HTTP方法(如GET、POST、PUT、DELETE等)以及如何处理JSON或XML数据。Restlet提供了JAX-RS兼容的组件,使得开发者可以轻松地在Restlet环境中...

    org.restlet-2.3.0.jar 最新版本

    REST是一种基于HTTP协议的轻量级设计模式,强调资源的概念,通过URI(Uniform Resource Identifier)来标识资源,并通过HTTP方法(如GET、POST、PUT、DELETE等)进行操作。RESTful API的设计使得服务接口简洁且易于...

    RESTlet自用2

    这样的资源通常会包含REST服务的创建、HTTP方法(GET、POST、PUT、DELETE等)的使用、URI设计、状态码选择、数据序列化等内容。 "restlet系列"可能是一系列有关RESTlet的教程或者文章集合,详细讲解了RESTlet框架的...

    restlet实现最简单的restful webservice

    Restlet是一款开源框架,专为构建RESTful Web服务和客户端应用程序设计。REST(Representational State Transfer)是一种轻量级的架构风格,广泛用于构建互联网应用,因为它提供了高效、分布式的系统设计原则。本文...

    基于Spring的Restlet实例

    每个Resource类包含处理HTTP请求的方法,如@Get、@Post、@Put和@Delete注解。 6. **数据序列化与反序列化**:在REST服务中,数据通常以JSON或XML格式交换。Restlet提供了解析和生成这些格式的能力,但也可以结合...

    restlet项目

    3. **定义HTTP方法**: 在Restlet类中覆盖`get()`, `post()`, `put()`, `delete()`等方法,以处理不同类型的HTTP请求。 4. **设置路由**: 指定Restlet将响应哪些URI路径。 5. **运行应用**: 将Restlet附加到一个...

    RestletClient接口调试

    RestletClient支持多种平台,包括桌面版和浏览器扩展,它允许用户发送各种HTTP请求,如GET、POST、PUT、DELETE等,并可以自定义头信息、查询参数、请求体等内容。这款工具提供了直观的用户界面,用户可以方便地输入...

    restlet restful

    RESTful是一种软件架构风格,设计模式,是基于HTTP协议的Web服务设计原则,强调资源的概念,通过URI来定位资源,通过HTTP方法(GET、POST、PUT、DELETE等)来操作资源。它简化了Web服务的开发,使得服务器端和客户端...

    restlet-jee-2.2.2

    1. **RESTful架构**:Restlet框架的核心理念是遵循REST原则,这包括资源定位(通过URI)、使用标准HTTP方法(GET、POST、PUT、DELETE等)操作资源、以及使用HTTP状态码来表示请求结果。 2. **组件模型**:Restlet...

    restlet工程示例

    Restlet是一个开源框架,专门用于构建RESTful(Representational State Transfer)Web...在压缩包文件"restlet"中,应该包含了实现上述功能的代码示例,通过学习和分析这些示例,你可以更好地理解和运用Restlet框架。

    Restlet学习的三篇文章

    它强调资源的概念,通过URI(统一资源标识符)来定位,并通过HTTP方法(如GET、POST、PUT、DELETE)进行操作。下面,我们将深入探讨基于JAX-RS和Restlet的REST服务开发,以及如何将Restlet与Spring框架整合。 1. **...

    谷歌Restlet Client插件

    它支持多种HTTP方法,如GET、POST、PUT、DELETE等,允许用户发送自定义请求头和POST数据,极大地简化了Web服务的交互过程。 在使用谷歌Restlet Client插件时,首先需要在你的谷歌浏览器上安装该插件。你可以通过...

    52-restlet.rar_restlet

    3. **路由与处理**:讲解如何使用Restlet来定义路由规则,将不同的HTTP请求映射到相应的处理函数,以及如何处理HTTP方法(GET、POST、PUT、DELETE等)。 4. **数据交换格式**:讨论Restlet支持的数据交换格式,如...

Global site tag (gtag.js) - Google Analytics