要学习框架前,首先要知道什么是RestFul?

​ 基于REST构建的API就是RestFul风格。

REST(Representational State Transfer)介绍

1、Resource

​ 资源:在REST中,网络中一切内容都被认为是一种资源,所谓资源,就是网络上的一个实体,或者说是网络上的一个具体信息,它可以是一段文本,一张图片,一个视频,一段语音等。
统一资源访问标志符(URI):用于访问网络上某一资源的路径标志符,能够唯一确定一个资源。

比如:
http://www.abc.com/employees 表示www.abc.com主机上的employees资源。
https://dss0.bdstatic.com/-0U0bnSm1A5BphGlnYG/tam-ogel/5d4e9b24-dcc5-483a-b6da-be1e9e621891.js 表示网络上的一个js文件资源。

2、Representation

Representation:表现形式,资源是一种信息实体,我们把资源具体表现出来的形式,叫做它的“表现层”(Representation)。
比如一段文本可以使用txt的形式表示、也可以使用json形式,xml形式,html形式,二进制等等形式表示。

在REST规范中,URI只代表资源,只定位资源,不代表表现形式。资源的具体表现形式,应该在HTTP请求头中用Accept头和Content-Type头,和在响应头中用Content-Type头指定。

Accept请求头代表客户端会接受何种表现形式的资源,服务端应该把资源按照这些形式返回。
Content-Type请求头表示请求传递到服务器的信息内容格式。
Content-Type响应头表示服务器返回给客户端的信息内容格式。

3、State Transfer

State Transfer:状态转移,访问一个网站,一种资源,就代表了客户端与服务器的一个交互过程,势必涉及到数据和状态的变化。

互联网通信协议HTTP协议是一个无状态协议,这意味着所有状态都保存在服务端,如果客户端想要操作服务器,就必须使用某种手段,让服务器端发生状态转换。改变服务器资源的状态。

比如:

http://www.xxxx.com/users 代表xxxx网站上的用户资源。
新增用户:用户从无到有的一个资源状态转化。
修改用户:用户从一种状态变成另外一个状态的资源状态转化。
删除用户:用户从有到无的一个资源状态转化。

Jersey概述:

jersey是jax-rs(java api for restful webService)规范的完整实现者,比起jax-ws规范要简单,明了,易用。

Jersey RESTful 框架是开源的RESTful框架,实现了JAX-RS(JSR 311 & JSP 339)规范。它扩展了JAX-RS参考实现,提供了更多的特性和工具,可以进一步的简化RESTful service和Client开发。

  • 轻量级,快速开发
  • 优秀的文档和案例
  • 与Spring较好的集成
  • 可以集成到其他库/框架

jersey官方:https://jersey.java.net/

Jersey注解:

1、Http Methods:HTTP方法映射到资源的CRUD(创建、读取、更新和删除)操作,基本模式如下:

  • **@GET:**读取、列出、检索单个或资源集合。该注解标记的方法表明用于处理Get请求,Get方法是幂等且安全的。
  • @POST:新建资源。该注解标记的方法表明处理POST请求,POST方法表明是一种创建操作的方法,POST方法是一种写操作的HTTP请求,RPC中的写操作均是使用post方法,而在REST中我们只是使用POST方法来添加资源。
  • **@PUT:**更新现有资源或资源集合。
  • **@DELETE:**删除资源或资源集合。该注解标记的方法表明这个方法执行的是一个删除资源的操作,其返回值可以是void,即没有返回值。

2、@Path

  • 注解可以标记在类名上,也可以标记在方法名上。该注解接收一个value参数,表示定义资源的地址。另外,资源地址相同,但是HTTP方法不同的两个方法是完全两个不同的REST接口,HTTP方法和资源地址相结合在一起才可以完成对一个资源的定位。

  • 两个作用:

    • 标注class:表明该类是个资源类。凡是资源类,必须使用@Path注解,不然jersey无法扫描到该资源类。
    • 标注method,表示具体的请求资源的路径

3、@Produces:

  • @Produces注释用来指定将要返回给客户端的数据标识类型(MIME)。@Produces可以作为class(类)注释,也可以作为方法注释,方法的@Produces注释将会覆盖class(类)的注释。@Produces定义了服务器端生产的媒体类型,即服务器端产生的响应实体的媒体类型,同样也可以是xml、json等媒体类型。

    • 返回给client字符串类型(text/plain)

      • @Produces(MediaType.TEXT_PLAIN)
    • 返回给客户端为json类型(application/json)

      • @Produces(MediaType.APPLICATION_JSON)
    • 指定多个MIME类型

      • @Produces({“application/json”,“application/xml”})

4、 @Consumes

  • @Consumes与@Produces相反,用来指定可以接受客户端发送过来的MIME类型,同样可以用于class或者method,也可以指定多个MIME类型,一般用于@PUT,@POST。在服务器端,@Consumes定义了服务器端要消费的媒体类型,也就是说消费客户端请求实体的媒体类型,可以是xml、json等类型。

    • 接受client参数为字符串类型

      • @Consumes(MediaType.TEXT_PLAIN)
    • 接受client参数为json类型

      • @Consumes(MediaType.APPLICATION_JSON)

5、@QueryParam

  • 该注解表明是一个查询条件,查询条件决定了方法的作用域,查询参数组成了查询条件。Jersey中使用@QueryParam注解来定义查询参数。另外注解@QueryParam还可以和注解@DefaultVaule一起使用,注解@DefaultValue的作用则是预置一个默认值,当请求中不包括该参数时候使用这个默认值。
  • 请求地址: localhost:8080/introduction?booId=1?gg=2?version=3?platform=4?vps=5

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AzDTaOFO-1612945398028)(C:\Users\lenovo\AppData\Local\YNote\data\qqC55C2CC4FD2FE5C6968E7C371694AC22\c6878a60d0db451fa2e5a8f99e0b9d96\clipboard.png)]

6、@PathParam

  • 该注解定义路径的参数信息,每一个参数都对应一个子资源。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vZa7hkLl-1612945398031)(C:\Users\lenovo\AppData\Local\YNote\data\qqC55C2CC4FD2FE5C6968E7C371694AC22\1c77021c8f3f4e2aa8e4f1b4029faa60\clipboard.png)]

7、@Context

  • 该注解用来解析上下文参数。(@Context HttpRequest request)。通过@Context可以获得以下信息:UriInfo、ServletConfig、ServletContext、HttpServletRequest、HttpServletResponse和HttpHeaders等。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1YrryELH-1612945398034)(C:\Users\lenovo\AppData\Local\YNote\data\qqC55C2CC4FD2FE5C6968E7C371694AC22\3ed668197fa248cd96e478bed29ac1ef\clipboard.png)]

8、@FormParam

  • 获取post请求中表单中的数据。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L11nyCiS-1612945398037)(C:\Users\lenovo\AppData\Local\YNote\data\qqC55C2CC4FD2FE5C6968E7C371694AC22\3dcb37d9e3d144b197f482f22190121b\clipboard.png)]

9、@BeanParam

  • 获取请求参数中的数据,用实体Bean进行封装。如果传递的参数较多,可以自己写个bean,bean中的字段使用@PathParam、@QueryParam、@FormParam、@FormDataParam、@MatrixParam、@HeaderParam、@CookieParam来注解。而在resouces中具体方法参数中就可以使用@BeanParam来注解这个自定义的bean。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ycM8dyw-1612945398038)(C:\Users\lenovo\AppData\Local\YNote\data\qqC55C2CC4FD2FE5C6968E7C371694AC22\64d2ce783d1e4b4d9e0bf213e47a163e\clipboard.png)]

10、****@Encoded

  • 禁止解码,客户端发送的参数是什么样,服务器接收到的参数就是什么样

11、****@Singleton

  • 表示单例模式。默认情况下,资源类的生命周期是per-request,也就是系统会为每个匹配资源类URI的请求创建一个实例,这样的效率很低,可以对资源类使用@Singleton注解,这样在应用范围内,只会创建资源类的一个实例。

12、****@PerSession

  • 每一个 session 请求, 就产生一个 rest 资源实例 , 直到这个 session 消毁,这个 rest 资源才会消失 。session, 使用 @PerSession注解。

13、 application/json 和 application/x-www-form-urlencoded的区别

  • application/x-www-form-urlencoded:Jquery的Ajax请求默认方式,这种方式的好处就是浏览器都支持,在请求发送过程中会对数据进行序列化处理,以键值对形式?key1=value1&key2=value2,然后把这个字串append到url后面,用?分割,加载这个新的url方式发送到服务器。如果用Jquery,它内部已经进行了处理,如果自己写原生的Ajax请求,就需要自己对数据进行序列化。
  • application/json:application/json作为请求content-type,告诉服务器请求的主题内容是json格式的字符串,服务器端会对json字
    符串进行解析,这种方式的好处就是前端人员不需要关心数据结构的复杂度,只要是标准的json格式就能提交成功。

14、Jersey与SpringMVC框架的区别

  • Jersey框架出发点RestFul风格的框架,体现点在接口的设计方面。我们经常使用的SpringMVC返回复杂结构需要使用ModelAndView。
  • jersey提供一种子资源的概念,这也是RESTFull中提倡所有url都是资源;
  • MVC提供Session等状态的管理,Jersey没有,这个来源于RESFFull设计的无状态化。

15、创建Maven web项目

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a131o9Mt-1612945398039)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210209115805611.png)]

16、搭建Jersey框架

  • ​ 引入Jersey的必要的几个jar包

    • Jersey必需的jar包

      • jackson-jaxrs-json-provider
      • jersey-container-servlet
      • jersey-hk2
        <dependencyManagement><dependencies><dependency><groupId>org.glassfish.jersey</groupId><artifactId>jersey-bom</artifactId><version>2.27</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.glassfish.jersey.containers</groupId><artifactId>jersey-container-servlet</artifactId></dependency><dependency><groupId>org.glassfish.jersey.inject</groupId><artifactId>jersey-hk2</artifactId></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><dependency><groupId>com.fasterxml.jackson.jaxrs</groupId><artifactId>jackson-jaxrs-json-provider</artifactId><version>2.9.5</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok-maven-plugin</artifactId><version>1.18.8.1</version><scope>provided</scope></dependency></dependencies>
    

17、web.xml加载Jersey的Servlet容器

  • Jersey1.X使用的是Sun公司的

    • com.sun.jersey.spi.Container.servlet.ServletContainer
  • Jersey2.X使用的是glassfish的

    • org.glassfish.jersey.servlet.ServletContainer

18、扫描Jersey resource

  • jersey1.X使用的是sun的

    • com.sun.jersey.config.property.packages
  • jersey2.X使用的是
    • glassfish的jersey.config.server.provider.packages

19、Jersey使用web.xml加载Application。简单理解为就是我们SpringMVC中的前端控制器

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><servlet><servlet-name>Jersey Web Application</servlet-name><servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class><!-- 配置自己的资源加载类去加载资源 --><init-param><param-name>jersey.config.server.provider.packages</param-name><param-value>com.itcast.rest</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>Jersey Web Application</servlet-name><url-pattern>/api/*</url-pattern></servlet-mapping>
</web-app>

20、代码练习

@Path("User")
@Produces(MediaType.APPLICATION_JSON)
public class JerseyDemo01 {Map<String, Map> map = new HashMap<>(10);HashMap<String, String> key = new HashMap<>(10);//    public String PostJson(@FormParam("username") String username,@FormParam("password")String password){@POST@Consumes(MediaType.APPLICATION_FORM_URLENCODED)@Path("/PostJson")public String PostJson(@BeanParam User user) {System.out.println("POST已执行");String s = Optional.ofNullable(user.getUsername()).orElseThrow(() -> new RuntimeException("参数为空"));String s1 = Optional.ofNullable(user.getPassword()).orElseThrow(() -> new RuntimeException("参数为空"));System.out.println(s + ":" + s1);this.key.put("username", user.getUsername());this.key.put("password", user.getPassword());this.map.put("param", key);String json = JSON.toJSONString(map);return json;}@GET@Consumes(MediaType.APPLICATION_JSON)@Path("/ObjJson")public String ObjJson() {this.key.put("01", "张三");this.key.put("02", "李四");this.key.put("03", "王五");this.key.put("04", "马六");this.map.put("param", key);String json = JSON.toJSONString(map);return json;}@GET@Consumes(MediaType.APPLICATION_JSON)@Path("/test/{id}")public String Test(@PathParam(id) String id){this.key.put("id", id);this.map.put("param", key);String json = JSON.toJSONString(map);return json;}

Jersey框架入门学习相关推荐

  1. SSM框架入门学习记录

    SSM框架入门学习记录 //项目结构 在这里插入图片描述 在这里插入图片描述 包名多种多样,命名习惯问题. 流程:Controller(接受请求)-->Service(biz)(bl)(写业务函 ...

  2. keras框架入门学习(一)——argparse传参模块调用

    keras框架入门学习(一)--argparse传参模块调用 一.argparse模块简介 1.1 argparse的定义 1.2 argparse的优势 二.argparse模块使用 2.1 实现[ ...

  3. EasyUI框架入门学习

    为什么80%的码农都做不了架构师?>>>    前言 新项目的开发前端技术打算采用EasyUI框架(基于EasyUI较为丰富的UI组件库),项目组长将前端EasyUI这块的任务分配给 ...

  4. 1、MyBatis框架入门学习CRUD

    文章目录 框架前言 名词辨析 JavaWeb阶段回顾 框架介绍 ORM框架 MyBatis简介 MyBatis入门案例 1.环境准备 2.新建普通Maven项目,导入依赖 3.MyBatis核心配置文 ...

  5. 基于ASP.NET MVC的ABP框架入门学习教程

    为什么使用ABP 我们近几年陆续开发了一些Web应用和桌面应用,需求或简单或复杂,实现或优雅或丑陋.一个基本的事实是:我们只是积累了一些经验或提高了对,NET的熟悉程度. 随着软件开发经验的不断增加, ...

  6. 国内优秀开源框架Guns框架入门学习

    Guns下载路径:https://gitee.com/naan1993/guns 一.Guns简介 Guns是国内一个非常优秀的开源框架,功能就是快速搭建后台应用系统,Guns基于SpringBoot ...

  7. java actor akka_Java akka框架入门学习

    [日期:2020.04.20-2020.04.22] 看完下面的入门介绍之后,再看如下链接(对akka框架整体介绍)https://github.com/guobinhit/akka-guide​gi ...

  8. MAUI 框架入门学习01

    1 学习环境安装 Visual Studio 2022 Preview 版本 1.1 目前vs2022正式版本还不支持,需要安装vs2022最新预览版 下载 2022 Community 预览版 下载 ...

  9. freemark模板框架+quartz定时框架入门学习(面向百度编程)

    需求,定时查询表数据,生成表格,发送给员工, 相关技术 : quartz freemark Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2 ...

  10. RPC框架入门 学习梁飞的RPC

    用到了动态代理,反射机制,网络编程BIO,简洁精妙. 一.现有一个功能接口 package rpc梁飞简单demo;/*** Created by Administrator on 2018/6/24 ...

最新文章

  1. SpringDataJpa根据多个id物品清单id查询房源编号
  2. 永久代内存java_Java8内存模型—永久代(PermGen)和元空间(Metaspace)
  3. Jinja2 模板用法
  4. PowerBI随笔(5)-关系模型与报表-2
  5. 程序编译时书写Makefile注意事项一例
  6. 你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)
  7. 无法在WEB服务器上启动调试,Web 服务器配置不正确 解决
  8. [高光谱] Hyperspectral-Classification Pytorch 数据集的读取、划分、加载
  9. 初学knockoutjs记录5——Computed observables依赖监控(2 Writable computed observables可写计算监控属性)...
  10. 单商户商城系统功能拆解12—商品管理
  11. Mathtype在word中编辑公式时变成英文
  12. 月入1W+的自媒体达人都会用到的运营工具
  13. 深圳房价三连跌,国内的房地产价格或将持续下跌,该持现金过冬了
  14. 年龄血压对照表,每人都应该存一份!
  15. 如何在微信公众号图文中添加附件
  16. 2023java面试看完这篇笔记薪资和offer稳了!
  17. 高通骁龙600系列处理器
  18. 在IDEA中解决jar包冲突的神操作-必看
  19. 【炼丹】炼丹之如何打标(未完成。。。)
  20. 「从 Windows 到 macOS」快速理顺两大系统之间的差异

热门文章

  1. cad工具箱详细讲解_好用的cad工具箱 易桥CAD工具箱使用教程(附下载)
  2. 一文读懂蓝牙低功耗BLE的应用市场
  3. vs中怎么去链接一个库文件(ws2_32.lib)
  4. windows自带录屏_电脑版免费的录屏软件有哪些?
  5. 智能优化算法——蝙蝠算法(PythonMatlab实现)
  6. eclipse中文版官方下载
  7. YOLOv5的详细使用教程,以及使用yolov5训练自己的数据集
  8. 基于51单片机的双机通信系统设计protues仿真
  9. 土壤HWSD处理流程
  10. 宾虹中学计算机课,【微宾中·从这里·再出发】宾虹中学2018届毕业典礼