Jersey用户指南是Jersey的官方文档,

英文原版在这:https://jersey.github.io/documentation/latest/index.html

中文翻译版在这:https://github.com/waylau/Jersey-2.x-User-Guide

一、 Root Resource Classes 根资源类

这是一个简单的根资源类

//Path注解来设置url访问路径
@Path("/hello")
public class HelloWorld {
//GET注解设置接受请求类型为GET
@GET
//Produces表明发送出去的数据类型为text/plain
//与Produces对应的是@Consumes,表示接受的数据类型为text/plain
@Produces("text/plain")
public String getString() {
return "hello jersey!";
}
}

  1、首先@Path是一个URI的相对路径,文档里的原话是 “URI 的路径模版是由 URIs 和嵌入 URI 语法的变量组成,变量在运行时将会被匹配到的 URI 的那部分多代替”,简单理解就是这里Path注解的内容将决定你在浏览器将使用怎么样的链接才能访问到这个类。

  例如下面的这样:

@Path("/hello/2333")

  想要在浏览器中获得资源就需要输入这样的地址“http://localhost:8090/hello/2333”,如果输入之前的"http://localhost:8090/hello"浏览器就会显示找不到 localhost 的网页。

  然后还有例如这样的:

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

  这里的{username}就是一个变量的写法,例如:用户输入了名字“Galileo”,那么服务器就会响应 http://example.com/users/Galileo。就像c语言的Printf方法一样。

  为了接受到这个用户变量,@PathParam 用在接收请求的方法的参数上,例如:

@Path("/users/{username}")
public class UserResource { @GET
@Produces("text/xml")
public String getUser(@PathParam("username") String userName) {
...
}
}

  这里支持正则表达式,但是要求正则表达式精确到大小写。

  一个 @Path的内容是否以"/"开头都没有区别,同样是否以"/"结尾也没有什么区别,也就是说

@Path("/hello/2333/")
@Path("/hello/2333")
@Path("hello/2333/")
@Path("hello/2333")

  这四种写法是一样的。

  2、@GET, @PUT, @POST, @DELETE, ... (HTTP 方法)

  • HTTP GET:读取/列出/检索单个或资源集合。
  • HTTP POST:新建资源。
  • HTTP PUT:更新现有资源或资源集合。
  • HTTP DELETE:删除资源或资源集合。

  3、@Produces

  @Produces是定义返回值给客户端的 MIME 媒体类型,@Produces可以作为class注释,也可以作为方法注释,方法的@Produces注释将会覆盖class的注释。

@Path("/myResource")
@Produces("text/plain")
public class SomeResource {
@GET
public String doGetAsPlainText() {
...
} @GET
@Produces("text/html")
public String doGetAsHtml() {
...
}
}

  这个例子中将@Produces("text/plain")作为class注释,如果方法没有@Produces那就设为类的@Produces,如滚方法有不一样的@Produces就是用方法自己的@Produces。

  如果一个资源类是能够生产多个 MIME 媒体类型,资源的方法的响应将会对应对于客户端来说最可接受的媒体类型。HTTP 请求头部宣布接受什么是最容易被接受的。例如,如果接受头部是 Accept: text/plain 然后dogetasplaintext 方法会被调用。如果接受标题是Accept: text/plain;q=0.9, text/htm,即客户可以接受 text/plain 和 text/html ,但更容易接收后者的媒体类型,然后 dogetashtml 方法会被调用。

  指定多个MIME类型

指定一个MIME类型 >@Produces("application/json")

指定多个MIME类型 >@Produces({"application/json","application/xml"})

  设置优先级

@GET
@Produces({"application/xml; qs=0.9", "application/json"})
public String doGetAsXmlOrJson() {
...
}

  在上面的示例,如果客户端是接受application/xml或者 application/json,那么服务器总是发送application/json,因为 application/xml有一个较低的qs。

  4、@Consumes

    @Consumes注释是用来指定表示可由资源消耗的 MIME 媒体类型。

@POST
@Consumes("text/plain")
public void postClichedMessage(String message) {
// Store the message
}

  在这个例子中,该 Java 方法将接受的参数的MIME 媒体类型应该要是 text/plain 。

二、arameter Annotations (@*Param) 参数注解

  1、使用@PathParam可以获取URI中指定规则的参数,比如:

import javax.ws.rs.*;

//Path注解来设置url访问路径
@Path("/hello/{username}")
public class HelloWorld {
//GET注解设置接受请求类型为GET
@GET
//Produces表明发送出去的数据类型为text/plain
//与Produces对应的是@Consumes,表示接受的数据类型为text/plain
@Produces("text/plain")
public String getString(@PathParam("username") String userName) {
return userName;
}
}

  这样访问的URI将是一个http://localhost:8090/hello/“username”,引号的位置是需要输入的参数,如果我在浏览器中输入这样的URI:http://localhost:8090/hello/2333,

  这个2333就是从URI获取的

  2、@QueryParam 用于从请求 URL 的查询组件中提取查询参数。

//Path注解来设置url访问路径
@Path("/hello")
public class HelloWorld {
//GET注解设置接受请求类型为GET
@GET
//Produces表明发送出去的数据类型为text/plain
//与Produces对应的是@Consumes,表示接受的数据类型为text/plain
@Produces("text/plain")
public String getString(@QueryParam("name") String Name, @QueryParam("age") int age) {
return "name: " + Name + "\nage: " + age;
}
}

  如果输入这样的URI:http://localhost:8090/hello?name=2333&age=2222,将得到这样的结果

  如果需要为参数设置默认值,可以使用@DefaultValue,如:

import javax.ws.rs.*;

//Path注解来设置url访问路径
@Path("/hello")
public class HelloWorld {
//GET注解设置接受请求类型为GET
@GET
//Produces表明发送出去的数据类型为text/plain
//与Produces对应的是@Consumes,表示接受的数据类型为text/plain
@Produces("text/plain")
public String getString(@QueryParam("name") String Name, @DefaultValue("22")@QueryParam("age") int age) {
return "name: " + Name + "\nage: " + age;
}
}

  如果使用URI:http://localhost:8090/hello?name=2333,那么

  这里的age就是使用的默认值,如果 @DefaultValue不与 @QueryParam联合使用,查询参数在请求中如果不存在,List、Set 或者 SortedSet 类型将会是空值集合,对象类型将为空,Java 的定义默认为原始类型。

  3、FromParam

  @FormParam比较特殊,因为它提取信息,先是请求所表示的MIME媒体类型为 application/x-www-form-urlencoded,并且符合指定的 HTML 编码的形式。如:

@POST
@Consumes("application/x-www-form-urlencoded")
public void post(@FormParam("name") String name) {
// ...
}

  4、BeanParam

  当请求参数很多时,比如客户端提交一个修改用户的PUT请求,请求中包含很多项用户信息。这时可以用@BeanParam

@POST
@Consumes("application/x-www-form-urlencoded")
public void update(@BeanParam User user) {
// Store the user data
}

  User Bean定义如下:

@XmlRootElement(name = "user")
public class User {
@PathParam("userName)
private String userName; @FormParam("name")
private String name; @FormParam("telephone")
private String telephone; @FormParam("email")
private String email; public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
}
...
}

三、Sub-resources 子资源

  @Path 可以用在类上,这样的类称为根资源类。也可以被用来根资源类的方法上。这类方法是被称为子资源方法(sub-resource method)

import javax.ws.rs.*;

//Path注解来设置url访问路径
@Path("/hello")
public class HelloWorld { @GET
@Produces("text/plain")
@Path("/2333")
public String getString(@QueryParam("name") String Name, @DefaultValue("22")@QueryParam("age") int age) {
return "/2333name: " + Name + "\nage: " + age;
} @GET
@Produces("text/plain")
public String getString1(@QueryParam("name") String Name, @DefaultValue("22")@QueryParam("age") int age) {
return "name: " + Name + "\nage: " + age;
} }

  如果请求 URL 的路径是“hello”,那么资源的方法中没有 @Path 注解的getString1将被选择。

  如果请求的 URL 请求的路径是“printers/2333”,则首先在根资源类中进行匹配,然后在子资源中,相匹配的方法“2333”将被选择,在这种情况下,子资源方法是 getString。因此,在这个例子中的 URL 路径将会分层匹配进行。

四、Rules of Injection 注入规则

  注入可以用在属性,构造函数参数,资源/子资源/子资源定位方法的参数和 bean setter方法。

@Path("{id:\\d+}")
public class InjectedResource {
// 注入到属性
@DefaultValue("q") @QueryParam("p")
private String p; // 注入到构造函数参数
public InjectedResource(@PathParam("id") int id) { ... } // 注入到资源参数
@GET
public String get(@Context UriInfo ui) { ... } // 注入子资源方法参数
@Path("sub-id")
@GET
public String get(@PathParam("sub-id") String id) { ... } // 注入子资源方法参数定位器方法参数
@Path("sub-id")
public SubResource getSubResource(@PathParam("sub-id") String id) { ... } // 注入 bean setter 方法
@HeaderParam("X-header")
public void setHeader(String header) { ... }
}

  当注射到一个生命周期为单域的资源类。在这种情况下,类的属性或构造函数的参数不能被注入请求特定的参数。所以,例如,以下是不允许的。

@Path("resource")
@Singleton
public static class MySingletonResource { @QueryParam("query")
String param; //错误:不能将特定参数注入单例资源,
//会使程序初始化失败 @GET
public String get() {
return "query param: " + param;
}
}

  换句话说,如果你希望一个资源实例的服务很多请求,则资源实例不能绑定到一个特定的请求参数。

  存在例外,特定请求对象可以注入到构造函数或类属性。这些对象的运行时注入的代理可以同时服务多个请求。这些请求的对象是HttpHeaders, Request, UriInfo, SecurityContex。这些代理可以使用 @Context 注释进行注入。

@Path("resource")
@Singleton
public static class MySingletonResource {
@Context
Request request; // 这个是允许的:
//请求的代理将会被注入进单例 public MySingletonResource(@Context SecurityContext securityContext) {
// 这个也是允许的:
// SecurityContext的代理将会被注入进单例
} @GET
public String get() {
return "query param: " + param;
}
}

  总结,可以为以下结构注入:

Java 构造 描述
Class fields 将值直接注入类属性。这属性 可以是 private 但一定不能是 final 。除了上面提到的代理类型方法外,不能用在单例范围。
Constructor parameters 构造函数会调用注入值。如果多个构造函数其中存在一个最可注的射参数则将被调用。除了上面提到的代理类型方法外,不能用在单例范围。
Resource methods 资源的方法(带有 @GET, @POST, ...注解)包含的参数可以在执行时注射。可以在任何范围使用。
Sub resource locators 子资源的方法(带有 @GET, @POST, ...注解)包含的参数可以在执行时注射。可以在任何范围使用。
Setter methods 值可以被注入 setter 方法将初始化属性,而不是直接将值注入属性的。注射只能用于 @Context 注释。这意味着它不能使用,例如将查询参数注入,但可以用在请求注入。setter 方法将会在对象创建后执行,且只有一次。该方法的名称不必要有一个 setter 模式。除了上面提到的代理类型,不能在单例范围内使用。

  下面的示例显示所有可能的值可以被注入的 Java 构建函数。

@Path("resource")
public static class SummaryOfInjectionsResource {
@QueryParam("query")
String param; // injection into a class field 注入类的属性 @GET
public String get(@QueryParam("query") String methodQueryParam) {
// injection into a resource method parameter 注入资源的方法参数
return "query param: " + param;
} @Path("sub-resource-locator")
public Class<SubResource> subResourceLocator(@QueryParam("query") String subResourceQueryParam) {
// injection into a sub resource locator parameter注入子资源定位器参数
return SubResource.class;
} public SummaryOfInjectionsResource(@QueryParam("query") String constructorQueryParam) {
// injection into a constructor parameter注入构造器的参数
} @Context
public void setRequest(Request request) {
// injection into a setter method注入setter方法
System.out.println(request != null);
}
} public static class SubResource {
@GET
public String get() {
return "sub resource";
}
}

Jersey用户指南学习笔记1的更多相关文章

  1. HTTP权威指南-学习笔记

    目录 HTTP权威指南-学习笔记 HTTP: Web的基础 URL与资源 HTTP报文 连接管理 HTTP结构 Web服务器 代理 缓存 集成点: 网关,隧道及中继 Web机器人 识别,认证与安全 客 ...

  2. JavaScript 权威指南-学习笔记(一)

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! ## JavaScript 权威指南-学 ...

  3. CSS权威指南学习笔记系列(1)CSS和文档

    题外话:HTML是一种结构化语言,而CSS是它的补充:这是一种样式语言.CSS是前端三板斧之一,因此学习CSS很重要.而我还是菜鸟,所以需要加强学习CSS.这个是我学习CSS权威指南的笔记,如有不对, ...

  4. lua游戏开发实践指南学习笔记1

    本文是依据lua游戏开发实践指南做的一些学习笔记,仅用于继续自己学习的一些知识. Lua基础 1.  语言定义: 在lua语言中,标识符有非常大的灵活性(变量和函数名),只是用户不呢个以数字作为起始符 ...

  5. Hadoop权威指南学习笔记二

    MapReduce简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考,有什么不到之处还望指出,一起学习一起进步. 转载请注明:http://blog.csdn.n ...

  6. Hadoop权威指南学习笔记一

    Hadoop简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考,有什么不到之处还望指出.一起学习一起进步. 转载请注明:http://blog.csdn.net/ ...

  7. Hadoop权威指南学习笔记三

    HDFS简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考.有什么不到之处还望指出,一起学习一起进步. 转载请注明:http://blog.csdn.net/my ...

  8. css权威指南学习笔记 —— css选择器

    1,选择器:选择器的一些基本常用规则基本都记得,w3c上都有,平时也常用,不常用的一些后代选择器经常就忘记了.一些归纳一下后代选择器,加深一下印象: a:子选择器:   p>a  a是直接是p的 ...

  9. maven权威指南学习笔记(三)——一个简单的maven项目

    目标: 对构建生命周期 (build  lifecycle),Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project O ...

随机推荐

  1. 致远A8任意文件写入漏洞_getshell_exp

    近期爆出致远 OA 系统的一些版本存在任意文件写入漏洞,远程攻击者在无需登录的情况下可通过向 URL /seeyon/htmlofficeservlet POST 精心构造的数据即可向目标服务器写入任 ...

  2. NetCore 获取appsetting.json 文件中的配置

    1. using Microsoft.Extensions.Configuration public class HomeController : Controller { public IConfi ...

  3. git rebase VS git merge? 更优雅的 git 合并方式值得拥有

    写在前面 如果你不能很好的应用 Git,那么这里为你提供一个非常棒的 Git 在线练习工具 Git Online ,你可以更直观的看到你所使用的命令会产生什么效果 另外,你在使用 Git 合并分支时只 ...

  4. 你不得不知的几个互联网ID生成器方案

    服务化.分布式已成为当下系统开发的首选,高并发操作在数据存储时,需要一套id生成器服务,来保证分布式情况下全局唯一性,以确保系统的订单创建.交易支付等场景下数据的唯一性,否则将造成不可估量的损失. 基 ...

  5. 多线程总结-同步之synchronized关键字

    目录 1.为什么要使用synchronized? 2.synchronized锁什么,加锁的目的是什么? 3.代码示例 3.1锁this和临界资源对象 3.2锁class类对象 3.3 什么时候锁临界 ...

  6. Bzoj1972: [Sdoi2010]猪国杀 题解(大模拟+耐心+细心)

    猪国杀 - 可读版本 https://mubu.com/doc/2707815814591da4 题目可真长,读题都要一个小时. 这道题很多人都说不可做,耗时间,代码量大,于是,本着不做死就不会死的精 ...

  7. STM32F0_HAL库驱动描述——基于F1的USART串口IT中断实现解析

    从原子F103 HAL库基础串口例程来看HAL程序结构: 从main函数开始,首先是HAL库两个函数的初始化: HAL_Init(): Stm32_Clock_Init(RCC_PLL_MUL9); ...

  8. .net持续集成cake篇之cake任务依赖、自定义配置荐及环境变量读取

    系列目录 新建一个构建任务及任务依赖关系设置 上节我们通过新建一个HelloWorld示例讲解了如何编写build.cake以及如何下载build.ps1启动文件以及如何运行.实际项目中,我们使用最多 ...

  9. py+selenium 老是定位不到文本内容【已解决】

    问题:定位不到文本内容,路径也正确,该加frame也有加,等待时间也够长 测试: 上图看不出差异,但是测试1就定位得到,测试2就定位不到,为什么? 看下图就知道了 区别就在于,测试2后面多了个空格!! ...

  10. 个人永久性免费-Excel催化剂功能第75波-标签式报表转标准数据源

    数据处理永远是数据分析工作中重中之重的任务,大部分人深深地陷入在数据处理的泥潭中,今天Excel催化剂再接再厉,在过往已提供了主从结构报表数据源的数据转换后,再次给大家送上标签式报表数据源的数据转换操 ...