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

Restlet 2.0 边学边写(六)使用html form访问Restlet的PUT和DELETE

    博客分类:
  • REST
阅读更多
上一次实践实现了POST、PUT和DELETE方法,并使用html form访问了POST和GET方法,本次实践将使用html form来访问PUT和DELETE方法。

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

1.html
修改WebRoot/目录下的index.jsp,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
	</head>

	<body>
		<a href="/firstSteps/spring/customers">get customers</a>
		<a href="post.jsp">post customers</a>
		<a href="get.jsp">get customer</a>
		<a href="put.jsp">put customer</a>
		<a href="delete.jsp">delete customer</a>
	</body>
</html>

页面上的链接对应了上一次实践创建的各个资源的访问方法。

在WebRoot/目录下新建post.jsp,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
	</head>

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

页面会将form中的信息post到/firstSteps/spring/customers。

在WebRoot/目录下新建get.jsp,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<script type="text/javascript">
			function getCustomer(){
				document.getElementById("form").action="/firstSteps/spring/customers/"+document.getElementById("id").value;
				document.getElementById("form").submit();
			}
		</script>
	</head>

	<body>
		<form action="/firstSteps/spring/customers/0" method="get" name="form" id="form">
			id:
			<input type="text" name="id" id="id">
			<br>
			<input type="button" value="submit" onclick="getCustomer();">
		</form>
	</body>
</html>

页面会使用get方式访问/firstSteps/spring/customers/{custId}。

在WebRoot/目录下新建put.jsp,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<script type="text/javascript">
			function putCustomer(){
				document.getElementById("form").action="/firstSteps/spring/customers/"+document.getElementById("id").value+"?method=put";
				document.getElementById("form").submit();
			}
		</script>
	</head>

	<body>
		<form action="/firstSteps/spring/customers/0?method=put" method="post" name="form" id="form">
			id:
			<input type="text" name="id" id="id">
			<br>
			name:
			<input type="text" name="name">
			<br>
			address:
			<input type="text" name="address">
			<br>
			<input type="button" value="submit" onclick="putCustomer();">
		</form>
	</body>
</html>

页面会使用put方式将form中的信息提交至/firstSteps/spring/customers/{custId}。

在WebRoot/目录下新建delete.jsp,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<script type="text/javascript">
			function deleteCustomer(){
				document.getElementById("form").action="/firstSteps/spring/customers/"+document.getElementById("id").value+"?method=delete";
				document.getElementById("form").submit();
			}
		</script>
	</head>

	<body>
		<form action="/firstSteps/spring/customers/0?method=delete" method="post" name="form" id="form">
			id:
			<input type="text" name="id" id="id">
			<br>
			<input type="button" value="submit" onclick="deleteCustomer();">
		</form>
	</body>
</html>

页面会使用delete方式访问/firstSteps/spring/customers/{custId}。

2.测试
部署firstSteps后,使用浏览器访问http://localhost:8080/firstSteps/,并将页面上的五个链接在新页面中打开访问。
在post.jsp中输入[name=0, address=0]并提交form,可以看到提示信息
  • post customer id :0,Customer [name=0, address=0]

刷新get customers"链接页面,可以看到提示信息
  • {0=Customer [name=0, address=0]}

在get.jsp中输入[id=0]并提交form,可以看到提示信息
  • get customer id :0,Customer [name=0, address=0]

说明通过form访问post和get方法成功。

在put.jsp中输入[id=0, name=0, address=0]并提交form,可以看到提示信息
  • Method Not Allowed
  • The method specified in the request is not allowed for the resource identified by the request URI
  • You can get technical details here.
  • Please continue your visit at our home page.

在delete.jsp中输入[id=0]并提交form,看到提示信息同上。
说明通过form访问put和delete方法失败。

3.TunnelService和methodParameter
从上面的测试中我们可以看到,不能通过form来直接访问put和delete方法。那要怎么才能方便的从页面上调用Rest呢?幸好Restlet中提供了TunnelService来设置方法参数。

参考org.restlet.Application类中代码:
    public TunnelService getTunnelService()
    {
        return (TunnelService)getServices().get(org/restlet/service/TunnelService);
    }

参考org.restlet.service.TunnelService类中代码:
    public TunnelService(boolean enabled, boolean methodTunnel, boolean preferencesTunnel, boolean queryTunnel, boolean extensionsTunnel, boolean userAgentTunnel, boolean headersTunnel)
    {
        super(enabled);
        this.extensionsTunnel = extensionsTunnel;
        this.methodTunnel = methodTunnel;
        this.preferencesTunnel = preferencesTunnel;
        this.queryTunnel = queryTunnel;
        this.userAgentTunnel = userAgentTunnel;
        this.headersTunnel = headersTunnel;
        characterSetParameter = "charset";
        encodingParameter = "encoding";
        languageParameter = "language";
        mediaTypeParameter = "media";
        [b][color=red]methodParameter = "method";[/color][/b]
        methodHeader = "X-HTTP-Method-Override";
    }

可以看到TunnelService构造函数中默认的methodParameter属性值为"method"。这样只要使用了Application并且指定提交时的method参数为post/put/delete/get,就可以方便的调用了。

4.使用Application
修改com.sunny.restlet.order.CustomerApplication类,代码如下:
package com.sunny.restlet.order;

import org.restlet.Application;
import org.restlet.Context;
import org.restlet.Restlet;
import org.restlet.routing.Router;

public class CustomerApplication extends Application {

	@Override
	public Restlet createRoot() {
		// TODO Auto-generated method stub
		Router router = new Router(getContext());
		router.attach("/", CustomerResource.class);
		router.attach("/", CustomersResource.class);
		return router;
	}

}

类中将涉及到的资源CustomerResource和CustomersResource都绑定到"/"路径上。

修改src/目录下的applicationContext.xml,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans default-autowire="byName"
	xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
	<!-- component -->
	<bean id="component" class="org.restlet.ext.spring.SpringComponent">
		<property name="defaultTarget" ref="application" />
	</bean>
	<!-- application -->
	<bean id="application" class="com.sunny.restlet.order.CustomerApplication">
		<lookup-method name="createRoot" bean="restRouter" />
	</bean>
	<!-- router -->
	<bean id="restRouter" class="org.restlet.ext.spring.SpringBeanRouter">
	</bean>
	<!-- resource -->
	<bean name="/customers" id="customersResrouce"
		class="com.sunny.restlet.order.CustomersResource" />
	<bean name="/customers/{custId}" id="customerResrouce"
		class="com.sunny.restlet.order.CustomerResource" />
	<bean name="/orders/{orderId}/{subOrderId}" id="orderResrouce"
		class="com.sunny.restlet.order.OrderResource" />
	<!-- dao -->
	<bean id="orderDao" class="com.sunny.restlet.order.OrderDaoImpl" />
</beans>  

配置中加入了CustomerApplication的配置,行成了Component>Application>Router>Resource的配置链。

5.运行
重新部署程序后,按照第二节测试步骤进行测试。
使用浏览器访问http://localhost:8080/firstSteps/,并将页面上的五个链接在新页面中打开访问。
在post.jsp中输入[name=0, address=0]并提交form,可以看到提示信息
  • post customer id :0,Customer [name=0, address=0]

在get.jsp中输入[id=0]并提交form,可以看到提示信息
  • get customer id :0,Customer [name=0, address=0]

说明通过form访问post和get方法成功。

在put.jsp中输入[id=0, name=00, address=00]并提交form,可以看到提示信息
  • put customer id:0,Customer [name=00, address=00]

刷新get customers"链接页面,可以看到提示信息
  • {0=Customer [name=00, address=00]}

说明访问put方法成功。

在delete.jsp中输入[id=0]并提交form,可以看到提示信息
  • delete customer id :0

刷新get customers"链接页面,可以看到customers为空,说明访问delete方法成功。

6.思考
我们可以直接在提交时使用method参数,也可以更改参数名。
在com.sunny.restlet.order.CustomerApplication类中加入构造方法,代码如下:
	public CustomerApplication() {
		super();
		getTunnelService().setMethodParameter("_methodName");
		// TODO Auto-generated constructor stub
	}

构造其中将methodParameter设置为"_methodName",这样在页面提交时,将form的action修改为/firstSteps/spring/customers/0?_methodName=put就可以了。

在提交时,如果form的method属性(非action的method参数)不设置或者为get,那不管method参数是什么值,都只能访问到get方法。
如果form的method属性设置为post,那method参数的值只能是post/put/delete(不设置默认为post),否则会报Method Not Allowed错误。

虽然Spring在不配置CustomerApplication时会自己创建一个默认的Application,但这个默认Application却不支持method参数。而使用CustomerApplication配合method参数可以在页面上方便的调用put和delete,但是Application的配置却写死在了代码中,也算有得有失。要是大家有好的解决方法,请告诉我,谢谢。

分享到:
评论
1 楼 gaofeng_867 2013-02-21  
我用的restlet2.1 , CustomerApplication要实现createInboundRoot方法,给大家提醒一下 

相关推荐

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

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

    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

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

    restlet

    RESTlet是一款开源框架,专为构建基于REST(Representational ...通过学习这些资料,开发者可以深入理解RESTlet的工作原理,掌握如何使用RESTlet构建RESTful服务和客户端应用,从而提升其在Web服务开发领域的专业技能。

    基于Spring的Restlet实例

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

    Restlet开发实例

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

    FE助手和Restlet Client

    "fe.crx"文件则可能是FE助手的Chrome扩展程序,同样方便开发者在浏览器中快速访问和使用其功能。这样的设计使得开发者无需离开浏览器就可以进行API交互,提高了开发流程的连贯性。 总的来说,FE助手和Restlet ...

    Restlet Client 插件安装包

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

    org.restlet-2.3.0.jar 最新版本

    5. **更易用的API**:简化了API接口,降低了学习曲线,使得开发者能够更快速地集成和使用RESTlet。 6. **扩展性**:提供了丰富的扩展点,可以方便地添加自定义处理器、过滤器和组件,满足特定业务需求。 7. **文档...

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

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

    restlet实现最简单的restful webservice

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

    RestletClient接口调试

    RestletClient是一款强大的接口调试工具,它为开发者提供了一个便捷的平台来测试、调试和分析RESTful Web服务。在Web应用程序开发过程中,接口调试是非常重要的一环,它可以帮助开发者验证API的功能,确保数据的正确...

    restlet restful

    RESTful API提供了一种标准化的方式来暴露和访问数据,使得不同应用、服务之间可以轻松地共享和交换数据。它通常以JSON或XML格式传输数据,这两种格式易于解析且跨平台兼容性好。 "绝对不坑"可能意味着这个项目或者...

    restlet项目

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

    Restlet in action 中文

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

    RESTlet自用2

    RESTlet是一个开源框架,专为构建RESTful Web服务和客户端应用程序设计。REST(Representational State Transfer)是一种软件架构风格,广泛应用于Web服务的设计,强调简洁、无状态和可缓存等原则,以提高效率和可...

    Restlet所需要的所有jar包

    在使用过程中,要注意版本兼容性问题,确保Restlet框架及其依赖库与你的Java运行环境和其它库相兼容。此外,理解RESTful设计原则,如资源的URI定位、状态码的使用、无状态通信等,对于有效利用Restlet构建高质量的...

    RESTLET开发

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

Global site tag (gtag.js) - Google Analytics