`
zeroliu
  • 浏览: 193183 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【虎.无名】自定义Java的REST行为分发器

阅读更多

【虎.无名】在Restlet和Rails中,资源所支持的Action操作是不一致的。Restlet支持4个操作,而Rails支持的则多了index等几个。前者与某个具体id资源对应,后者与一类资源对应。后者更简洁一些
1,GET /users 列表所有用户
2,POST /users 创建新用户(此时id尚未确定)
3,GET /users/{id} 显示(与id对应的)某用户
4,PUT /users/{id} 更新(与id对应的)某用户(不存在,则创建,与“2,POST”类似)
5,POST /users/{id} (扩展定义,与“4,PUT”等效,针对不支持PUT的服务器)
6,DELETE /users/{id} 删除(与id对应的)某用户
7,GET /users/{id}/orders 列表(与id对应的)某用户的所有订单
8,POST /users/{id}/orders 创建(与id对应的)某用户的新订单
9,GET /users/{id}/orders/{orderid} 显示(与id对应的)某用户的某个订单
【虎.无名】我的设想是参考Rails机制,定义自己的路由映射机制,自定义Servlet来解析如下5个操作。(注意:里面doList没有考虑根据某些条件来查询,因而没有req参数。只有doUpdate需要req参数)

protected abstract void doList(HttpServletResponse res, Map uriAttr) throws IOException,ServletException;
protected abstract void doCreate(HttpServletResponse res, Map uriAttr) throws IOException,ServletException;
protected abstract void doShow(HttpServletResponse res, Map uriAttr, String id) throws IOException,ServletException;
protected abstract void doDelete(HttpServletResponse res, Map uriAttr, String id) throws IOException,ServletException;
protected abstract void doUpdate(HttpServletResponse res, Map uriAttr, String id, HttpServletRequest req) throws IOException,ServletException;

 //REST行为分发器

public void service(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
   _log.debug("# service(HttpServletRequest)...", req.getRemoteAddr());
   String method = req.getMethod();
   String id = this.getId();
   if (null==id) {
    if(method.equalsIgnoreCase("GET")) {//1,GET /users 列表所有用户
     this.doList(res, _uriAttr);//缺省(无法定义参数,可以考虑在body中定义参数,但这样破坏了资源的一致性。)
    }else if (method.equalsIgnoreCase("POST")) {//2,POST /users 创建新用户(此时id尚未确定)
     this.doCreate(res, _uriAttr);//创建,此时id尚未确定
    }else {
     res.sendError(HttpConst.CLIENT_ERROR_Method_Not_Allowed);
    }   
   }else {
    if (method.equalsIgnoreCase("GET")) {//3,GET /users/{id} 显示(与id对应的)某用户
     this.doShow(res, _uriAttr, id);
    }else if (method.equalsIgnoreCase("PUT")) {//4,PUT /users/{id} 更新(与id对应的)某用户(不存在,则创建,与“2,POST”类似)
     this.doUpdate(res, _uriAttr, id, req);
    }else if (method.equalsIgnoreCase("POST")) {//5,POST /users/{id} (扩展定义,与“4,PUT”等效,针对不支持PUT的服务器)
     this.doUpdate(res, _uriAttr, id, req);//此时id已经确定,针对此URI可替代PUT方法
    }else if (method.equalsIgnoreCase("DELETE")) {//6,DELETE /users/{id} 删除(与id对应的)某用户
     this.doDelete(res, _uriAttr, id);
    }else { //缺省行为!
     res.sendError(HttpConst.CLIENT_ERROR_Method_Not_Allowed);
    }
   }
}

 (待续)
原贴http://hi.baidu.com/zeorliu/blog/item/ca3a3997ab79ac6b55fb96c2.html 2008-09-08 17:59【虎.无名】自定义Java的REST行为分发器
参考
http://hi.baidu.com/821115/blog/item/e6df10f03a9efdada50f520f.html 传统的Java Web MVC框架距离REST有多远
【虎.无名】(评论)Restlet作者认为servlet是过度设计,因而重新定义了一套API,后来我发现,restlet本身也似乎过度设计了,连MediaType都使用了特定的类来表示,请求也没有获取charset的方法,getText()获取没有字符集参数,因而支持中文很困难。JRest4Guice则是一个国产开源项目(项目地址: http://code.google.com/p/jrest4guice/ 这个项目借鉴了http://www.iteye.com/topic/170289 的一些思想和代码),使用Guice作为容器(因而要求jdk5环境),基于Servlet来实现REST开发。不过作者最近半年也没怎么更新了。其中路由映射机制倒是给我了一些参考。不过,我感觉,不应该根据http的method来分发请求,而应根据REST特点行为来分发请求
http://cnoss.iteye.com/blog/176755 2008-03-27 向大家推荐一个轻量级的java rest 框架 JRest4Guice
http://www.iteye.com/topic/201103 一个Java的Restful服务框架(JRest4Guice),支持JPA、JAAS、分布式资源对象
http://www.iteye.com/topic/170289 2008-03-11 超轻量的REST“框架”:目前唯一的功能就是实现REST风格的URL映射以及不同的HTTP方法(GET,POST,PUT和DELETE)对资源类的方法的映射,框架的使用很简单。 【虎.无名:是JRest4Guice的最初原型】
http://www.ibm.com/developerworks/cn/xml/x-restfulsoa/index.html 2008年3月06日:使用 XML 实现 REST 式的 SOA,简化面向服务和XML序列化 【虎.无名:这是上面超轻量的REST“框架”的灵感来源】
http://www.iteye.com/topic/85928 2007-06-02 (dlee)Java REST框架一览
http://www.iteye.com/topic/70113 2007-04-11 关于REST的一点想法,欢迎大家讨论。

分享到:
评论

相关推荐

    flink自定义函数-字符串BASE64解码,字符编码:HEX(16进制,不编码)

    1. flink自定义函数 2. 对字符串进行BASE64解码,字符串内容是十六进制,字符不编码 3. flinksql进行调用 4. 自定义函数调用过程 4.1. 编译打包代码,生成的jar复制到flink安装目录下的lib目录。 例如:/flink/lib ...

    java掌握包的声明与引用

    (2)Main.java在无名包中。 其中,Main.java中的类使用到StuList.java和Student.java中的成员变量或者成员方法。 本实验中的源程序可以完成如下任务: 创建学生表,从键盘上输入学生信息加入学生表,添加学生信息,...

    实现一个简单的HTTP请求的Flink UDF函数

    1. flink自定义函数 2. 在flinksql中实现HTTP请求 3. 在flinksql中自定义函数调用过程 3.1. 编译打包代码,生成的jar复制到flink安装目录下的lib目录。 例如:/flink/lib 3.2. flinksql脚本注册自定义函数 CREATE ...

    spire.doc核心jar包,可操作word文档,合并文档

    spire.doc核心jar包,可操作word文档,合并文档

    无名微博 v5.zip

    无名微博产品特性与优点 1.简约 摈弃了博客的复杂,汲取了微博的简便,一句话,一段文字,记录你心路历程。 2.运行环境低 一个支持asp的空间,就可以基本运行本程序,如果支持aspjpeg组件和rewrite组件将获取更...

    无名个人微博系统(MicroBlog)源码.zip

    无名轻博客 v3.0 正式版 更新日志 设置微博座右铭与描述分开 微博昵称用于回复 自动第一张图缩略图 视频自适应 私密描述逻辑修改 评论增加网址字段 收到评论微信提醒 增加浏览量 增加安装程序,使用更方便。

    小手无名内存修改器

    小手无名内存修改器

    无名微博 3.03.rar

    无名微博是一款基于Asp和Access平台的简单易用的个人微博系统(miniblog)。致力于为您提供快速、稳定,且在使用上又极其简单、舒适的微博服务。 无名微博 3.03 更新内容: 集成已发布的新浪微博asp版本sdk ...

    java期末复习第讲面向对象程序设计.pptx

    2023年5月29日 4.1.3 类路径(CLASSPATH) 编译时:javac –d CLASSPATH路径 Myclass.java 例如:javac –d d:\Myjava myclass.java 则直接在d:\Myjava下创建在myclass.java中指明的包目录,并把myclass.class拷到...

    Java 反编译软件

    1、打开一个或者多个*.class文件,XJad反编译后,重命名为*.java文件, 保存至当前文件夹,并在编辑器中打开查看; 2、打开一个文件夹,XJad将该文件夹下所有*.class文件进行反编译,并保存至该文件夹下, 依据包...

    Java基础包.pdf

    Java包概念 Java中的包(Package)是一种用来管理类和接口的机制。它可以将相关的类和接口放在同一个命名空间下,以避免类名和接口名的冲突,并提供更好的可重用性和可维护性。 Java包的名称采用点号“.”进行分隔。...

    基于PHP的无名轻博客(miniblog)个人博客系统源码.zip

    基于PHP的无名轻博客(miniblog)个人博客系统源码.zip 基于PHP的无名轻博客(miniblog)个人博客系统源码.zip 基于PHP的无名轻博客(miniblog)个人博客系统源码.zip 基于PHP的无名轻博客(miniblog)个人博客系统源码.zip ...

    UniGUI集合说明--追月无名.doc

    UniGUI集合说明--追月无名.doc

    UniGUI集合说明--追月无名 2017.doc

    UniGUI集合说明--追月无名 2017.doc

    通达信指标公式源码大象无名.doc

    通达信指标公式源码大象无名.doc

    无名模块v1.5最新版.ec

    本易语言模块提供无名神锁功能,可用于制作锁机程序。只可用来恶搞不可用来做违法之事。无名模块v1.5新版提供新版无名神锁功能。

    无名创新慧飞者PRO飞控资料包20201024.zip

    无名创新慧飞者PRO飞控资料包全套

    Java面向对象程序设计方案练习题(1).doc

    构造方法与重载 为"无名的粉"写一个类 class WuMingFen 要求 1.有三个属性 面码:String theMa 粉的分量(两) int quantity 是否带汤 boolean likeSoup 2.写一个构造方法 以便于简化初始化过程 如 WuMingFen f1 = new ...

    无名轻博客.zip

    无名轻博客2.0 PHP源码 短小精悍 附带Nginx伪静态规则 (phpstudy测试通过)

    无名网站管理系统nameless CMS 1.1.rar

    无名网站管理系统nameless CMS 具有以下功能亮点: 1、后台管理菜单可自由增删,可以给每个管理帐号指定页面维护权限。 2、除了页面维护权限外,还增加了栏目的维护权限分配。灵活实现分工维护。 3、提供系统设置...

Global site tag (gtag.js) - Google Analytics