Jersey框架入门学习

要学习框架前,首先要知道什么是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;
    }
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Jersey是一个开源的Java框架,用于构建RESTful Web服务。它是JAX-RS(Java API for RESTful Web Services)规范的参考实现之一。Jersey提供了一组注解,用于简化开发者构建RESTful服务的过程。 以下是Jersey框架中常用的注解: 1. @Path:用于标识资源类或方法的路径。可以在类级别和方法级别使用。例如,@Path("/users")表示该资源类或方法的路径为"/users"。 2. @GET、@POST、@PUT、@DELETE:用于指定HTTP请求方法。这些注解可以与@Path注解一起使用,用于标识资源类或方法支持的HTTP请求方法。 3. @PathParam:用于从URL路径中提取参数值。例如,@Path("/users/{id}")和@PathParam("id")可以用于提取URL路径中的"id"参数值。 4. @QueryParam:用于从查询参数中提取参数值。例如,@GET @Path("/users")和@QueryParam("name")可以用于提取查询参数中的"name"参数值。 5. @Consumes:用于指定请求的MIME媒体类型。例如,@Consumes(MediaType.APPLICATION_JSON)表示该方法接受JSON格式的请求。 6. @Produces:用于指定响应的MIME媒体类型。例如,@Produces(MediaType.APPLICATION_JSON)表示该方法返回JSON格式的响应。 7. @RequestBody:用于将请求体中的数据绑定到方法参数。例如,@POST @Path("/users")和@RequestBody User user可以用于将请求体中的JSON数据绑定到User对象。 8. @ResponseBody:用于将方法返回值作为响应体。例如,@GET @Path("/users/{id}")和@ResponseBody User getUserById(@PathParam("id") int id)可以用于将User对象作为响应返回。 这些注解可以根据具体需求灵活组合使用,以构建符合RESTful风格的Web服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值