`
moonranger
  • 浏览: 13038 次
  • 性别: Icon_minigender_1
  • 来自: 天津
最近访客 更多访客>>
社区版块
存档分类
最新评论

超轻量的REST“框架”,希望大家提提意见,谢谢

    博客分类:
  • Java
阅读更多
这是小弟第一次在论坛中发贴,之前一直在论坛潜水,一心看大牛们的文章,希望这文章不会招来牛牛们的鄙视,谢谢

我这个小框架的灵感来源于http://www.ibm.com/developerworks/cn/xml/x-restfulsoa/index.html,目前唯一的功能就是实现REST风格的URL映射以及不同的HTTP方法(GET,POST,PUT和DELETE)对资源类的方法的映射,框架的使用很简单。

一.实现REST接口,接口定义为
public interface RESTResource
{
	public void init();

	public void create(Map<String, String> params, HttpServletRequest request,
			HttpServletResponse response);

	public void get(Map<String, String> params, HttpServletRequest request,
			HttpServletResponse response);

	public void update(Map<String, String> params, HttpServletRequest request,
			HttpServletResponse response);

	public void delete(Map<String, String> params, HttpServletRequest request,
			HttpServletResponse response);
}


为了简单起见,目前仅仅采用了最简单的形式,和一个Servlet差不多,其中第一个参数params中存放了从URL中提取的参数名和值。
实际使用时可以继承AbstractRESTResource抽象类,这样就可以只覆盖自己需要的方法了。

二.添加URL映射规则的Annotation

@URLMapping("/blog/{blog_id}/comment/{comment_id}")
public class BlogComment extends AbstractRESTResource
{
	@Override
	public void get(Map<String, String> params, HttpServletRequest request,
			HttpServletResponse response)
	{
		try
		{
			PrintWriter out = response.getWriter();
			out.println("<h2>Comment(id:" + params.get("comment_id") + ") of blog(id:"
					+ params.get("blog_id") + ")</h2>");
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}

}


其中用“{}”来定义参数,比如上面代码中的注解“/blog/{blog_id}/comment/{comment_id}”里的blog_id和comment_id就是一个参数,匹配实际URL中的这一部分,比如“/blog/345/comment/12”这个URL就会被映射到这个资源上,并且参数blog_id的值为345,comment_id的值为12。一个URL映射里可以添加多个参数。


三.注册Listener
   <filter>
   		<filter-name>RESTfulFilter</filter-name>
   		<filter-class>com.jstudio.rest.RESTResourceFilter</filter-class>
   		<init-param>
   			<param-name>resourceListFile</param-name>
         	<param-value>/WEB-INF/restResources.list</param-value>
   		</init-param>
   </filter>

	<filter-mapping>
		<filter-name>RESTfulFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>


其中resourceListFile这个参数指定了资源列表文件。此文件时一个简单的文本文件,每一行是一个资源类的类名全称。

com.jstudio.rest.test.Blog
com.jstudio.rest.test.BlogList
com.jstudio.rest.test.BlogCommentList
com.jstudio.rest.test.BlogComment

这样当应用部署了以后就可以按照自己指定的URL规则来访问REST资源了。对应的方法会得到调用。

框架很简单,甚至很“愚蠢”,但是达到了我最开始需要的效果。它仅仅适合用来实现RESTful Web服务,如果是做普通的Web项目就不行,缺少了MVC的支持,没有页面模板等等。

接下来想实现的是:
  1. 对Guice或Spring等框架的支持,这样就可以为这些RESTResource实现依赖注入了
  2. 实现Java对象想xml和json的直接转换,这样就不需要开发者手动转换Java对象了

这个东西我只花了几个小时来做,还很不完整,只是个玩具。希望大牛们“批评批评”。
附件里是一个示例webapp和所有代码的eclipse工程。
  • rest.rar (21.4 KB)
  • 描述: 示例webapp的WAR文件,压缩了一下(直接上传提示文件类型错误)
  • 下载次数: 196
分享到:
评论
13 楼 mdream 2008-04-21  
支持楼主,应该考虑如何出一个可以使用模板的 REST 框架.像JSON作为可选组件来使用.核心就是REST及IOC部分.

个人理想,在计划中.
12 楼 moonranger 2008-04-16  
Map<String,String>里面仅仅包含URL中包含的参数信息,额外的参数可以通过HTTP POST表单来传递。
比如
/news/{id}
这个URL映射规则里,遇到/news/123这样的URL,Map里就包含id=123这样的一个参数。RESTful URL里应该不会出现数组类型的参数吧?
11 楼 liquidthinker 2008-04-15  
Map<String, String> params,这个写死了,数组杂办?
10 楼 moonranger 2008-04-12  
不好意思,最近刚刚开始上班了,很忙,没多少业余时间写这个了。
Spring的?可以考虑一下,不过听说Spring最新版就要加入REST支持了。
9 楼 caixicai 2008-04-01  
要不你就发布个+spring的吧,guice已经有了。
8 楼 caixicai 2008-04-01  
moonranger 写道
已经有人在我的基础上做出了一个更好的:
http://cnoss.iteye.com/blog/176755


楼主你咋不继续了,本想关注下本帖的后续。。。
7 楼 moonranger 2008-04-01  
已经有人在我的基础上做出了一个更好的:
http://cnoss.iteye.com/blog/176755
6 楼 caixicai 2008-04-01  
ajoo 的评论很到位,最爱看这类评论了,哈哈。

关注楼主
5 楼 star022 2008-04-01  
学习,支持楼主~~~!
4 楼 惊鸿逝水 2008-03-12  
C3PO 写道
又是个重新发明轮子的...
公子我奇怪为啥Java程序员就光爱写框架不干事...


那只能说明我国的制造业比较发达,哈哈
3 楼 moonranger 2008-03-12  
ajoo 写道
dependency injection永远是应该一开始设计就作为设计的基础的,而不是后期的一个“额外的功能”。

就比如你这个接口,所有的方法都有三个一模一样的参数,而且居然还牵扯http request, http response这么底层的对象。

一般来说,这三个对象肯定是应该注射进具体实现类的。而且,也不需要实现接口(否则还叫pojo?),只要几个Annotation就行了。比如:
@URLMapping("/blog/{blog_id}/comment/{comment_id}") 
public class BlogComment {
  private final HttpServletResponse response;

  public BlogComment(HttpServletResponse response) {
    this.response = response;
  }

  @RestMethod(CREATE)
  public void create(@RestParam("blog_id") blogId, @RestParam("comment_id") String commentId) {
    // ...
  }
}


这样,框架要用一些reflection来处理@RestMethod和@RestParam,剩下就是用一个DI框架把这些rest handler创建出来。


有道理,要继续学习了,谢谢。
等有了进一步的成果再来交作业!
2 楼 robbin 2008-03-11  
我看你的框架在URL Mapping,Listener和Annotation上面颇像warp-mvc,不过和他相比,框架设计和实现功能上面还是有挺大的差距,建议你参考一下warp-mvc。
1 楼 ajoo 2008-03-11  
dependency injection永远是应该一开始设计就作为设计的基础的,而不是后期的一个“额外的功能”。

就比如你这个接口,所有的方法都有三个一模一样的参数,而且居然还牵扯http request, http response这么底层的对象。

一般来说,这三个对象肯定是应该注射进具体实现类的。而且,也不需要实现接口(否则还叫pojo?),只要几个Annotation就行了。比如:
@URLMapping("/blog/{blog_id}/comment/{comment_id}") 
public class BlogComment {
  private final HttpServletResponse response;

  public BlogComment(HttpServletResponse response) {
    this.response = response;
  }

  @RestMethod(CREATE)
  public void create(@RestParam("blog_id") blogId, @RestParam("comment_id") String commentId) {
    // ...
  }
}


这样,框架要用一些reflection来处理@RestMethod和@RestParam,剩下就是用一个DI框架把这些rest handler创建出来。

相关推荐

    SlwRest-1.0(Super Lightweight Rest)超轻量RESTful框架

    为了解决这个问题,"SlwRest-1.0(Super Lightweight Rest)"应运而生,它是一个设计精巧的超轻量级RESTful框架,旨在提供简单、快速的解决方案,同时保持低资源消耗。 SlwRest的主要目标是取代像Jersey这样的大型...

    GuiLite超轻量UI框架 v3.6.zip

    GuiLite超轻量UI框架 v3.6.zip

    超轻量级的REST框架实现

    标题中的“超轻量级的REST框架实现”指的是在软件开发中使用的一种轻量级的、基于HTTP协议的REST(Representational State Transfer)服务构建框架。REST是一种软件架构风格,常用于Web服务的设计,强调资源的表述和...

    超轻量 php 框架 startmvc v2.1.2.zip

    【超轻量 PHP 框架 StartMvc v2.1.2】 StartMvc 是一个针对初学者和小型项目设计的超轻量级 PHP 框架。它的主要目标是简化 Web 应用程序的开发过程,同时保持足够的灵活性,使得开发者能够快速构建高效能的应用。在...

    GuiLite超轻量UI框架 v3.6-源码.zip

    GuiLite超轻量UI框架是面向嵌入式设备和物联网(IoT)应用设计的一款高效、小巧且易于使用的用户界面库。它旨在提供简洁的API和极低的内存占用,以便在资源有限的硬件上实现丰富的图形用户界面。版本v3.6带来了更多的...

    超轻量RESTful框架—SlwRest(Super Lightweight)客户端及服务端Demo代码

    RequestMethod支持GET, POST, DELETE, PUT 参数获取支持 @FormParam, @PathParam, @QueryParam, @HeaderParam等 内容支持常用的JSON, XML, TEXT 能够方便地实现Java复杂对象, List, Map对象与JSON/XML的互转换 ...

    cpp-GuiLite超轻量UI框架是6千行代码的全平台UI框架

    GuiLite,一个以轻量级著称的C++ GUI框架,以其仅仅6千行代码的精简设计,为开发者提供了一种跨平台的解决方案。它不仅支持常见的操作系统,如iOS、Android、Windows(包括虚拟现实环境)、Mac,还兼容广泛的ARM ...

    超轻量级MVC框架的设计和实现(源码)

    超轻量级MVC框架则是这类框架的一个简化版本,旨在提供核心功能,减少不必要的复杂性,提高开发效率。 "超轻量级MVC框架的设计和实现(源码)"是针对这个概念的一个具体实例,它强调了框架的简洁性和无XML配置特性。...

    PHP实例开发源码-BroPHP框架 免费开源的超轻量级PHP框架正式版.zip

    PHP实例开发源码—BroPHP框架 免费开源的超轻量级PHP框架正式版.zip PHP实例开发源码—BroPHP框架 免费开源的超轻量级PHP框架正式版.zip PHP实例开发源码—BroPHP框架 免费开源的超轻量级PHP框架正式版.zip

    基于PHP的BroPHP框架免费开源的超轻量级PHP框架正式版源码.zip

    这个框架的核心特性体现在其超轻量级的设计,使得它在资源消耗和性能优化方面表现出色。在这款框架中,你可以发现许多现代Web开发的最佳实践,例如MVC(模型-视图-控制器)架构模式、路由系统、依赖注入等。 1. MVC...

    超轻量日志类

    "超轻量日志类"是一个专为C++设计的轻便型日志处理库,旨在提供高效且低开销的日志记录功能。在这个话题下,我们将深入探讨C++的日志实现、Visual Studio (VS) 集成以及轻量化设计的考量。 首先,让我们了解C++中的...

    Biny腾讯开源高性能超轻量级PHP框架

    **Biny腾讯开源高性能超轻量级PHP框架** 在当今的Web开发领域,PHP作为一种流行的后端编程语言,拥有众多的框架支持。其中,Biny脱颖而出,它是一款由腾讯开源的高性能、超轻量级PHP框架,专为快速构建现代Web应用...

    基于PHP的BroPHP框架 免费开源的超轻量级PHP框架正式版.zip

    1. **轻量级设计**:BroPHP框架的轻量化设计使得它在项目初期就能快速上手,降低了学习曲线,特别适合小型和中型项目。这种设计理念让开发者能更专注于业务逻辑,而非框架本身的复杂性。 2. **MVC模式**:BroPHP...

    中文识别超轻量推理模型

    标题中的“中文识别超轻量推理模型”是指用于识别中文字符的一种高效、小型化的机器学习模型,主要用于文本检测和识别任务。在当前的AI领域,这样的模型被广泛应用于各种场景,如智能办公、文档处理、图像扫描等,...

    中文识别超轻量训练模型

    标题中的“中文识别超轻量训练模型”是指一种专门用于识别中文字符的深度学习模型,其特点是模型体积小,计算效率高,适用于资源有限的设备上进行实时或近实时的文字识别任务。这样的模型通常采用深度学习框架,如...

    中文检测超轻量推理模型

    标题中的“中文检测超轻量推理模型”是指一种专门用于识别和检测中文文本的轻量化机器学习或深度学习模型,这种模型在处理中文文本时,能够进行高效的推理和分析。在现代信息技术中,这种模型被广泛应用在自然语言...

    基于AIO的超轻量HTTP服务器实现

    标题 "基于AIO的超轻量HTTP服务器实现" 指的是使用异步I/O(Asynchronous Input/Output,简称AIO)模型构建一个轻量级的HTTP服务器。AIO在Java中通常指的是NIO.2(New I/O 2),它提供了非阻塞I/O操作,能够更有效地...

    一款超轻量、高性能、跨平台的嵌入式脚本语言,可以运行在Windows、Linux、MCU上

    一款超轻量、高性能、跨平台的嵌入式脚本语言,可以运行在Windows、Linux、MCU上。致力于打造一款开源、高效、强大的编程语言一款超轻量、高性能、跨平台的嵌入式脚本语言,可以运行在Windows、Linux、MCU上。致力于...

    startmvc:超轻量php框架 lightweight php framework

    StartMVC 是一款超轻量php7框架,面向对象开发,小巧、优雅、高效,遵循 Apache2 开源协议发布的,支持 Composer 和 RESTful 的 PHP 开源框架。 StartMVC 能够帮助开发者以最小的学习成本快速构建 Web 应用,在满足...

    超轻量压缩传输js2java rpc框架(XtZPStream v1.0)

    ### 超轻量压缩传输js2java rpc框架(XtZPStream v1.0) 知识点解析 #### 概述 XtZPStream框架是一个专门为提高JavaScript与Java之间的交互效率而设计的超轻量级RPC(远程过程调用)框架。通过其独特的特性,它能够...

Global site tag (gtag.js) - Google Analytics