- 浏览: 152295 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
守望麦穗:
楼主好, 我按着你的步骤查找问题 ,到第二步,也没有自定义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)会话管理和并行控制
上一次实践实现了html form来访问Restlet的PUT和DELETE方法,但返回数据都是string,仅能作为演示使用。本次实践将使各方法返回xml和json格式的数据,方便页面、程序的读取和展示。
1.xml库
首先是基础的xml数据格式。Restlet的扩展包org.restlet.ext.xml.jar提供各种xml相关类库。包中的抽象类XmlRepresentation作为父类提供接口和方法,但不能创建该父类的实例,而是需要使用SaxRepresentation和DomRepresentation类的实例来执行操作。
将Restlet安装目录\Edition Java EE\2.0.10\lib下的org.restlet.ext.xml.jar包加入Build Path。
2.Resource
修改com.sunny.restlet.order.CustomersResource类,代码如下:
类中将/customers资源的get和post方法返回的Representation修改为DomRepresentation,并创建dom文件来格式化数据。
修改com.sunny.restlet.order.CustomerResource类,代码如下:
类中将/customer/{custId}的资源的get、put和delete方法返回的Representation修改为DomRepresentation,并创建dom文件来格式化数据。
3.测试
部署程序后,使用浏览器访问http://localhost:8080/firstSteps/,并将页面上的五个链接在新页面中打开访问。
在post.jsp中输入[name=0, address=0]并提交form,可以看到提示信息
说明调用post方法访问/customers返回xml数据成功,数据被新增。
再次在post.jsp中输入[name=1, address=1]并提交form,刷新get customers"链接页面,可以看到提示信息
说明调用get方法访问/customers返回xml数据成功。
在put.jsp中输入[id=0, name=00, address=00]并提交form,可以看到提示信息
说明调用put方法访问/customer/{custId}返回xml数据成功,数据被修改。
在get.jsp中输入[id=0]并提交form,可以看到提示信息同上。说明调用get方法访问/customer/{custId}返回xml数据成功。
在delete.jsp中输入[id=0]并提交form,可以看到提示信息
刷新get customers"链接页面,可以看到提示信息
说明调用delete方法访问/customer/{custId}返回xml数据成功,数据被删除。
4.使用ClientResource测试
下面我们使用第五节中用到的ClientResource客户端方式调用Restlet服务。
修改com.sunny.restlet.order.CustomerResource类,代码如下:
重新部署firstSteps后,运行Test类,在控制台可以看到输出信息
说明客户端方式调用成功。
5.json库
Json作为现在通用的互联网数据传输格式,Restlet当然要支持的了。Restlet的扩展包org.restlet.ext.json.jar提供各种xml相关类库。包中的JsonRepresentation类可以作为返回数据载体使用,其中对多种数据类型提供了支持。
将Restlet安装目录\Edition Java EE\2.0.10\lib下的org.restlet.ext.json.jar包和org.json.jar包加入Build Path。
6.Resource
修改com.sunny.restlet.order.CustomersResource类,代码如下:
类中将/customers资源的get和post方法返回的Representation修改为JsonRepresentation。
修改com.sunny.restlet.order.CustomerResource类,代码如下:
类中将/customer/{custId}的资源的get、put和delete方法返回的Representation修改为JsonRepresentation。可以看到JsonRepresentation对各数据类型的支持。
7.测试
重新部署firstSteps后,运行Test类,在控制台可以看到输出信息
说明客户端方式调用资源,返回json数据成功。
同样可以通过页面来访问修改后的程序,但是返回会是个文件,下载打开后内容和上面的提示信息类似。
8.思考
我们也可以简单的使用StringRepresentation来达到相同的效果,但是需要自己在代码中调用Dom4J和JSON类库来生成json和xml字符串,再使用StringRepresentation将结果返回。
1.xml库
首先是基础的xml数据格式。Restlet的扩展包org.restlet.ext.xml.jar提供各种xml相关类库。包中的抽象类XmlRepresentation作为父类提供接口和方法,但不能创建该父类的实例,而是需要使用SaxRepresentation和DomRepresentation类的实例来执行操作。
将Restlet安装目录\Edition Java EE\2.0.10\lib下的org.restlet.ext.xml.jar包加入Build Path。
2.Resource
修改com.sunny.restlet.order.CustomersResource类,代码如下:
@Override protected Representation get() throws ResourceException { // TODO Auto-generated method stub Map customers = orderDao.getAllCustomers(); DomRepresentation representation; try { representation = new DomRepresentation(); Document dom = representation.getDocument(); Element all = dom.createElement("customers"); dom.appendChild(all); for (Object object : customers.entrySet()) { Entry<String, Customer> entry = (Entry) object; String id = entry.getKey(); Customer customer = entry.getValue(); Element root = dom.createElement("customer"); root.setAttribute("id", id); all.appendChild(root); Element namElement = dom.createElement("name"); namElement.appendChild(dom.createTextNode(customer.getName())); root.appendChild(namElement); Element addressElement = dom.createElement("address"); addressElement.appendChild(dom.createTextNode(customer .getAddress())); root.appendChild(addressElement); } dom.normalizeDocument(); return representation; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @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) { return null; } DomRepresentation representation; try { representation = new DomRepresentation(); Document dom = representation.getDocument(); Element root = dom.createElement("customer"); root.setAttribute("id", id); dom.appendChild(root); Element namElement = dom.createElement("name"); root.appendChild(namElement); namElement.appendChild(dom.createTextNode(customer.getName())); Element addressElement = dom.createElement("address"); root.appendChild(addressElement); addressElement.appendChild(dom .createTextNode(customer.getAddress())); dom.normalizeDocument(); return representation; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }
类中将/customers资源的get和post方法返回的Representation修改为DomRepresentation,并创建dom文件来格式化数据。
修改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); DomRepresentation representation; try { representation = new DomRepresentation(); Document dom = representation.getDocument(); Element root = dom.createElement("message"); dom.appendChild(root); root.appendChild(dom.createTextNode("success")); dom.normalizeDocument(); return representation; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @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 null; } DomRepresentation representation; try { representation = new DomRepresentation(); Document dom = representation.getDocument(); Element root = dom.createElement("customer"); root.setAttribute("id", customerId); dom.appendChild(root); Element namElement = dom.createElement("name"); root.appendChild(namElement); namElement.appendChild(dom.createTextNode(customer.getName())); Element addressElement = dom.createElement("address"); root.appendChild(addressElement); addressElement.appendChild(dom .createTextNode(customer.getAddress())); dom.normalizeDocument(); return representation; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @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 null; } DomRepresentation representation; try { representation = new DomRepresentation(); Document dom = representation.getDocument(); Element root = dom.createElement("customer"); root.setAttribute("id", customerId); dom.appendChild(root); Element namElement = dom.createElement("name"); root.appendChild(namElement); namElement.appendChild(dom.createTextNode(customer.getName())); Element addressElement = dom.createElement("address"); root.appendChild(addressElement); addressElement.appendChild(dom .createTextNode(customer.getAddress())); dom.normalizeDocument(); return representation; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }
类中将/customer/{custId}的资源的get、put和delete方法返回的Representation修改为DomRepresentation,并创建dom文件来格式化数据。
3.测试
部署程序后,使用浏览器访问http://localhost:8080/firstSteps/,并将页面上的五个链接在新页面中打开访问。
在post.jsp中输入[name=0, address=0]并提交form,可以看到提示信息
- <?xml version="1.0" encoding="UTF-8"?>
- <customer id="0">
- <name>0</name>
- <address>0</address>
- </customer>
说明调用post方法访问/customers返回xml数据成功,数据被新增。
再次在post.jsp中输入[name=1, address=1]并提交form,刷新get customers"链接页面,可以看到提示信息
- <?xml version="1.0" encoding="UTF-8"?>
- <customers>
- <customer id="0">
- <name>0</name>
- <address>0</address>
- </customer>
- <customer id="1">
- <name>1</name>
- <address>1</address>
- </customer>
- </customers>
说明调用get方法访问/customers返回xml数据成功。
在put.jsp中输入[id=0, name=00, address=00]并提交form,可以看到提示信息
- <?xml version="1.0" encoding="UTF-8"?>
- <customer id="0">
- <name>00</name>
- <address>00</address>
- </customer>
说明调用put方法访问/customer/{custId}返回xml数据成功,数据被修改。
在get.jsp中输入[id=0]并提交form,可以看到提示信息同上。说明调用get方法访问/customer/{custId}返回xml数据成功。
在delete.jsp中输入[id=0]并提交form,可以看到提示信息
- <?xml version="1.0" encoding="UTF-8"?>
- <message>success</message>
刷新get customers"链接页面,可以看到提示信息
- <?xml version="1.0" encoding="UTF-8"?>
- customers>
- <customer id="1">
- <name>1</name>
- <address>1</address>
- </customer>
- </customers>
说明调用delete方法访问/customer/{custId}返回xml数据成功,数据被删除。
4.使用ClientResource测试
下面我们使用第五节中用到的ClientResource客户端方式调用Restlet服务。
修改com.sunny.restlet.order.CustomerResource类,代码如下:
public static void main(String[] args) { // TODO Auto-generated method stub try { ClientResource clientCustomers = new ClientResource( "http://localhost:8080/firstSteps/spring/customers"); ClientResource clientCustomer = new ClientResource( "http://localhost:8080/firstSteps/spring/customers/0"); Form form = new Form(); form.add("name", "b"); form.add("address", "b"); Representation representation = clientCustomers.post(form); System.out.println(representation.getText()); representation = clientCustomers.get(); System.out.println(representation.getText()); form.clear(); form.add("name", "c"); form.add("address", "c"); representation = clientCustomer.put(form); System.out.println(representation.getText()); representation = clientCustomer.get(); System.out.println(representation.getText()); representation = clientCustomer.delete(); System.out.println(representation.getText()); representation = clientCustomers.get(); System.out.println(representation.getText()); } catch (Exception e) { e.printStackTrace(); } }
重新部署firstSteps后,运行Test类,在控制台可以看到输出信息
- 2013-1-6 16:45:29 org.restlet.engine.http.connector.HttpClientHelper start
- 信息: Starting the default HTTP client
- <?xml version="1.0" encoding="UTF-8"?><customer id="0"><name>b</name><address>b</address></customer>
- <?xml version="1.0" encoding="UTF-8"?><customers><customer id="0"><name>b</name><address>b</address></customer></customers>
- 2013-1-6 16:45:29 org.restlet.engine.http.connector.HttpClientHelper start
- 信息: Starting the default HTTP client
- <?xml version="1.0" encoding="UTF-8"?><customer id="0"><name>c</name><address>c</address></customer>
- <?xml version="1.0" encoding="UTF-8"?><customer id="0"><name>c</name><address>c</address></customer>
- <?xml version="1.0" encoding="UTF-8"?><message>success</message>
- <?xml version="1.0" encoding="UTF-8"?><customers/>
说明客户端方式调用成功。
5.json库
Json作为现在通用的互联网数据传输格式,Restlet当然要支持的了。Restlet的扩展包org.restlet.ext.json.jar提供各种xml相关类库。包中的JsonRepresentation类可以作为返回数据载体使用,其中对多种数据类型提供了支持。
将Restlet安装目录\Edition Java EE\2.0.10\lib下的org.restlet.ext.json.jar包和org.json.jar包加入Build Path。
6.Resource
修改com.sunny.restlet.order.CustomersResource类,代码如下:
@Override protected Representation get() throws ResourceException { // TODO Auto-generated method stub Map customers = orderDao.getAllCustomers(); return new JsonRepresentation(customers); } @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) { return null; } return new JsonRepresentation(customer); }
类中将/customers资源的get和post方法返回的Representation修改为JsonRepresentation。
修改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("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 null; } 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 null; } return new JsonRepresentation(customer); }
类中将/customer/{custId}的资源的get、put和delete方法返回的Representation修改为JsonRepresentation。可以看到JsonRepresentation对各数据类型的支持。
7.测试
重新部署firstSteps后,运行Test类,在控制台可以看到输出信息
- 2013-1-6 17:32:20 org.restlet.engine.http.connector.HttpClientHelper start
- 信息: Starting the default HTTP client
- {"address":"b","name":"b"}
- {"0":"Customer [name=b, address=b]"}
- 2013-1-6 17:32:21 org.restlet.engine.http.connector.HttpClientHelper start
- 信息: Starting the default HTTP client
- {"address":"c","name":"c"}
- {"address":"c","name":"c"}
- success
- {}
说明客户端方式调用资源,返回json数据成功。
同样可以通过页面来访问修改后的程序,但是返回会是个文件,下载打开后内容和上面的提示信息类似。
8.思考
我们也可以简单的使用StringRepresentation来达到相同的效果,但是需要自己在代码中调用Dom4J和JSON类库来生成json和xml字符串,再使用StringRepresentation将结果返回。
评论
1 楼
sb33060418
2013-01-10
原来在CustomersResource.get()方法中使用new JsonRepresentation(customers)是不对的,从返回结果上可以看到返回的是•{"0":"Customer [name=b, address=b]"} ,里面的Customer没有被转化为key/value的json格式,而只是简单调用了toString方法。
需要将new JsonRepresentation(customers)修改为new JsonRepresentation(new JSONObject(customers,false)),即调用JSONObject类的JSONObject(Map map, boolean includeSuperClass)方法,具体内容可以看JSONObject类的代码。
同样,如果返回数据的类型是数组Array/Collection,也需要使用JSONArray(Collection collection, boolean includeSuperClass)来返回json格式数据。
需要将new JsonRepresentation(customers)修改为new JsonRepresentation(new JSONObject(customers,false)),即调用JSONObject类的JSONObject(Map map, boolean includeSuperClass)方法,具体内容可以看JSONObject类的代码。
同样,如果返回数据的类型是数组Array/Collection,也需要使用JSONArray(Collection collection, boolean includeSuperClass)来返回json格式数据。
发表评论
-
REST(五)CXF实现REST
2017-08-14 16:49 756Apache CXF以前一般用来开发基于SOAP协议的Web ... -
REST(四)RESTEasy实现REST
2017-06-15 10:55 3723RESTEasy是JBoss的一个开源项目,提供各种框架帮助你 ... -
REST(三)Restlet实现REST
2017-06-12 17:13 2439Restlet项目为“建立REST概念与Java类之间的映射” ... -
REST(二)Jersey实现REST
2017-05-26 16:33 1987Jersey是JAX-RS(JSR311)开源参考实现,用于构 ... -
REST(一)REST和JAX-RS
2017-05-25 16:08 1398最近重新整理了一下代码,把java实现REST api的几种框 ... -
Restlet 2.0 边学边写(八)使用jQuery和ajax实现对Restlet资源的CRUD操作
2013-01-12 01:20 2958上一次实践实现了各方 ... -
Restlet 2.0 边学边写(六)使用html form访问Restlet的PUT和DELETE
2013-01-04 15:55 3976上一次实践实现了POST、PUT和DELETE方法,并使用ht ... -
Restlet 2.0 边学边写(五)Restlet的POST、PUT和DELETE
2012-12-26 17:54 4763上一次实践是将Restlet与spring集成,本次实践是将实 ... -
Restlet 2.0 边学边写(四)Restlet与spring集成
2012-12-20 17:27 5929上一次实践是使用Component来发布多个Resource。 ... -
Restlet 2.0 边学边写(三)使用Component发布多个Application
2012-12-19 18:25 3161很久没更新这篇博客了,今天继续。 上一次实践是一个Appli ... -
Restlet 2.0 边学边写(二)发布多个Resource
2012-01-11 03:39 3595上一次实践是一个Application绑定一个Resource ... -
Restlet 入门
2012-01-11 03:06 2563我学习Restlet是从ajax写的Restlet实践系列博客 ... -
Restlet 2.0 边学边写(一)第一步
2012-01-11 02:42 7562关于Rest的起源和框架、入门资料的一些东西大家可以去看看aj ...
相关推荐
对于POST、PUT等需要提交数据的方法,它支持多种数据格式,如JSON、XML、表单数据等。 2. **请求预览**: 在发送请求之前,你可以预览完整的HTTP请求,确保所有设置正确无误。 3. **响应查看**: 收到服务器的响应后,...
### RESTLET开发实例详解 #### 一、RESTLET框架简介 **RESTLET**是一个轻量级且全面的框架,...此外,RESTLET框架的灵活性还允许开发者轻松地扩展服务的功能,比如支持更多的数据格式(如JSON)或增加安全措施等。
3. **协议栈**:Restlet支持多种传输协议,如HTTP、HTTPS、WebSocket等,同时也支持多种数据格式,如JSON、XML、Plain Text等。这些功能由不同的jar包提供,确保了跨平台和多协议的支持。 4. **扩展和模块**:...
3. **媒体类型处理**:RESTlet支持多种媒体类型,如JSON、XML、HTML等,允许开发者方便地处理数据交换。它还支持自定义的媒体类型,以适应特定的应用场景。 4. **过滤器机制**:RESTlet的过滤器可以插入到请求和...
它通常以JSON或XML格式传输数据,这两种格式易于解析且跨平台兼容性好。 "绝对不坑"可能意味着这个项目或者RESTlet框架在使用过程中相对稳定,没有太多隐藏的陷阱或者难以理解的问题,开发者可以放心使用。 在提供...
该框架支持多种传输协议(如HTTP、HTTPS、FTP等),并能够处理各种数据格式(例如JSON、XML)。 在《Restlet in Action》的第一章“Introducing the Restlet Framework”中,作者们详细解释了Restlet框架的核心概念...
3. **Representation**: RESTful服务中的数据以“表示”形式存在,可以是文本、XML、JSON等。Restlet提供了一种处理和转换这些表示的方法。 4. **Directory**: 类似于文件系统,用于存储和管理资源。这有助于组织和...
在这个实例中,你将学习如何使用Restlet框架结合JAX-RS来定义资源、处理HTTP方法(如GET、POST、PUT、DELETE等)以及如何处理JSON或XML数据。Restlet提供了JAX-RS兼容的组件,使得开发者可以轻松地在Restlet环境中...
4. **解析和分析响应**:RestletClient会高亮显示响应体,如果返回的是JSON或XML,它会以树形结构展示数据,便于查看和理解。此外,你可以查看响应时间,这对于性能优化很有帮助。 5. **保存和重放请求**:为了方便...
Restlet提供了强大的数据表示处理,支持多种媒体类型,如Text、XML、JSON等。 5. **Routing and Filtering**:Restlet提供了一种基于URI模板的路由机制,以及可插拔的过滤器链,允许开发者进行灵活的请求和响应处理...
3. **代表(Representation)**:在REST中,资源的状态通过数据的表示形式(如JSON、XML或HTML)来传达。在Restlet中,这些表示通常通过`org.restlet.data.MediaType`定义,并由`Representation`接口的实现来处理。 ...
这个方法接收请求参数,并通过`getResponse().setStatus()`设置状态码,通过`getResponse().setEntity()`设置返回的JSON值。 3. **配置Restlet与Spring**: - **restletContext.xml**:这是Restlet的配置文件,...
6. **Converter**: 负责数据格式的转换,如将Java对象转化为JSON或XML。 在实际应用中,你可以通过继承`org.restlet.resource.ServerResource`并覆盖其方法来定义一个资源,然后使用`Component`来配置和启动服务。...
Jackson是Java中非常流行的一个JSON处理库,可以用于序列化和反序列化Java对象到JSON格式,以及从JSON数据中创建Java对象。Nutch在抓取和处理网页数据时,可能会遇到需要解析JSON格式的元数据或者配置文件的情况,这...
4. **数据交换格式**:讨论Restlet支持的数据交换格式,如JSON、XML、Plain Text等,以及如何进行序列化和反序列化操作。 5. **客户端API**:介绍如何使用Restlet客户端API来发起HTTP请求,获取服务器响应,并处理...
6. **数据序列化与反序列化**:在REST服务中,数据通常以JSON或XML格式交换。Restlet提供了解析和生成这些格式的能力,但也可以结合Jackson或Gson等库进行更复杂的序列化和反序列化。 7. **测试和调试**:为了确保...
它强调资源的表述,通过HTTP协议进行交互,支持多种数据格式,如JSON和XML。Restlet框架提供了一组组件和工具,使得开发者能够更容易地实现REST原则,并创建符合这种风格的Web服务。 标题"restlet所需jar包一"表明...
此外,Restlet支持多种数据格式的交换,包括XML、JSON、HTML等,这使得它在构建跨平台、跨设备的Web服务时具有很大的灵活性。 在"restlet-jee-2.0.15"这个版本中,你可能会找到以下内容: - `restlet.jar`:主库...
- RESTful服务通常使用JSON或XML作为数据交换格式。Restlet提供了`Representation`类来处理这些格式。 - 可以使用`JsonRepresentation`或`XmlRepresentation`来序列化和反序列化数据。 6. **路由和参数处理** - ...
同时,你还可以处理JSON或XML数据,实现更复杂的业务逻辑。 Restlet框架提供了丰富的API和扩展性,使得开发RESTful服务变得更加简单和高效。 总的来说,Restlet提供了一种直观的方式来构建RESTful Web服务,其简洁...