超轻量的REST“框架”,希望大家提提意见,谢谢这是小弟第一次在论坛中发贴,之前一直在论坛潜水,一心看大牛们
超轻量的REST“框架”,希望大家提提意见,谢谢
这是小弟第一次在论坛中发贴,之前一直在论坛潜水,一心看大牛们的文章,希望这文章不会招来牛牛们的鄙视,谢谢
我这个小框架的灵感来源于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{@Overridepublic 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 <发者手动转换Java对象了
这个东西我只花了几个小时来做,还很不完整,只是个玩具。希望大牛们“批评批评”。
附件里是一个示例webapp和所有代码的eclipse工程。@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创建出来。@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创建出来。
有道理,要继续学习了,谢谢。
等有了进一步的成果再来交作业!
4 楼 惊鸿逝水 2008-03-12 C3PO 写道又是个重新发明轮子的...
公子我奇怪为啥Java程序员就光爱写框架不干事...
那只能说明我国的制造业比较发达,哈哈
5 楼 star022 2008-04-01 学习,支持楼主~~~! 6 楼 caixicai 2008-04-01 ajoo 的评论很到位,最爱看这类评论了,哈哈。
关注楼主 7 楼 moonranger 2008-04-01 已经有人在我的基础上做出了一个更好的:
http://cnoss.iteye.com/blog/176755
8 楼 caixicai 2008-04-01 moonranger 写道已经有人在我的基础上做出了一个更好的:
http://cnoss.iteye.com/blog/176755
楼主你咋不继续了,本想关注下本帖的后续。。。 9 楼 caixicai 2008-04-01 要不你就发布个+spring的吧,guice已经有了。 10 楼 moonranger 2008-04-12 不好意思,最近刚刚开始上班了,很忙,没多少业余时间写这个了。
Spring的?可以考虑一下,不过听说Spring最新版就要加入REST支持了。 11 楼 liquidthinker 2008-04-15 Map<String, String> params,这个写死了,数组杂办? 12 楼 moonranger 2008-04-16 Map<String,String>里面仅仅包含URL中包含的参数信息,额外的参数可以通过HTTP POST表单来传递。
比如
/news/{id}
这个URL映射规则里,遇到/news/123这样的URL,Map里就包含id=123这样的一个参数。RESTful URL里应该不会出现数组类型的参数吧?
13 楼 mdream 2008-04-21 支持楼主,应该考虑如何出一个可以使用模板的 REST 框架.像JSON作为可选组件来使用.核心就是REST及IOC部分.
个人理想,在计划中.