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

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

    博客分类:
  • REST
阅读更多
上一次实践实现了各方法返回xml和json格式的数据,并在页面、程序进行读取和展示。本次实践将使jQuery脚本库,通过javascript+ajax来访问Restlet资源的各个方法,实现互联网中的CRUD操作。

1.Customer
为了方便页面调用Restlet,需要在Customer类中加入id属性作为唯一标识,。
修改com.sunny.restlet.order.Customer类,代码如下:
package com.sunny.restlet.order;

public class Customer {

	private String id;
	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;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

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

类中添加了id属性和getter/setter方法,修改了toString()方法。

2.OrderDaoImpl
因为Customer类中加入了id属性,所以要在add和update Customer前setId(custId)。
修改com.sunny.restlet.order.OrderDaoImpl类中的方法,代码如下:
	public String addCustomer(Customer customer) {
		// TODO Auto-generated method stub
		String indexStr = String.valueOf(index++);
		customer.setId(indexStr);
		customers.put(indexStr, customer);
		return indexStr;
	}

	public void updateCustomerById(Customer customer, String custId) {
		// TODO Auto-generated method stub
		if (customers.get(custId) != null) {
			customer.setId(custId);
			customers.put(custId, customer);
		}
	}

代码中对addCustomer和updateCustomerById方法进行了修改。

3.Resource
我们需要修改下资源的各个方法,使得方法返回的数据符合json格式。
修改com.sunny.restlet.order.CustomersResource类中的方法,代码如下:
	@Override
	protected Representation get() throws ResourceException {
		// TODO Auto-generated method stub
		Map customers = orderDao.getAllCustomers();
		return new JsonRepresentation(new JSONObject(customers, false));
	}

	@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);
		customer = orderDao.getCustomerById(id);
		if (customer == null) {
			new JsonRepresentation("{}");
		}
		return new JsonRepresentation(customer);
	}

代码中修改了get方法,使返回数据为new JsonRepresentation(new JSONObject(customers, false)),因为new JsonRepresentation(customers)不能很好的解析map中的对象。
post方法也进行了修改,当customer为空时返回new JsonRepresentation("{}"),否则json解析器会报错。

修改com.sunny.restlet.order.CustomerResource类中的方法,代码如下:
	@Override
	protected Representation delete() throws ResourceException {
		// TODO Auto-generated method stub
		String customerId = (String) getRequest().getAttributes().get("custId");
		orderDao.deleteCustomerById(customerId);
		return new JsonRepresentation("{\"message\":\"success\"}");
	}

	@Override
	protected Representation get() throws ResourceException {
		// TODO Auto-generated method stub
		String customerId = (String) getRequest().getAttributes().get("custId");
		Customer customer = orderDao.getCustomerById(customerId);
		if (customer == null) {
			return new JsonRepresentation("{}");
		}
		return new JsonRepresentation(customer);
	}

	@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);
		customer = orderDao.getCustomerById(customerId);
		if (customer == null) {
			return new JsonRepresentation("{}");
		}
		return new JsonRepresentation(customer);
	}

代码中修改了get和put方法,当customer为空时返回new JsonRepresentation("{}"),否则json解析器会报错。
delete方法也进行了修改,返回符合json格式的提示信息new JsonRepresentation("{\"message\":\"success\"}")。

4.jQuery
本次实践要在页面上使用javascript+ajax访问Restlet资源,最方便的当然是用jQuery库了,这里我使用的是1.2.6版本的jquery.pack.js,其他新版本也可以使用。
在WebRoot/目录下创建lib文件夹,将jquery.pack.js拷贝至该文件夹中。

5.页面
因为使用javascript来访问资源和页面展示,完全不需要服务端代码实现,所以这次使用html文件就行了。
在WebRoot/目录下创建list.html,代码如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<script type="text/javascript" src="lib/jquery.pack.js"></script>
		<script type="text/javascript">
			// 初始化函数,加载customers并显示,list
			$(function(){
				$.ajax({  
					url: 'spring/customers',  
					type: 'GET',  
					dataType: 'json',  
					timeout: 1000,  
					error: function(){  
					   alert('Error loading XML document');  
					},  
					success: function(data){  
						$.each(data, function(key, value){
							var row = $("#template").clone();
							row.find("#id").text(value.id);
							row.find("#name").text(value.name);
							row.find("#address").text(value.address);
							row.find("#operation").html("<a href='javascript:void(0);' id='operation"+ value.id + "' onclick='read(\""+value.id+"\");'>update</a>&nbsp;<a href='javascript:void(0);' onclick='deleteCustomer(\""+value.id+"\");'>delete</a>");                    
							row.attr("id","customer"+value.id);
							row.appendTo("#tbody");
						});
					}  
				}); 
			});
			// 显示新增界面
			function create_show(){
				if($("#create").css("display")=="none"){
					$("#create").css("display","block");
				}else{
					$("#create").css("display","none");
				}
			}
			// 新增,create
			function create(){
				$.ajax({  
					url: 'spring/customers',  
					type: 'POST',  
					data:{
						name:$('#create_name').val(),
						address:$('#create_address').val()
					},
					dataType: 'json',  
					timeout: 1000,  
					error: function(){  
					   alert('Error loading XML document');  
					},  
					success: function(data){ 
						if(data.id==undefined){
							alert("Error add customer");
						}else{
							var row = $("#template").clone();
							row.find("#id").text(data.id);
							row.find("#name").text(data.name);
							row.find("#address").text(data.address);
							row.find("#operation").html("<a href='javascript:void(0);' id='operation"+ data.id + "' onclick='read(\""+data.id+"\");'>update</a>&nbsp;<a href='javascript:void(0);' onclick='deleteCustomer(\""+data.id+"\");'>delete</a>"); 
							row.attr("id","customer"+data.id);
							row.appendTo("#tbody");
						}
						$("#create").css("display","none");
					}  
				}); 
			}
			// 查询,read
			function read(id){
				if($("#update").css("display")=="none"){
					$.ajax({  
						url: 'spring/customers/'+id,  
						type: 'GET',  
						dataType: 'json',  
						timeout: 1000,  
						error: function(){  
						   alert('Error loading XML document');  
						},  
						success: function(data){
							if(data.id==undefined){
								alert("no customer " + id);
								$("#customer"+id).remove();
							}else{
								var offset = $("#operation"+id).offset();
								var height = $("#operation"+id).height();
								$("#update").css("top", offset.top + height);
								$("#update").css("left", offset.left);
								$("#update_id").val(data.id);
								$("#update_name").val(data.name);
								$("#update_address").val(data.address);
								$("#update").css("display","block");
							}
						}  
					}); 
				}else{
					$("#update").css("display","none");
				}
			}
			// 修改,update
			function update(){
				$.ajax({  
					url: 'spring/customers/'+$('#update_id').val(),  
					type: 'PUT',  
					data:{
						name:$('#update_name').val(),
						address:$('#update_address').val()
					},
					dataType: 'json',  
					timeout: 1000,  
					error: function(){  
					   alert('Error loading XML document');  
					},  
					success: function(data){ 
							if(data.id==undefined){
								alert("no customer " + $('#update_id').val());
								$("#customer"+$('#update_id').val()).remove();
							}else{
								var row = $("#customer"+data.id);
								row.find("#name").text(data.name);
								row.find("#address").text(data.address);
								row.find("#operation").html("<a href='javascript:void(0);' id='operation"+ data.id + "' onclick='read(\""+data.id+"\");'>update</a>&nbsp;<a href='javascript:void(0);' onclick='deleteCustomer(\""+data.id+"\");'>delete</a>");                 
								row.attr("id","customer"+data.id);
							}
							$("#update").css("display","none");
					}  
				}); 
			}
			// 删除,delete
			function deleteCustomer(id){
				$.ajax({  
					url: 'spring/customers/'+id,  
					type: 'DELETE',  
					dataType: 'json',  
					timeout: 1000,  
					error: function(){  
					   alert('Error loading XML document');  
					},  
					success: function(data){ 
						if(data.message!="success"){
							alert("Error deleting customer" + id);
						}else{
							$("#customer"+id).remove();
						}
					}  
				}); 
			}
		</script>
	</head>
	<body>
		<a href="javascript:void(0);" onclick="create_show();">create</a>
		<!-- 新增界面 -->
		<div id="create" style="position:absolute; z-index:2; width:180px; height:150px; display:none; background-color:gray">
			name:&nbsp;&nbsp;&nbsp;
			<input type="text" id="create_name">
			<br>
			address:
			<input type="text" id="create_address">
			<br>
			<input type="button" id="create_button" value="create" onclick="create();">
			<input type="button" id="create_cancel" value="cancel" onclick="create_show();">
		</div>
		<!-- 修改界面 -->
		<div id="update" style="position:absolute; z-index:2; width:180px; height:150px; display:none; background-color:blue">
			name:&nbsp;&nbsp;&nbsp;
			<input type="hidden" id="update_id">
			<input type="text" id="update_name">
			<br>
			address:
			<input type="text" id="update_address">
			<br>
			<input type="button" id="update_button" value="update" onclick="update();">
			<input type="button" id="update_cancel" value="cancel" onclick="read(0);">
		</div>
		<div id="list">
			<table border="1" cellspacing="0">
				<thead>
					<tr>
						<th>id</th>
						<th>name</th>
						<th>address</th>
						<th>operation</th>
					</tr>
				</thead>
				<tbody id="tbody">
					<tr id="template">
						<td id="id"></td>
						<td id="name"></td>
						<td id="address"></td>
						<td id="operation"></td>
					</tr>
				</tbody>
			</table>
		</div>
	</body>
</html>

  • 页面加载时访问/customers的get方法读取现有Customers并展示,实现list。
  • 点击create链接时调用create_show()弹出新增Customer界面,提交后调用create()访问/customers的post方法,并将返回结果添加在表格最下方,实现create。
  • 点击update链接时调用read(id)查询Customer并展示在修改Customer界面,提交后调用update()访问/customer的put方法,并将返回结果修改至原来所在行,实现read和update。
  • 点击delete链接时调用deleteCustomer(id)删除Customer,并将原来所在行删除,实现delete。


6.测试
部署程序后,使用浏览器访问http://localhost:8080/firstSteps/list.jsp,可以看到空的表格和create链接。

依次进行create>read>update>delete操作,可以看到增删改查没有问题,说明使用javascript和ajax对Restlet资源的访问成功。

新开一个页面并将某个Customer删除后,在原来的页面中尝试read、update和delete操作,可以看到提示"no customer 0"信息,说明Restlet返回的new JsonRepresentation("{}")被成功解析为json数据。

7.Application
在本次实践中我们并没有使用html form配合method参数来访问资源的put和delete方法,而是使用jQuery提供的$.ajax方法中的参数type: 'PUT'和type: 'DELETE'来实现,所以第六章中对Application的配置就不是必须的了。
修改src/目录下的applicationContext.xml,代码如下:
	<!-- component -->
	<bean id="component" class="org.restlet.ext.spring.SpringComponent">
		<property name="defaultTarget" ref="restRouter" />
	</bean>
	<!-- application -->
	<!-- <bean id="application" class="com.sunny.restlet.order.CustomerApplication">
		<lookup-method name="createRoot" bean="restRouter" />
	</bean> -->

代码中仅注释掉application配置,并将component的defaultTarget引用指向restRouter,其他配置保持不变。这样spring就回到了第五章时的相同配置。

重新部署程序后进行测试,提示信息和效果保持不变,说明Application的配置删除成功。

应支持我的朋友要求,上传源码工程。


分享到:
评论
2 楼 zhb841474733 2013-07-31  
楼主可以共享一下源码工程吗?
1 楼 gaofeng_867 2013-02-26  
很受启发!感谢楼主

相关推荐

    restlet2.0版本jee源代码

    9. **测试和支持(Testing and Support)**: 除了源代码,Restlet 2.0还提供了示例和测试用例,帮助开发者更好地理解和学习如何使用框架。此外,社区支持和官方文档也提供了丰富的资源。 10. **版本2.0.14**: 这个...

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

    在这个场景中,我们关注的是"restlet2.0+spring3.0+hibernate3.3"的整合,这是一个经典的Java Web开发组合,分别代表了RESTful API、服务层管理和持久化层的优秀实践。 首先,让我们深入了解每个框架的核心特性: ...

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

    1. **组件模型**:Restlet框架采用组件模型,使得开发者可以轻松地定义资源(Resource)和代表资源的服务器端点(ServerResource)以及客户端代理(ClientProxy),以实现REST原则。 2. **统一API**:Restlet提供了...

    restlet实现最简单的restful webservice

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

    org.restlet-2.3.0.jar 最新版本

    org.restlet-2.3.0.jar作为其最新版本,对之前版本进行了优化和增强,提升了性能和兼容性,支持Java SE和Java EE环境,同时也适应了各种现代云平台。 在2.3.0版本中,org.restlet库引入了以下关键特性: 1. **模块...

    Restlet开发实例

    本系列的开发实例将带你深入理解并掌握Restlet框架的使用,从基础的JAX-RS实现到高级的Component和Application结构,再到与Spring框架的整合。 首先,我们来看看"RESTLET开发实例(一)基于JAX-RS的REST服务.doc"。...

    RESTLET开发

    RESTLET框架和JAX-RS API的结合使用大大简化了RESTful服务的开发过程,使得开发者能够更专注于业务逻辑而不是底层的技术细节。此外,RESTLET框架的灵活性还允许开发者轻松地扩展服务的功能,比如支持更多的数据格式...

    restlet

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

    Restlet所需要的所有jar包

    4. **扩展和模块**:Restlet框架提供了丰富的扩展机制,可以添加对其他技术(如OAuth认证、JAXB绑定、CDI集成等)的支持。这些扩展通常以单独的jar包形式存在,可以根据项目需求选择引入。 5. **开发工具**:为了...

    RESTLET框架学习书籍

    - **Restlet表示(Representations)**:掌握如何设计和使用Restlet中的数据表示。 - **Restlet应用安全性**:学习如何保障Restlet应用的安全性,包括认证、授权等。 - **RESTful Web API文档和版本控制**:理解...

    Restlet in action 中文

    【Restlet in Action 中文】这本书是一本针对Java开发者介绍Restlet框架的实战指南,旨在帮助读者更好地理解和使用RESTful Web API。Restlet是一个开源的Web框架,它以面向对象的方式提供了一系列类和示例,使得...

    基于Spring的Restlet实例

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

    restlet2.1学习笔记项目代码

    4. **路由(Route)**:Restlet使用`org.restlet.routing.Router`来映射不同的URI路径到相应的资源。这允许我们创建灵活的URL结构,每个路径都可以指向不同的处理逻辑。 5. **过滤器(Filter)**:过滤器允许在请求...

    FE助手和Restlet Client

    它们各自具有独特的优势和功能,对于开发者来说是不可或缺的资源。 首先,让我们了解一下FE助手。这个名字中的“FE”通常代表前端(Front-End),暗示这个工具可能主要面向前端开发者或者需要与前端接口进行交互的...

    Restlet Client 插件安装包

    7. **安全性**: 支持OAuth 2.0和其他身份验证机制,保障API测试的安全性。 ### 使用场景 - **API调试**: 开发者可以快速测试新创建的API端点,检查其功能是否正常。 - **性能测试**: 通过模拟大量并发请求,评估...

    Restlet学习的三篇文章

    Restlet组件模型包括客户端和服务器端的部分,如代表资源的`Representation`、处理请求的`Resource`、管理网络连接的`Connector`等。Restlet的灵活性使得开发者可以直接操作HTTP协议细节,这对于高级定制或者需要低...

    restlet2.0.9包

    5. **路由和过滤器**:通过Restlet,开发者可以利用路由器(Router)组件来映射URL路径到具体的资源处理类,同时,过滤器(Filter)机制可以用来在请求和响应之间执行预处理和后处理操作。 6. **客户端支持**:...

    RESTLET开发(三)

    现在我们已经配置好了一个简单的REST服务,下一步是测试基本的CRUD操作。我们将从添加一个学生对象开始。 ##### 1. 添加学生 (POST) ```java public void student_post() { try { Form queryForm = new Form(); ...

Global site tag (gtag.js) - Google Analytics