前言阅读开源框架的源代码,你会经常遇到Jersey。JavaEE6引入了一项新技术:JAX-RS(JavaAPIforRESTfulWebServices),属于JSR311规范。本规范旨在定义一个统一的规范(主要是@Get、@Post等注解)。目标是让Java程序员使用一套固定的接口来开发REST应用程序,避免对特定的第三方框架技术的强烈依赖。这与JPA的宗旨是一致的。您可能不熟悉JAX-RS,但您听说过它的参考实现Jersey,以及其他实现,例如著名的ApacheCXF、Axis和JBooss的RESTEasy。在JAX-RC“诞生”的时候,官方对它进行了隆重的介绍。擅长英文阅读的同学可以在这里阅读官方介绍:https://docs.oracle.com/javaee/6/tutorial/doc/giepu.html本文将带你走进JSR311规范,演示构建通过Jersey实现REST服务,看看Eureka是如何使用Jersey的。另外,为什么“竞品”SpringMVC成为实际标准,不兼容JSR311也太胆大了。所属专栏【方向盘】-JavaEE相关下载【本专栏源码】:https://github.com/yourbatman/FXP-java-ee【技术专栏源码大本营】:https://github.com/yourbatman/tech-column-learning【女娲刀-Initializr项目】访问地址:http://152.136.106.14:8761【程序员网盘】公益上线,注册送1G超小容量,助你一臂之力减法练习:https://wangpan.yourbatman.cn【Java开发包(Mac)】:https://wangpan.yourbatman.cn/s/rEH0提取码:javakit版本协议JavaEE:6,7,8JakartaEE:8,9.9.1正文JAX-RSJAX-RS的全称是:JavaAPIforRESTfulServices。它是一个社区驱动的标准,用于在Java中构建RESTfulWeb服务。它不仅定义了一套用于构建RESTfulWeb服务的API,还通过增强客户端API的功能简化了构建REST客户端的过程。Voiceover:它调节Server服务器和Client客户端。Jersey的Server是基于Servlet构建的Web应用程序,因此需要部署在任何Servlet容器中运行。由于是一套标准规范,JAX-RS实现框架可以任意切换,无需改动任何代码。JAX-RS通用注解@Path:注解在类/方法上。类似于@RequestMapping中的path路径@GET、@PUT、@POST、@DELETE等:标记在方法上。你明白其中的意思。相当于这个注解@HttpMethod("GET/POST")@Produces:标注在类/方法上。可以返回的MIME类型@Consumes:标记在类/方法上。可接受的MIME类型@PathParam、@QueryParam、@HeaderParam、@CookieParam、@MatrixParam、@FormParam:分别获取不同位置的参数(@MatrixParam获取数组/集合类型的值)@DefaultValue:默认值@ApplicationPath:注解开启类,它代表了这个应用程序的路径。对于所有的@Path前缀,一个应用程序只需要有一个@BeanParam:标记在方法、方法参数和属性上,从2.0版本开始。效果类似于@RequestBodyRestful,JAX-RS,Jersey异同Restful:一种web应用的设计风格,基于http,适用于业务接口场景。它提倡约定优于配置。统一的规范,在界面设计上可以保证理解的一致性,对构建大型项目非常友好。JAX-RS:是JavaEE的一致规范,实现了Restful风格。它通过Path唯一标识网络上的资源。值得注意的是:它只提供标准,并没有提供自己的实现Jersey:aframework,JAX-RS的官方参考实现。类似于SpringMVC,实现了MVC的设计思想。SpringMVC对比Jersey。首先,SpringMVC是一个完整的web层框架。除了提供JSON/XMLRestful处理能力外,它还包括对HTML和其他模板(引擎)的支持。支持。并且Jersey只支持REST说明:SpringMVC最初只支持Html等格式的处理,直到2010年2月Spring3.0发布,此后一直是最好的,离其他框架越来越远。其次,SpringMVC是Spring家族的亲儿子,自然而然地与Spring容器融为一体。所以从集成方便的角度来说,Jersey自然不如SpringMVC。当然,你的应用可能不是基于Spring构建的,所以实现了JavaEE/JAX-RS规范的Jersey可能更具有可移植性,这也是像Eureka这样的开源框架选择Jersey的原因。最后,SpringMVC和Jersey构建基于Servlet的Web应用程序(Spring5之后,Reactor是可选的)。SpringMVC的核心类是DispatcherServlet;Jersey的核心类是ServletContainer注:Jersey和Spring框架集成的核心类是SpringServlet2.1.6该版本命名空间同javax-->javax.ws.rsjavax.ws.rs-api2.1.1jakarta.ws.rsjakarta.ws.rs-api3.0.0版本历史2.0新特性:新增@BeanParam注解,可以自动将参数封装成POJO(类似于@RequestBody注解);新增ClientAPI,规范客户端开发;新增Filters和interceptors分离关注点,更好的实现代码重复使用;引入异步处理(在客户端返回Future对象);引入BeanValidation支持;2.1版本新特性:客户端新增JSON-P和JSON-B绑定实现说明:Jersey自2.26版本开始适配JAX-RS2.1新特性,生存状态JAX-RS属于JavaEE规范,但实际规范已易手:SpringMVC。在国内几乎见不到,但在海外鼓吹JavaEE的国家还是有一些忠实的粉丝。总的来说:不乐观,不容忽视。实现(框架)Jersey:官方参考实现(推荐)ApacheCXF:开源Web服务框架RESTEasy:JBoss提供的实现Restlet:最早的REST框架,出现在JAX-RS之前ApacheWink:一个简单易用且稳定的Java框架。包含服务端模块和客户端模块代码示例使用官方参考实现Jersey构建服务端Web程序。添加Maven依赖:-->jakarta.ws.rs-->-->2.1.6-->-->!--jakarta.ws.rs-->org.glassfish.jersey.corejersey-serverorg.glassfish.jersey.containersjersey-container-servletorg.glassfish.jersey.injectjersey-hk2javax.servletprovided使用ResourceConfig编写配置类来管理资源(这是方法之一,也可以通过注册包扫描等资源):/***相当于一个资源管理器,启动这个管理器会启用资源**@authorYourBatman.Sendemailtome*@sitehttps://你的蝙蝠侠。cn*@date2021/10/2417:22*@since0.0.1*/publicclassMyResourceConfigextendsResourceConfig{//构造阶段,暴露资源publicMyResourceConfig(){register(HelloResource.class);}}写一个资源(类似Controller):/***在这里添加备注**@authorYourBatman.Sendemailtome*@sitehttps://yourbatman.cn*@date2021/10/2417:24*@since0.0.1*/@Path("/hello")publicclassHelloResource{@Path("/demo")@GET@Produces(MediaType.TEXT_PLAIN)publicStringdemo(){return"hellojax-rs...";}}写描述web.xml:JerseyServletorg.glassfish.jersey.servlet.ServletContainerjavax.ws.rs.Applicationorg.glassfish.jersey。server.ResourceConfig1JerseyServlet/yourbatman/*使用外部Tomcat部署这个war包:启动Tomcat,浏览器可以正常访问http://localhost:9090/yourbatman/hello/demo,如下图:完美!Tips:如果访问时出现如下异常,请在pom中额外导入org.glassfish.jersey.inject:jersey-hk2jar,解决客户端通过浏览器访问资源HelloResource的问题。其实JAX-RS也提供了javax.ws.rs.client.Client客户端规范,Jersey-Client也有实现。这里也做一个简单的演示:ImportClientdependencies:-->org.glassfish.jersey.core-->-->-->使用Jersey发送Http请求:/***JerseyClient,发送Http请求**@authorYourBatman.Sendemailtome*@sitehttps://yourbatman.cn*@date2021/10/2417:41*@since0.0.1*/publicclassJerseyClient{publicstaticvoidmain(String[]args){//====创建Client实例===Clientclient=ClientBuilder.newClient();WebTargetbaseTarget=client.target("http://localhost:9090/yourbatman");//具体请求WebTargethelloTarget=baseTarget.path("/hello/demo").queryParam("age","18");//发送get请求(可以指定可接受的header)Responseresponse=helloTarget.request("*").get();//Responseresponse=helloTarget.request("text/plain","text/html","text/plain").get();//打印Resultintstatus=response.getStatus();Stringresult=response.readEntity(String.class);System.out.println("响应状态码为:"+status+",响应值为:"+result);}}运行main方法,控制台输出:响应状态码为:200,响应值为:hellojax-rs...完美描述:JerseyClient底层使用JDK的HttpURLConnection发送Http请求,可以换成其他通过其SPI机制连接JAX-RS规范,并在代码中演示使用其官方推荐的Jersey实现。在SpringMVC大行其道的今天,由于JavaEE技术仍有大量的受众(尤其是国外的开源软件),这部分知识还是不可或缺的。我们中国人几乎100%都是Spring技术栈的受众,所以如果要选的话,当然推荐Spring,毕竟找工作容易多了。所以JAX-RS是官方标准,Spring是事实标准。本文转载自微信公众号《Java方向盘》