- 浏览: 152087 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
守望麦穗:
楼主好, 我按着你的步骤查找问题 ,到第二步,也没有自定义U ...
Spring Security3边学边写(N)会话管理和并行控制 -
sb33060418:
Notify 写道楼主,但是配置<concurrency ...
Spring Security3边学边写(N)会话管理和并行控制 -
Notify:
楼主,但是配置<concurrency-control ...
Spring Security3边学边写(N)会话管理和并行控制 -
409421884:
你好,我也在做这个功能,但sessionRegistry这个东 ...
Spring Security3边学边写(N)会话管理和并行控制 -
sb33060418:
左眼的彼岸 写道sb33060418 写道左眼的彼岸 写道谢谢 ...
Spring Security3边学边写(N)会话管理和并行控制
上一次实践实现了POST、PUT和DELETE方法,并使用html form访问了POST和GET方法,本次实践将使用html form来访问PUT和DELETE方法。
参考:http://ajaxcn.iteye.com/blog/434449
1.html
修改WebRoot/目录下的index.jsp,代码如下:
页面上的链接对应了上一次实践创建的各个资源的访问方法。
在WebRoot/目录下新建post.jsp,代码如下:
页面会将form中的信息post到/firstSteps/spring/customers。
在WebRoot/目录下新建get.jsp,代码如下:
页面会使用get方式访问/firstSteps/spring/customers/{custId}。
在WebRoot/目录下新建put.jsp,代码如下:
页面会使用put方式将form中的信息提交至/firstSteps/spring/customers/{custId}。
在WebRoot/目录下新建delete.jsp,代码如下:
页面会使用delete方式访问/firstSteps/spring/customers/{custId}。
2.测试
部署firstSteps后,使用浏览器访问http://localhost:8080/firstSteps/,并将页面上的五个链接在新页面中打开访问。
在post.jsp中输入[name=0, address=0]并提交form,可以看到提示信息
刷新get customers"链接页面,可以看到提示信息
在get.jsp中输入[id=0]并提交form,可以看到提示信息
说明通过form访问post和get方法成功。
在put.jsp中输入[id=0, name=0, address=0]并提交form,可以看到提示信息
在delete.jsp中输入[id=0]并提交form,看到提示信息同上。
说明通过form访问put和delete方法失败。
3.TunnelService和methodParameter
从上面的测试中我们可以看到,不能通过form来直接访问put和delete方法。那要怎么才能方便的从页面上调用Rest呢?幸好Restlet中提供了TunnelService来设置方法参数。
参考org.restlet.Application类中代码:
参考org.restlet.service.TunnelService类中代码:
可以看到TunnelService构造函数中默认的methodParameter属性值为"method"。这样只要使用了Application并且指定提交时的method参数为post/put/delete/get,就可以方便的调用了。
4.使用Application
修改com.sunny.restlet.order.CustomerApplication类,代码如下:
类中将涉及到的资源CustomerResource和CustomersResource都绑定到"/"路径上。
修改src/目录下的applicationContext.xml,代码如下:
配置中加入了CustomerApplication的配置,行成了Component>Application>Router>Resource的配置链。
5.运行
重新部署程序后,按照第二节测试步骤进行测试。
使用浏览器访问http://localhost:8080/firstSteps/,并将页面上的五个链接在新页面中打开访问。
在post.jsp中输入[name=0, address=0]并提交form,可以看到提示信息
在get.jsp中输入[id=0]并提交form,可以看到提示信息
说明通过form访问post和get方法成功。
在put.jsp中输入[id=0, name=00, address=00]并提交form,可以看到提示信息
刷新get customers"链接页面,可以看到提示信息
说明访问put方法成功。
在delete.jsp中输入[id=0]并提交form,可以看到提示信息
刷新get customers"链接页面,可以看到customers为空,说明访问delete方法成功。
6.思考
我们可以直接在提交时使用method参数,也可以更改参数名。
在com.sunny.restlet.order.CustomerApplication类中加入构造方法,代码如下:
构造其中将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的配置却写死在了代码中,也算有得有失。要是大家有好的解决方法,请告诉我,谢谢。
参考: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的配置却写死在了代码中,也算有得有失。要是大家有好的解决方法,请告诉我,谢谢。
发表评论
-
REST(五)CXF实现REST
2017-08-14 16:49 752Apache CXF以前一般用来开发基于SOAP协议的Web ... -
REST(四)RESTEasy实现REST
2017-06-15 10:55 3715RESTEasy是JBoss的一个开源项目,提供各种框架帮助你 ... -
REST(三)Restlet实现REST
2017-06-12 17:13 2433Restlet项目为“建立REST概念与Java类之间的映射” ... -
REST(二)Jersey实现REST
2017-05-26 16:33 1984Jersey是JAX-RS(JSR311)开源参考实现,用于构 ... -
REST(一)REST和JAX-RS
2017-05-25 16:08 1395最近重新整理了一下代码,把java实现REST api的几种框 ... -
Restlet 2.0 边学边写(八)使用jQuery和ajax实现对Restlet资源的CRUD操作
2013-01-12 01:20 2952上一次实践实现了各方 ... -
Restlet 2.0 边学边写(七)Restlet返回xml和json数据格式
2013-01-07 10:29 5354上一次实践实现了html form来访问Restlet的PUT ... -
Restlet 2.0 边学边写(五)Restlet的POST、PUT和DELETE
2012-12-26 17:54 4746上一次实践是将Restlet与spring集成,本次实践是将实 ... -
Restlet 2.0 边学边写(四)Restlet与spring集成
2012-12-20 17:27 5928上一次实践是使用Component来发布多个Resource。 ... -
Restlet 2.0 边学边写(三)使用Component发布多个Application
2012-12-19 18:25 3155很久没更新这篇博客了,今天继续。 上一次实践是一个Appli ... -
Restlet 2.0 边学边写(二)发布多个Resource
2012-01-11 03:39 3591上一次实践是一个Application绑定一个Resource ... -
Restlet 入门
2012-01-11 03:06 2559我学习Restlet是从ajax写的Restlet实践系列博客 ... -
Restlet 2.0 边学边写(一)第一步
2012-01-11 02:42 7555关于Rest的起源和框架、入门资料的一些东西大家可以去看看aj ...
相关推荐
在本篇博文中,我们将深入探讨如何利用jQuery和Ajax技术与Restlet 2.0框架进行交互,实现对Restful资源的创建(Create)、读取(Read)、更新(Update)和删除(Delete)操作,即CRUD操作。Restlet是一个开源的Java ...
9. **测试和支持(Testing and Support)**: 除了源代码,Restlet 2.0还提供了示例和测试用例,帮助开发者更好地理解和学习如何使用框架。此外,社区支持和官方文档也提供了丰富的资源。 10. **版本2.0.14**: 这个...
在这个场景中,我们关注的是"restlet2.0+spring3.0+hibernate3.3"的整合,这是一个经典的Java Web开发组合,分别代表了RESTful API、服务层管理和持久化层的优秀实践。 首先,让我们深入了解每个框架的核心特性: ...
Restlet框架是一个开源的、基于Java的REST(Representational State Transfer)应用开发框架,它为构建Web服务和轻量级应用程序提供了丰富的工具和支持。标题"restlet-jee-2.0.6.zip_Restlet 2..0_Restlet framework...
RESTlet是一款开源框架,专为构建基于REST(Representational ...通过学习这些资料,开发者可以深入理解RESTlet的工作原理,掌握如何使用RESTlet构建RESTful服务和客户端应用,从而提升其在Web服务开发领域的专业技能。
标题"基于Spring的Restlet实例"意味着我们将探讨如何在Spring环境中集成和使用Restlet库来开发REST服务。这通常涉及以下几个关键知识点: 1. **RESTful服务基础**:REST是一种软件架构风格,强调通过HTTP协议暴露...
在这个实例中,你将学习如何使用Restlet框架结合JAX-RS来定义资源、处理HTTP方法(如GET、POST、PUT、DELETE等)以及如何处理JSON或XML数据。Restlet提供了JAX-RS兼容的组件,使得开发者可以轻松地在Restlet环境中...
"fe.crx"文件则可能是FE助手的Chrome扩展程序,同样方便开发者在浏览器中快速访问和使用其功能。这样的设计使得开发者无需离开浏览器就可以进行API交互,提高了开发流程的连贯性。 总的来说,FE助手和Restlet ...
7. **安全性**: 支持OAuth 2.0和其他身份验证机制,保障API测试的安全性。 ### 使用场景 - **API调试**: 开发者可以快速测试新创建的API端点,检查其功能是否正常。 - **性能测试**: 通过模拟大量并发请求,评估...
5. **更易用的API**:简化了API接口,降低了学习曲线,使得开发者能够更快速地集成和使用RESTlet。 6. **扩展性**:提供了丰富的扩展点,可以方便地添加自定义处理器、过滤器和组件,满足特定业务需求。 7. **文档...
本示例将详细阐述如何使用Restlet框架处理HTTP协议中的各种请求方法,如GET、POST、PUT、DELETE等。 首先,让我们了解RESTlet的基本结构。在Restlet中,应用程序由资源(Resource)组成,这些资源是可交互的对象,...
Restlet是一款开源框架,专为构建RESTful Web服务和客户端应用程序设计。REST(Representational State Transfer)是一种轻量级的架构风格,广泛用于构建互联网应用,因为它提供了高效、分布式的系统设计原则。本文...
RestletClient是一款强大的接口调试工具,它为开发者提供了一个便捷的平台来测试、调试和分析RESTful Web服务。在Web应用程序开发过程中,接口调试是非常重要的一环,它可以帮助开发者验证API的功能,确保数据的正确...
RESTful API提供了一种标准化的方式来暴露和访问数据,使得不同应用、服务之间可以轻松地共享和交换数据。它通常以JSON或XML格式传输数据,这两种格式易于解析且跨平台兼容性好。 "绝对不坑"可能意味着这个项目或者...
3. **定义HTTP方法**: 在Restlet类中覆盖`get()`, `post()`, `put()`, `delete()`等方法,以处理不同类型的HTTP请求。 4. **设置路由**: 指定Restlet将响应哪些URI路径。 5. **运行应用**: 将Restlet附加到一个...
【Restlet in Action 中文】这本书是一本针对Java开发者介绍Restlet框架的实战指南,旨在帮助读者更好地理解和使用RESTful Web API。Restlet是一个开源的Web框架,它以面向对象的方式提供了一系列类和示例,使得...
RESTlet是一个开源框架,专为构建RESTful Web服务和客户端应用程序设计。REST(Representational State Transfer)是一种软件架构风格,广泛应用于Web服务的设计,强调简洁、无状态和可缓存等原则,以提高效率和可...
在使用过程中,要注意版本兼容性问题,确保Restlet框架及其依赖库与你的Java运行环境和其它库相兼容。此外,理解RESTful设计原则,如资源的URI定位、状态码的使用、无状态通信等,对于有效利用Restlet构建高质量的...
RESTLET框架和JAX-RS API的结合使用大大简化了RESTful服务的开发过程,使得开发者能够更专注于业务逻辑而不是底层的技术细节。此外,RESTLET框架的灵活性还允许开发者轻松地扩展服务的功能,比如支持更多的数据格式...