JERSEY中文翻译(第三章、JAX-RS Application, Resources and Sub-Resources)
JAX-RS Application Resource and Sub-Resource
本章要介绍的是JAX-RS的核心概念——Resouce、Sub-Resource
JAX-RS的2.0的java在线文档链接是:http://jax-rs-spec.java.net/nonav/2.0/apidocs/index.html
JAX-RS的2.0的规范草案文档链接是:http://jcp.org/en/jsr/summary?id=339
3.1 Root Resource Classes
Root Resource Classes是一个至少包含@PATH注解或者方法带有@GET, @PUT, @POST, @DELETE注解的POJOS。这一节就是展示如何使用Java对象内的注解创建一个Jersey的Restful服务器。
下面这段代码就是一个带有JAX-RS注解的简单事例,可以从这里下载,https://maven.java.net/content/repositories/releases/org/glassfish/jersey/examples/helloworld/2.2/
package org.glassfish.jersey.examples.helloworld; import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces; @Path("helloworld")
public class HelloWorldResource {
public static final String CLICHED_MESSAGE = "Hello World!"; @GET
@Produces("text/plain")
public String getHello() {
return CLICHED_MESSAGE;
}
}
让我们分析一下上面这段程序的注释。
3.1.1 @PATH
@PATH是这事URI的相对路径,在上面的例子中,设置的是本地的URI的/helloworld。这事一个非常简单的关于@PATH的例子,更牛逼的是你可以嵌入变量到URIs里面
URI的路径模版有URIS和嵌入URI语法的变量组成。变量将会被匹配到的URI的那部分多代替。例如下面的@Path注解
@Path("/users/{username}")
按照这种类型的例子,一个用户会方便的填写他的名字,那么Jersey服务器也会按照这个Path规则匹配到这个请求。例如:http://example.com/users/Galileo
@Path("/users/{username}")
public class UserResource {
@GET
@Produces("text/xml")
public String getUser(@PathParam("username") String userName) {
...
}
}
它规定匹配正则表达式式要精确到大小写的,如果填写的话会覆盖默认的表达式"[^/]+?",例如
@Path("users/{username: [a-zA-Z][a-zA-Z_0-9]*}")
这个正则表达式匹配由大小写字符、横杠和数字组成的字符串,如果不匹配的花,那么会返回404错误页面。
一个@Path的内容是否以"/"开头都没有区别,同样是否以"/"结尾也没有什么区别
3.1.2 @GET, @PUT, @POST, @DELETE
@GET, @PUT, @POST, @DELETE 是JAX-RS定义的注解,它非常类似与HTTP的方法名。在上面的例子中,这些注解是通过HTTP的GET方法实现的。资源的相应就是HTTP的相应。
下面这个例子是存储服务的一个片段,是使用PUT方法处理创建或者修改存储容器
事例 3.3 PUT
@PUT
public Response putContainer() {
System.out.println("PUT CONTAINER " + container); URI uri = uriInfo.getAbsolutePath();
Container c = new Container(container, uri.toString()); Response r;
if (!MemoryStore.MS.hasContainer(c)) {
r = Response.created(uri).build();
} else {
r = Response.noContent().build();
} MemoryStore.MS.createContainer(c);
return r;
}
如果没有明确的定义的话,JAX-RS运行的时候默认支持HEAD和OPTIONS方法。
3.1.3 @Produces
@Produces是定义返回值的媒体类型的。在下面这个例子里面,将会返回一个"text/plain"类型的相应。@Produces既可以应用在类的水平上,也可以作用与方法的水平。这里是一个例子:
@Path("/myResource")
@Produces("text/plain")
public class SomeResource {
@GET
public String doGetAsPlainText() {
...
}
@GET
@Produces("text/html")
public String doGetAsHtml() {
...
}
}
这个doGetAsPlainText方法默认使用类水平的@Produces注解内容,也就是text/plain。而doGetAsHtml方法使用方法水平上的@Produces,也就是text/html。也就是说方法水平层面的@Products会覆盖类层面的@Produces。
@Produces可以定义多个返回类型,例如:
@GET
@Produces({"application/xml", "application/json"})
public String doGetAsXmlOrJson() {
...
}
无论application/xml或者application/json那个匹配上了,都会出发doGetAsXmlOrJson,如果两个都匹配了,那么会选择首先匹配的那个
3.2 Parameter Annotations(@Param)
资源函数的参数可以通过带有注解参数的注解来获取请求的信息。前面的一个例子就是在匹配了@Path之后,通过@PathParam获取URL请求参数的例子。
@QueryParam是获取URL的参数的,例如:
@Path("smooth")
@GET
public Response smooth(
@DefaultValue("2") @QueryParam("step") int step,
@DefaultValue("true") @QueryParam("min-m") boolean hasMin,
@DefaultValue("true") @QueryParam("max-m") boolean hasMax,
@DefaultValue("true") @QueryParam("last-m") boolean hasLast,
@DefaultValue("blue") @QueryParam("min-color") ColorParam minColor,
@DefaultValue("green") @QueryParam("max-color") ColorParam maxColor,
@DefaultValue("red") @QueryParam("last-color") ColorParam lastColor) {
...
}
上面的代码比较好理解,如果step的参数存在的话,那么附值给它,否则默认是2。如果step的内容不是int类型的,那么会返回404错误。
JERSEY中文翻译(第三章、JAX-RS Application, Resources and Sub-Resources)的更多相关文章
- JERSEY中文翻译(第一章、Getting Started、1.1.7)
最近发现jersey特别流行,但是中文资料非常少,深感没有资料的痛苦,所以分享一下看到的内容供他人快速入门. 今天翻译第一章.Getting Started.https://jersey.java.n ...
- JERSEY中文翻译(第一章、Getting Started、2.2)
前言 这是jersey2.2的用户向导,我们会尽力维护它的更新并且也会增加新的章节.当阅读本用户指南的时候,也要参阅Jersey API 文档,额外的信息补充JERSEY的新特性和API 如果你想要为 ...
- Gradle2.0用户指南翻译——第三章. 教程
翻译项目请关注Github上的地址:https://github.com/msdx/gradledoc本文翻译所在分支:https://github.com/msdx/gradledoc/tree/2 ...
- JERSEY中文翻译(第三章、模块和依赖)
Chapter 2 Modules and Dependencencies 2.1 Java SE 兼容 所有的Jersey组建都是基于Java6开发的,所以你的Java必须是Java6以上的版本才能 ...
- Unity渲染优化中文翻译(三)——GPU的优化策略
如果游戏的渲染瓶颈来自于GPU 首要任务就是找出造成GPU瓶颈的因素所在,通常GPU的性能受到像素分辨率的影响,特别是在移动客户端的游戏,但是内存带宽和顶点计算的影响也需要注意.这些因素的影响都需要实 ...
- 《Introduction to Tornado》中文翻译计划——第五章:异步Web服务
http://www.pythoner.com/294.html 本文为<Introduction to Tornado>中文翻译,将在https://github.com/alioth3 ...
- 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (11) -----第三章 查询之异步查询
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第三章 查询 前一章,我们展示了常见数据库场景的建模方式,本章将向你展示如何查询实体 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (19) -----第三章 查询之使用位操作和多属性连接(join)
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-16 过滤中使用位操作 问题 你想在查询的过滤条件中使用位操作. 解决方案 假 ...
随机推荐
- 分析iOS Crash文件,使用命令符号化iOS Crash文件
TBMainClient.ipa改名为TBMainClient.zip并解压得到TBMainClient.app 然后将TBMainClient.app TBMainClient.app.d ...
- MySql错误处理(二) - Condition & Handle
20.2.10. 条件和处理程序 20.2.10.1. DECLARE条件 20.2.10.2. DECLARE处理程序 特定条件需要特定处理.这些条件可以联系到错误,以及子程序中的一般流程控制. 2 ...
- Swift - 用CATransform3DMakeRotation实现翻页效果
Swift - 用CATransform3DMakeRotation实现翻页效果 效果 源码 https://github.com/YouXianMing/Swift-Animations // // ...
- UICollectionViewFlowLayout使用示例
UICollectionViewFlowLayout使用示例 效果 源码 https://github.com/YouXianMing/iOS-Project-Examples // // ViewC ...
- 用开源项目RangBar来实现有范围的SeekBar
RangeBar是一个可以有选择范围的Seekbar,用这个项目其实是很简单的.就是一个自定义控件~ 一.布局文件 这里可以看到有很多属性可以定制,除了通过xml来定义也可以再java代码中进行定义. ...
- 02 如何创建线程 线程并发与synchornized
所有程序运行结果 请自行得出 创建线程方式一:继承Thread类 步骤: 1,定义一个类继承Thread类. 2,覆盖Thread类中的run方法. 3,直接创建Thread的子类对象创建线程. 4, ...
- 对CAP定理的理解
CAP定理的常规解释是任何分布式系统只能在一致性(Consitency),可用性(Availability)和分区容忍性(Partition Tolerance)中三选二.这个解释很让人费解,笔者在看 ...
- 样条之拉格朗日Lagrange(一元全区间)插值函数
这是使用拉格朗日插值函数生成的样条曲线.在数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫·拉格朗日命名的一种多项式插值方法.许多实际问题中都用函数来表示某种内在联系或规律,而不少函数都只能通过 ...
- 接收连接basic_socket_acceptor
概述 TCP有一处和UDP不同的地方是TCP是面向连接的,TCP有建立连接.通信.关闭连接的操作,Boost.Asio提供了ip::tcp::acceptor用来接收新的TCP连接,底层由socket ...
- quantum theory
the principles of quantum mechanics by p.a.m.dirac.