2008-03-11
超轻量的REST“框架”,希望大家提提意见,谢谢
这是小弟第一次在论坛中发贴,之前一直在论坛潜水,一心看大牛们的文章,希望这文章不会招来牛牛们的鄙视,谢谢
我这个小框架的灵感来源于http://www.ibm.com/developerworks/cn/xml/x-restfulsoa/index.html,目前唯一的功能就是实现REST风格的URL映射以及不同的HTTP方法(GET,POST,PUT和DELETE)对资源类的方法的映射,框架的使用很简单。
一.实现REST接口,接口定义为
为了简单起见,目前仅仅采用了最简单的形式,和一个Servlet差不多,其中第一个参数params中存放了从URL中提取的参数名和值。
实际使用时可以继承AbstractRESTResource抽象类,这样就可以只覆盖自己需要的方法了。
二.添加URL映射规则的Annotation
其中用“{}”来定义参数,比如上面代码中的注解“/blog/{blog_id}/comment/{comment_id}”里的blog_id和comment_id就是一个参数,匹配实际URL中的这一部分,比如“/blog/345/comment/12”这个URL就会被映射到这个资源上,并且参数blog_id的值为345,comment_id的值为12。一个URL映射里可以添加多个参数。
三.注册Listener
其中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的支持,没有页面模板等等。
接下来想实现的是:
这个东西我只花了几个小时来做,还很不完整,只是个玩具。希望大牛们“批评批评”。
附件里是一个示例webapp和所有代码的eclipse工程。
我这个小框架的灵感来源于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的支持,没有页面模板等等。
接下来想实现的是:
- 对Guice或Spring等框架的支持,这样就可以为这些RESTResource实现依赖注入了
- 实现Java对象想xml和json的直接转换,这样就不需要开发者手动转换Java对象了
这个东西我只花了几个小时来做,还很不完整,只是个玩具。希望大牛们“批评批评”。
附件里是一个示例webapp和所有代码的eclipse工程。
评论
mdream
2008-04-21
支持楼主,应该考虑如何出一个可以使用模板的 REST 框架.像JSON作为可选组件来使用.核心就是REST及IOC部分.
个人理想,在计划中.
个人理想,在计划中.
moonranger
2008-04-16
Map<String,String>里面仅仅包含URL中包含的参数信息,额外的参数可以通过HTTP POST表单来传递。
比如
/news/{id}
这个URL映射规则里,遇到/news/123这样的URL,Map里就包含id=123这样的一个参数。RESTful URL里应该不会出现数组类型的参数吧?
比如
/news/{id}
这个URL映射规则里,遇到/news/123这样的URL,Map里就包含id=123这样的一个参数。RESTful URL里应该不会出现数组类型的参数吧?
liquidthinker
2008-04-15
Map<String, String> params,这个写死了,数组杂办?
moonranger
2008-04-12
不好意思,最近刚刚开始上班了,很忙,没多少业余时间写这个了。
Spring的?可以考虑一下,不过听说Spring最新版就要加入REST支持了。
Spring的?可以考虑一下,不过听说Spring最新版就要加入REST支持了。
caixicai
2008-04-01
要不你就发布个+spring的吧,guice已经有了。
caixicai
2008-04-01
moonranger
2008-04-01
已经有人在我的基础上做出了一个更好的:
http://cnoss.javaeye.com/blog/176755
http://cnoss.javaeye.com/blog/176755
caixicai
2008-04-01
ajoo 的评论很到位,最爱看这类评论了,哈哈。
关注楼主
关注楼主
moonranger
2008-03-12
ajoo 写道
dependency injection永远是应该一开始设计就作为设计的基础的,而不是后期的一个“额外的功能”。
就比如你这个接口,所有的方法都有三个一模一样的参数,而且居然还牵扯http request, http response这么底层的对象。
一般来说,这三个对象肯定是应该注射进具体实现类的。而且,也不需要实现接口(否则还叫pojo?),只要几个Annotation就行了。比如:
这样,框架要用一些reflection来处理@RestMethod和@RestParam,剩下就是用一个DI框架把这些rest handler创建出来。
就比如你这个接口,所有的方法都有三个一模一样的参数,而且居然还牵扯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创建出来。
有道理,要继续学习了,谢谢。
等有了进一步的成果再来交作业!
robbin
2008-03-11
我看你的框架在URL Mapping,Listener和Annotation上面颇像warp-mvc,不过和他相比,框架设计和实现功能上面还是有挺大的差距,建议你参考一下warp-mvc。
ajoo
2008-03-11
dependency injection永远是应该一开始设计就作为设计的基础的,而不是后期的一个“额外的功能”。
就比如你这个接口,所有的方法都有三个一模一样的参数,而且居然还牵扯http request, http response这么底层的对象。
一般来说,这三个对象肯定是应该注射进具体实现类的。而且,也不需要实现接口(否则还叫pojo?),只要几个Annotation就行了。比如:
这样,框架要用一些reflection来处理@RestMethod和@RestParam,剩下就是用一个DI框架把这些rest handler创建出来。
就比如你这个接口,所有的方法都有三个一模一样的参数,而且居然还牵扯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创建出来。
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 1740 次
- 性别:

- 来自: 天津

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
超轻量的REST“框架”,希 ...
支持楼主,应该考虑如何出一个可以使用模板的 REST 框架.像JSON作为可选组 ...
-- by mdream -
超轻量的REST“框架”,希 ...
Map<String,String>里面仅仅包含URL中包含的参数信息,额 ...
-- by moonranger -
超轻量的REST“框架”,希 ...
Map<String, String> params,这个写死了,数组杂办 ...
-- by liquidthinker -
超轻量的REST“框架”,希 ...
不好意思,最近刚刚开始上班了,很忙,没多少业余时间写这个了。Spring的?可以 ...
-- by moonranger -
超轻量的REST“框架”,希 ...
要不你就发布个+spring的吧,guice已经有了。
-- by caixicai






评论排行榜