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 过滤中使用位操作 问题 你想在查询的过滤条件中使用位操作. 解决方案 假 ...
随机推荐
- 使用android 隐藏类和方法
在应用程序中添加与android.jar包相同的包目录,添加要隐藏类和方法.保证能编译通过就可以.
- OAuth2.0 原理流程及其单点登录和权限控制
2018年07月26日 07:21:58 kefeng-wang 阅读数:5468更多 所属专栏: Java微服务构架 版权声明:[自由转载-非商用-非衍生-保持署名]-转载请标明作者和出处. h ...
- sk_buff的数据预留和对齐
转自:http://blog.csdn.net/keepmovingnow/article/details/45850387 数据预留和对齐主要由skb_reserve().skb_put().skb ...
- Asp.Net MVC3.0项目部署到Win7 64过程总结
前言 之前一直是通过Visual Studio直接F5来运行自己编写的项目或者小程序,很少通过部署发布到IIS上面,于是自己便在自己的笔记本上进行测试,结果还真是发现了不少问题,于是自己重新通过虚机程 ...
- 7z压缩与解压命令
在写很多工具的时候,可能会用到7z命令来进行压缩与解压操作.这里记录二个比较常用的操作:压缩.解压. 在dos窗口下输入7z命令,会显示7z的使用参数详情: 7-Zip 9.10 beta Co ...
- ios之CABasicAnimation
博主:最近iOS开发中用到CoreAnimation的framework来做动画效果,虽然以前也用过,但一直没有系统学习过,今天看到一篇非常详细的博文(虽然是日语,但真的写的很好),在此翻译出来供大家 ...
- 低版本系统兼容的ActionBar(六)用Fragment+ViewPager+Tab实现快速导航
Tab经常和Fragment结合使用,这一讲我们用3种方式来实现这种快捷导航. 0.重要的两个监听器 MyTabListener,这个我们之前已经接触过了 package com.kale.actio ...
- 将Linux默认的OpenJDK替换为Oracle JDK
在使用Logstash安装插件的时候,发生了一个错误,如下: ERROR: Something went wrong when installing logstash-input-jdbc, mess ...
- ORM(Object-Relational Mapping 对象关系映射)如何实现(转)
原文链接:http://blog.163.com/hzd_love/blog/static/13199988120107891854473/ 1.什么是ORM ORM的全称是Object Relati ...
- 数学图形之贝塞尔(Bézier)曲面
前面章节中讲了贝塞尔(Bézier)曲线,而贝塞尔曲面是对其多一个维度的扩展.其公式依然是曲线的公式: . 而之所以由曲线变成曲面,是将顶点横向连了再纵向连. 很多计算机图形学的教程都会有贝塞尔曲面的 ...