- 浏览: 379601 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
ouyida3:
sslaowan,新春快乐,祝你阖家安康狗年大吉:)
【转载】js定义对象 -
qinghechaoge:
感谢分享,受教了
DCloud下拉刷新上拉加载 -
zero鹏:
...
Spring中的AOP -
xuyiooo:
新浪微博很适合高并发,实时性很高的网站参考的
[zz]新浪微博技术架构分析 -
liuxiang00435057:
基于这种风格的权限怎么去控制呢,精确的每个方法
Spring3.0新特征-Restful support MVC
2008年9月23日,JSR3111.0草案通过了JCP执行委员会的赞成投票 ,这基本意味着它现在已经定稿。
如果将Web看成是服务,那RESTful Web服务的Java规范就是以web services的角度来看待Web。又要经过资源与服务的辨析,在Fielding博士的论文里,有几个地方描述了资源:
数据元素 现代Web实例
资源 一个超文本引用意图指向的概念上的目标
6.2.1 重新定义资源
存在着很多地址对应于一个服务,而不是一个文档 ——创作者可能是有意将读者引导到那个服务,而不是引导到来自预先访问那个服务而获取到的特定的结果。
这与早期的对于资源的定义有了不同,过去资源就是指实体,而现在资源是抽象概念,是概念上的映射,是表示一种语义。
写道
这一句离我们日常开发上的用语最为接近,我马上想到的是Struts,Spring MVC之类的控制器模型,尤其是控制器映射。URL或者URN是资源标识符的现代Web实例,比如sslaowan最新的日志:www.iteye.com/blog/lasted-post,它标识了一个资源,就是sslaowan最新的日志,而这个资源是一种概念上的映射,它将对应于一个映射实现,这个映射实现是运行时中的一个哈希Map,它可能来自于XML映射文件,数据库表或者是注解,通过这个Key/Value数据结构找到对应的处理器(也可以叫控制器【见Spring Reference】)实现。
这和我们用Servlet这样的Java API感觉上是类似的,根据Mapping,可以转向一个具体的文件,或者是转向一个处理器来返回一个响应 (其中可能包含一个表述) 。
那么既然Servlet这样的Java API都是这样做的,跟现在Spring3支持的注解方式的REST,以及CXF、RestEasy这样支持规范的框架,究竟有什么不同或者说是进步呢?
先看看Struts1.2怎么做映射:
<action-mappings> <action path="/getPost" type="org.sample.fourm.GetPostAction" scope="request" > <action path="/blog/edit" name="post" type="org.sample.fourm.PostEditAction" scope="request"> </action>
我们可能会这样写URL:www.iteye.com/getPost.do?id=123获得某个用户的blog列表。然后会使用URL:www.iteye.com/blog/edit.do?id=12334,获得要修改的日志。
由于人们觉得应该将一个功能写在一个Action里,因此使用DispatchAction,加入parameter="method" 在<action path>段中即可。然后通过method=edit|new|list等来实现上述功能。
Spring的做法类似,可以参见http://www.iteye.com/topic/72195
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/getPost">GetPostAction</prop> </props> </property> </bean>
我们可以通过通配符来使这件事变得更容易,然后Spring把这件事又推进了一步,利用CoC,只要按照“惯例”来写,就无需配置映射了。实际上Rails给出一个缺省的Router原理类似。
之后我们做的事情就是利用HTML支持的Get和POST方法做所有的事情,一种是用Get方式,URL后面有一个用&分隔的请求变量串;一种是通过POST方式,将请求变量放到HTTP体里。Struts和Spring都采用FrontController模式来处理请求,根据映射(ActionMapping或HandlerMapping)来找到相应的处理器或者直接找到文件。
下面对比几个URI:
1 www.iteye.com/blog/123和www.iteye.com/getPost.do?id=123和www.iteye.com/getPost.do?postId=123谁能更好的表示获得用户id为123的用户的日志这个语义.
2 www.iteye.com/blog/123/edit和www.iteye.com/editPost.do?id=12334和www.iteye.com/blog/edit?id=12334和www.iteye.com/editPost.do?postId=12334和www.iteye.com/blog/getPostForEdit/12234(有点像SQL里的select for update)谁能更好的表示获得Post编号为12234的Post并要对它进行修改这个语义?
RoR的标准做法显然是把Blog看成是资源,然后将其他表示请求语义的内容加入到资源标志中,或者是放入到表述中,比如lock(锁定帖子)。
过去的框架都没法做/blog/{userId},/blog/{postId}/edit,或者是/blog/{userId}/post/{date-period}/list这样的映射。现在可以了,关键就是URL模板和参数映射:
Spring 3代码
@RequestMapping(value="/blog/{userId}/posts/{date-period}/list", method=RequestMethod.GET) public String getPost(@PathVariable("userId") long userId, @PathVariable("date-period") String datePeriod, Model model) { }
关键问题是,有必要这样做吗?
下面看看REST API和RPC的不同:
Fielding博士对于REST的网络API的定义,即连接器接口的描述如下:
写成API的形式如下:
public [响应的控制数据|[资源元数据]|[表述]] 连接器接口 (请求的控制数据 data,资源标识符 id,[表述] p)
其中控制数据 对应的现代Web实例是:if-modified-since(如果包含了 GET 请求,导致该请求条件性地依赖于资源上次修改日期。 如果出现了此头标,并且自指定日期以来,此资源已被修改,应该反回一个 304 响应代码。 )、cache-control(一个用于定义缓存指令的通用头标。)
表述 包括表述的数据(比如HTML文档,JPEG图片等)和表述的元数据(如媒体类型、最后修改时间)。其中媒体类型就是text/html,image/jpeg之类的。
资源的元数据 对应的现代Web实例是源链接、alternates、vary(一个响应头标,用于表示使用服务器驱动的协商从可用的响应表示中选择响应实体。)在Fielding博士的论文中特意将内容协商作为了一节:
信息字段的值或正常的请求参数(方法/标识符/状态码)之外的某事物,为某种特殊的请求
方法/标识符/状态码的组合改变响应的表述。当这种情况发生时,客户端需要得到通知,这
样当语义透明时一个缓存就能够知道,要为将来的请求使用一个特殊的已缓存响应,而一个
用户代理一旦知道协商的信息对于接收到的响应的影响,就能够提供比正常情况下发送的更
加详细的首选项。HTTP/1.1为这个目的引入了Vary头信息字段。Vary简单地列出了请求头
信息字段的维度(译者注:即可以进行协商的头信息字段的列表),这样响应就能够根据这
些信息发生改变。
另外一个更接近我们日常开发使用的术语的描述:
映射到一个响应 (由一个状态码、响应头信息字段和有时存在的一个表述组成)。
发表评论
-
Hibernate3.6 缓存
2011-12-12 12:06 1917一级缓存 一级缓存和get,load,save ... -
扩展Spring测试框架
2011-11-28 17:56 1221可以利用 @RunWith(Spri ... -
Hibernate inverse
2011-11-17 16:52 695在关联关系中,inverse="false" ... -
解决java.lang.IllegalStateException: getOutputStream() has already been called for
2011-09-28 13:39 32275http://www.blogjava.net/pengpen ... -
Hibernate配置联合主键(内部类实现主键)
2011-09-26 16:13 2131public class A{ privat ... -
Hibernate3.2和Hibernate3.6创建元数据的不同
2011-09-26 14:39 873在Hibernate3.2中,只要cfg.addXML将hbm ... -
[原创]面向服务的框架 Service-Oriented Framework
2011-01-03 15:18 990面向服务的框架 Service-Orient ... -
REST:讨论如何避免URL Template与实际数据的冲突
2010-06-23 19:08 1054看下面几个测试: ... -
Java 编程技术中汉字问题的分析及解决
2009-10-24 14:18 7802000 年 11 月 01 日 在基于 Java 语言 ... -
JSP/Servlet 中的汉字编码问题
2009-10-24 14:01 8702001 年 3 月 01 日 网上就 JSP/S ... -
Servlet 2.3:新特征
2009-10-24 13:54 980题注:目前servlet和jsp ... -
UTF-8 字符处理在 Web 开发中的应用
2009-10-24 13:43 931http://www.ibm.com/developerwor ... -
基础入门-JAVA字符集详解
2009-10-24 13:06 1357建议 1、数据库编码为GB2312 2、web容器编码为U ... -
Spring3.0新特征-Restful support MVC
2009-06-04 21:26 3354Spring 2.5发布不久,Spring3.0项目已经是 ... -
对Grails之误解
2009-05-26 14:39 839转自InfoQ:http://www.infoq.com/cn ... -
Spring MVC(CoC)+FCKEditor
2009-05-26 14:13 3528设计思路参考昨天写的《关于RCP与Web交互的一些 ... -
关于RCP与Web交互的一些设计思路
2009-05-25 12:06 1468使用的Web框架是Spring MVC,并利用其C ... -
我看好Flex
2009-05-20 11:41 8821 99%以上的客户端都安装了Flash runtime,解决 ... -
用ASM为类动态增加属性
2009-05-08 20:26 3495通过程序修改 .class 文件! 下面这个是用 ASM 工具 ... -
基于REST+CoC构建Java Web快速开发框架的架构思路
2009-05-08 20:21 2508在《Web开发敏捷之道》这本书的前面几章里,Dav ...
相关推荐
服务端完成权限验证后,根据元数据与 URI 的映射关系和 REST 请求中的 URI,最终得到要访问元数据的 ID。具体映射关系参见本规范(b)“URI 与元数据的映射关系”章节。 六、XML 解析 XML 解析对 REST 解析后的...
在WCF REST服务中,URI通常用于定义服务操作和资源的路径。 8. **内容协商**:允许客户端和服务协商数据格式,如XML、JSON等。在WCF REST服务中,可以通过设置消息行为(Message Behaviors)来处理内容类型。 9. *...
- **URI和路径**:REST服务的地址通常包含路径来标识资源,而在WSDL中,服务和端点的定义可能需要特别处理以匹配这些路径。 - **状态管理**:REST利用HTTP状态码来传递状态信息,WSDL需要适当地映射这些状态码。 - *...
4. 统一接口:REST的核心是统一接口,包括四个主要组件:资源、URI、HTTP方法和表现形式。 接下来,我们将详细讨论如何使用Spring框架构建REST API: 1. **Spring MVC与REST**:Spring MVC是Spring框架的一部分,...
通常,我们使用JPA(Java Persistence API)和Hibernate作为ORM框架,实现对象关系映射。 4. **Angular**: Angular是一款强大的前端JavaScript框架,用于构建单页应用。在这个项目中,Angular负责用户界面的呈现和...
【Asp.net 实现 Rest服务接口】 在现代Web开发中,REST...提供的`Asp.net编写Rest服务接口.docx`文档可能包含了更详细的设计和实现步骤,而`RestDemo`项目可能是实际的代码示例,可以进一步学习和研究。
Struts2 和 REST 整合是一个常见的Web开发实践,它允许开发者构建RESTful风格的Web服务,从而提高应用的可伸缩性和互操作性。在这个完整的例子中,我们将深入探讨Struts2框架如何与REST原则相结合,以及如何通过提供...
这个"rest开发包"可能包含了实现上述RESTful原则所需的各种工具和库,例如路由处理、HTTP方法映射、状态码管理、请求验证、数据序列化等功能。使用这样的开发包,开发者可以更快地构建出高效、易维护的RESTful API,...
REST是一种网络应用程序的设计风格和开发方式,基于HTTP协议,通过URI(Uniform Resource Identifier)定位资源,使用HTTP动词(GET、POST、PUT、DELETE等)描述操作。Django REST Framework就是遵循REST原则设计的...
然后,添加对`System.ServiceModel`和`System.ServiceModel.Web`命名空间的引用,这两个命名空间包含了实现REST服务所需的类和接口。 2. **定义服务合同**: 定义服务合同(Service Contract)是创建WCF服务的第一步...
在"REST的全部jia包"中,我们可以理解为包含了实现RESTful API所需的各种Java库和工具。 首先,我们要理解REST的基本概念。REST的核心思想是资源,通过URI(统一资源标识符)来唯一标识,并使用HTTP方法(GET、POST...
REST的核心是资源(Resource),通过URI(Uniform Resource Identifier)来唯一标识。HTTP方法(GET、POST、PUT、DELETE等)用于操作资源的不同状态。 **RESTful API设计原则** 1. **资源定位**:每个资源都有一个...
SpringBoot Data JPA 和 SpringBoot Data REST 是两个非常重要的组件,它们可以帮助开发者快速构建基于Java的Web服务。本文将深入探讨这两个技术,并结合一个实际的Demo来解释它们的工作原理和如何在项目中应用。 ...
Struts2和REST是两种广泛应用于Web开发的技术。Struts2是一个基于MVC(Model-View-Controller)架构模式的Java框架,它极大地简化了Java Servlet的开发,提供了丰富的功能来构建可维护、可扩展的Web应用程序。REST...
#### 七、REST与Big Web Services的对比 - **资源导向与过程导向**:REST倾向于资源导向,而Big Web Services则更多地关注过程调用。 - **轻量级与重量级**:REST通常被认为是轻量级的,因为它使用简单的HTTP方法和...
Spring MVC 是一个强大的Java框架,用于构建Web应用程序,而REST(Representational State Transfer)是一种软件架构风格,常用于创建Web服务。"Spring MVC REST Demo"是一个示例项目,旨在展示如何在Spring MVC框架...
5. **映射端点**:通过设置`DSRESTConnection`的`RoutePrefix`属性来指定REST URL的前缀,然后使用`DSRESTDispatcher`的`AddRoute`方法将服务器方法映射到特定的HTTP方法和路径。 6. **启动服务器**:运行服务器...
在`Angular_SpringMVC_test`这个项目中,我们可以看到一个具体的实现示例,包括SpringMVC的配置、REST API接口定义、AngularJS的控制器和服务以及视图模板。通过研究这个示例,开发者可以更好地理解如何将这三个强大...