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/

  1. package org.glassfish.jersey.examples.helloworld;
  2.  
  3. import javax.ws.rs.GET;
  4. import javax.ws.rs.Path;
  5. import javax.ws.rs.Produces;
  6.  
  7. @Path("helloworld")
  8. public class HelloWorldResource {
  9. public static final String CLICHED_MESSAGE = "Hello World!";
  10.  
  11. @GET
  12. @Produces("text/plain")
  13. public String getHello() {
  14. return CLICHED_MESSAGE;
  15. }
  16. }

让我们分析一下上面这段程序的注释。

3.1.1 @PATH

@PATH是这事URI的相对路径,在上面的例子中,设置的是本地的URI的/helloworld。这事一个非常简单的关于@PATH的例子,更牛逼的是你可以嵌入变量到URIs里面

URI的路径模版有URIS和嵌入URI语法的变量组成。变量将会被匹配到的URI的那部分多代替。例如下面的@Path注解

  1. @Path("/users/{username}")

按照这种类型的例子,一个用户会方便的填写他的名字,那么Jersey服务器也会按照这个Path规则匹配到这个请求。例如:http://example.com/users/Galileo

  1. @Path("/users/{username}")
  2. public class UserResource {
  3.  
  4. @GET
  5. @Produces("text/xml")
  6. public String getUser(@PathParam("username") String userName) {
  7. ...
  8. }
  9. }

它规定匹配正则表达式式要精确到大小写的,如果填写的话会覆盖默认的表达式"[^/]+?",例如

  1. @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

  1. @PUT
  2. public Response putContainer() {
  3. System.out.println("PUT CONTAINER " + container);
  4.  
  5. URI uri = uriInfo.getAbsolutePath();
  6. Container c = new Container(container, uri.toString());
  7.  
  8. Response r;
  9. if (!MemoryStore.MS.hasContainer(c)) {
  10. r = Response.created(uri).build();
  11. } else {
  12. r = Response.noContent().build();
  13. }
  14.  
  15. MemoryStore.MS.createContainer(c);
  16. return r;
  17. }

如果没有明确的定义的话,JAX-RS运行的时候默认支持HEAD和OPTIONS方法。

3.1.3 @Produces

@Produces是定义返回值的媒体类型的。在下面这个例子里面,将会返回一个"text/plain"类型的相应。@Produces既可以应用在类的水平上,也可以作用与方法的水平。这里是一个例子:

  1. @Path("/myResource")
  2. @Produces("text/plain")
  3. public class SomeResource {
  4. @GET
  5. public String doGetAsPlainText() {
  6. ...
  7. }
  8.  
  9. @GET
  10. @Produces("text/html")
  11. public String doGetAsHtml() {
  12. ...
  13. }
  14. }

这个doGetAsPlainText方法默认使用类水平的@Produces注解内容,也就是text/plain。而doGetAsHtml方法使用方法水平上的@Produces,也就是text/html。也就是说方法水平层面的@Products会覆盖类层面的@Produces。

@Produces可以定义多个返回类型,例如:

  1. @GET
  2. @Produces({"application/xml", "application/json"})
  3. public String doGetAsXmlOrJson() {
  4. ...
  5. }

无论application/xml或者application/json那个匹配上了,都会出发doGetAsXmlOrJson,如果两个都匹配了,那么会选择首先匹配的那个

3.2 Parameter Annotations(@Param)

资源函数的参数可以通过带有注解参数的注解来获取请求的信息。前面的一个例子就是在匹配了@Path之后,通过@PathParam获取URL请求参数的例子。

@QueryParam是获取URL的参数的,例如:

  1. @Path("smooth")
  2. @GET
  3. public Response smooth(
  4. @DefaultValue("2") @QueryParam("step") int step,
  5. @DefaultValue("true") @QueryParam("min-m") boolean hasMin,
  6. @DefaultValue("true") @QueryParam("max-m") boolean hasMax,
  7. @DefaultValue("true") @QueryParam("last-m") boolean hasLast,
  8. @DefaultValue("blue") @QueryParam("min-color") ColorParam minColor,
  9. @DefaultValue("green") @QueryParam("max-color") ColorParam maxColor,
  10. @DefaultValue("red") @QueryParam("last-color") ColorParam lastColor) {
  11. ...
  12. }

上面的代码比较好理解,如果step的参数存在的话,那么附值给它,否则默认是2。如果step的内容不是int类型的,那么会返回404错误。

JERSEY中文翻译(第三章、JAX-RS Application, Resources and Sub-Resources)的更多相关文章

  1. JERSEY中文翻译(第一章、Getting Started、1.1.7)

    最近发现jersey特别流行,但是中文资料非常少,深感没有资料的痛苦,所以分享一下看到的内容供他人快速入门. 今天翻译第一章.Getting Started.https://jersey.java.n ...

  2. JERSEY中文翻译(第一章、Getting Started、2.2)

    前言 这是jersey2.2的用户向导,我们会尽力维护它的更新并且也会增加新的章节.当阅读本用户指南的时候,也要参阅Jersey API 文档,额外的信息补充JERSEY的新特性和API 如果你想要为 ...

  3. Gradle2.0用户指南翻译——第三章. 教程

    翻译项目请关注Github上的地址:https://github.com/msdx/gradledoc本文翻译所在分支:https://github.com/msdx/gradledoc/tree/2 ...

  4. JERSEY中文翻译(第三章、模块和依赖)

    Chapter 2 Modules and Dependencencies 2.1 Java SE 兼容 所有的Jersey组建都是基于Java6开发的,所以你的Java必须是Java6以上的版本才能 ...

  5. Unity渲染优化中文翻译(三)——GPU的优化策略

    如果游戏的渲染瓶颈来自于GPU 首要任务就是找出造成GPU瓶颈的因素所在,通常GPU的性能受到像素分辨率的影响,特别是在移动客户端的游戏,但是内存带宽和顶点计算的影响也需要注意.这些因素的影响都需要实 ...

  6. 《Introduction to Tornado》中文翻译计划——第五章:异步Web服务

    http://www.pythoner.com/294.html 本文为<Introduction to Tornado>中文翻译,将在https://github.com/alioth3 ...

  7. 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...

  8. 《Entity Framework 6 Recipes》中文翻译系列 (11) -----第三章 查询之异步查询

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第三章 查询 前一章,我们展示了常见数据库场景的建模方式,本章将向你展示如何查询实体 ...

  9. 《Entity Framework 6 Recipes》中文翻译系列 (19) -----第三章 查询之使用位操作和多属性连接(join)

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-16  过滤中使用位操作 问题 你想在查询的过滤条件中使用位操作. 解决方案 假 ...

随机推荐

  1. 【Devops】【docker】【CI/CD】Jenkins源码管理,设置gitlab上项目的clone地址 + jenkins构建报错:Please make sure you have the correct access rights and the repository exists.

    注意,如果 jenkins构建报错:Please make sure you have the correct access rights and the repository exists. 而此时 ...

  2. 【Devops】【docker】【CI/CD】docker启动的Jenkins容器 - 系统管理 - 全局工具配置 - 自动安装JDK、Maven、Git、Docker

    本篇适用于jenkins是启动的docker容器,自动安装JDK  Maven  Git   Docker等全局工具 ========================================= ...

  3. information_schema系列九

    information_schema系列九   1:INNODB_SYS_FOREIGN 这个表存储的是INNODB关于外键的元数据信息 Column name Description ID 外键的名 ...

  4. C# ApartmentState 枚举,指定线程单元状态

    1.ApartmentState 指定的单元状态 Thread. 命名空间:   System.Threading程序集:  mscorlib(位于 mscorlib.dll) 成员       成员 ...

  5. 【Java并发】JUC—ReentrantReadWriteLock有坑,小心读锁!

    好长一段时间前,某些场景需要JUC的读写锁,但在某个时刻内读写线程都报超时预警(长时间无响应),看起来像是锁竞争过程中出现死锁(我猜).经过排查项目并没有能造成死锁的可疑之处,因为业务代码并不复杂(仅 ...

  6. perf使用示例1

    perf使用示例1 perf - Performance analysis tools for Linux Performance counters for Linux are a new kerne ...

  7. 样条之埃尔米特(Hermite)插值函数

    核心代码: ////////////////////////////////////////////////////////////////////// // 埃尔米特等距插值 /////////// ...

  8. 配置Tomcat apr运行模式

    tomcat中一共有三种运行模式,分别是:bio,nio,apr bio是阻塞式IO操作,使用的是传统的java i/o处理方式,对于每一个请求都要创建一个线程来进行处理,所以开销较大不适合处理高并发 ...

  9. Python科学计算技巧积累四——双y轴图像绘制

    双y轴图像具有单y轴图像没有的对比效果,在MATLAB中有plotyy函数可以实现,Python的实现方式没有MATLAB那样方便,不过实现效果却也不见得差. 以往我常用的绘图命令是import ma ...

  10. 【大数据】Spark-Hadoop-架构对比

    Spark-Hadoop-架构对比 spark executor - zyc920716的博客 - CSDN博客 董的博客 » Apache Spark探秘:多进程模型还是多线程模型? Apache ...