`
zeroliu
  • 浏览: 196456 次
  • 性别: 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的一点想法,欢迎大家讨论。

分享到:
评论

相关推荐

    Jdk8下载(附:官网下载地址)

    Java开发工具(JDK)是Java编程语言的核心组件,它包含了Java编译器、Java运行时环境(JRE)、调试器以及其他必要的工具,使得开发者能够编写、测试和部署Java应用程序。JDK8是Java的一个重要版本,它引入了许多新特性...

    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中的成员变量或者成员方法。 本实验中的源程序可以完成如下任务: 创建学生表,从键盘上输入学生信息加入学生表,添加学生信息,...

    无名驱动模块

    这个“无名”部分可能意味着它是一个自定义开发或者非官方发布的驱动,可能没有明确的标识或者是为了特定目的而创建的。 在Windows操作系统中,驱动程序通常分为几个级别,包括系统级驱动、内核模式驱动和用户模式...

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

    Spire.Doc是一款强大的Java库,专门用于处理Microsoft Word文档,包括创建、编辑、转换和显示DOC、DOCX格式的文件。这个核心jar包是开发者在Java应用程序中操作Word文档的关键工具,尤其对于需要批量处理或者合并多...

    JavaOOP_第2章上机练习.zip

    在本压缩包“JavaOOP_第2章上机练习.zip”中,主要涉及的是Java面向对象编程(Object-Oriented Programming,简称OOP)的相关知识。Java OOP是Java编程语言的核心特性,它允许我们将复杂的程序设计分解为一系列相互...

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

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

    《面向对象程序设计JAVA语言程序设计》期末考试试题及部分答案.doc

    这意味着Java中不能改变运算符的行为,例如不能定义一个自定义的方式使得"+"运算符用于字符串连接或其他特殊操作。 2. 类定义规则:Java中的类定义可以使用`class`关键字,且类可以实现一个或多个接口,但不能使用`...

    小手无名内存修改器

    "小手无名内存修改器"很可能是一个面向游戏玩家的工具,允许用户在游戏过程中改变内存中的数值,例如生命值、金钱、经验等,以达到作弊的效果。在IT领域,这类工具主要被程序员和逆向工程师用来调试和分析应用程序的...

    win64-java-8u291.zip

    Java开发工具包(JDK)是Java编程语言的软件开发平台,它包含了编译器、调试器、文档生成工具以及Java运行环境等组件。在给定的“win64-java-8u291.zip”压缩包中,我们讨论的是Windows 64位版本的Java 8 Update 291...

    无名微博 v5.zip

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

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

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

    java判断题整本书的.doc

    - 接口是Java中的另一种抽象类型,可以看作是一组方法签名的集合,用于定义行为规范。 - 一个类可以实现多个接口,从而实现多重继承的效果。 - 接口中的方法默认为`public abstract`,常量默认为`public static ...

    JAVA英文常用词汇.doc

    41. **Java Development Kit (JDK)**:包含Java编译器、调试器和其他工具的开发工具包。 42. **Java Foundation Class (JFC)**:Java的图形用户界面库,扩展了AWT,包括Swing组件。 43. **Java Runtime ...

    無名網絡 WwW.Yu23.CoM 全站程序

    1. **CDN内容分发网络**: 通过全球分布的节点,提高网站加载速度。 2. **缓存策略**: 利用浏览器缓存或服务器缓存减少请求次数,提升响应速度。 3. **代码优化**: 压缩代码、合并文件、图片优化等,减少加载时间。 ...

    java jdk8免安装版压缩包.zip

    Java JDK8免安装版压缩包.zip是一个包含Java Development Kit(JDK)8的便携式版本,无需通过传统安装过程即可在计算机上使用。这个压缩包简化了Java开发环境的配置,尤其对于需要在不同系统间移动开发环境或者对...

    java程序的编码通过样例test。java(附执行程序)

    打开命令行,进入`test.java`所在目录,输入`javac test.java`,如果源代码没有错误,将会生成一个`Test.class`文件(假设`Test`是`test.java`中的主类)。 编译完成后,我们使用`java.exe`执行器来运行程序。在...

    java判断题.pdf

    1. **Java版本**:Java运行平台分为J2SE(Java Standard Edition)、J2EE(Java Enterprise Edition)和J2ME(Java Micro Edition)。J2SE主要用于桌面应用,J2EE用于企业级应用开发,而J2ME则主要用于移动应用开发...

    JAVA复习题与答案

    Java规定每个类至少有一个构造器,但如果程序员没有显式定义构造器,Java编译器会自动提供一个默认构造器。此外,构造器的返回类型不是`void`,而是没有返回类型的。 4. **包是按照目录、子目录存放的** 错误。...

Global site tag (gtag.js) - Google Analytics