自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

【方向盤】版本歷史&代碼示例之:JAX-RS

開發(fā) 前端
本文詳細(xì)介紹了JAX-RS規(guī)范,并代碼演示了其官方推薦實(shí)現(xiàn)Jersey的使用。在Spring MVC大行其道的今天,由于Java EE技術(shù)仍有不少受眾群體(特別是國(guó)外開源軟件),所以此部分知識(shí)點(diǎn)依舊不可或缺。

前言

讀開源框架源碼,你會(huì)經(jīng)常遇到Jersey。

Java EE 6引入了一項(xiàng)新技術(shù):JAX-RS(Java API for RESTful Web Services),隸屬于JSR 311規(guī)范。該規(guī)范旨在定義一個(gè)統(tǒng)一的規(guī)范(主要是@Get、@Post這些注解),目標(biāo)是讓Java 程序員可以使用一套固定的接口來(lái)開發(fā)REST應(yīng)用,避免強(qiáng)依賴于具體的第三方框架技術(shù),這一點(diǎn)和JPA的目的保持一致。

[[430747]]

可能你對(duì)JAX-RS感到陌生,但對(duì)它的參考實(shí)現(xiàn)Jersey,和其它實(shí)現(xiàn)如著名的Apache CXF、Axis以及JBooss的RESTEasy等等多少有些耳聞。在JAX-RC“出生”之際官方對(duì)其有過隆重介紹,擅長(zhǎng)英文閱讀的同學(xué)這里看官方介紹:https://docs.oracle.com/javaee/6/tutorial/doc/giepu.html

本文將帶你走進(jìn)JSR 311規(guī)范,演示通過Jersey構(gòu)建REST服務(wù),看看Eureka是如何使用Jersey的。另外,“競(jìng)品”Spring MVC它為何成為了實(shí)際標(biāo)準(zhǔn)且還不去兼容JSR 311,膽子忒太了。

所屬專欄

  • 【方向盤】-Java EE

相關(guān)下載

  • 【本專欄源代碼】:https://github.com/yourbatman/FXP-java-ee
  • 【技術(shù)專欄源代碼大本營(yíng)】:https://github.com/yourbatman/tech-column-learning
  • 【女媧Knife-Initializr工程】訪問地址:http://152.136.106.14:8761
  • 【程序員專用網(wǎng)盤】公益上線啦,注冊(cè)送1G超小容量,幫你實(shí)踐做減法:https://wangpan.yourbatman.cn
  • 【Java開發(fā)軟件包(Mac)】:https://wangpan.yourbatman.cn/s/rEH0 提取碼:javakit

版本約定

  • Java EE:6、7、8
  • Jakarta EE:8、9、9.1

正文

JAX-RS

JAX-RS全稱是:Java API for RESTful Services。它是一個(gè)社區(qū)驅(qū)動(dòng)的標(biāo)準(zhǔn),用于使用 Java 構(gòu)建 RESTful Web 服務(wù)。它不僅定義了一套用于構(gòu)建 RESTful 網(wǎng)絡(luò)服務(wù)的 API,同時(shí)也通過增強(qiáng)客戶端 API 功能簡(jiǎn)化了REST 客戶端的構(gòu)建過程。

話外音:既規(guī)范了Server服務(wù)端也規(guī)范了Client客戶端

Jersey的Server是基于Servlet構(gòu)建的web應(yīng)用,所以需要部署到任何實(shí)現(xiàn)Servlet容器里運(yùn)行。由于它是一套標(biāo)準(zhǔn)規(guī)范,因此可以在不改任何代碼的情況下,任意切換JAX-RS實(shí)現(xiàn)框架。

JAX-RS常用注解

  • @Path:標(biāo)注在類/方法上。類似于@RequestMapping中的path路徑
  • @GET,@PUT,@POST,@DELETE等:標(biāo)注在方法上。含義你懂的。等同于這個(gè)注解@HttpMethod("GET/POST")@Produces:標(biāo)注在類/方法上。可以返回的MIME類型
  • @Consumes:標(biāo)注在類/方法上??梢越邮艿?MIME 類型
  • @PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam:分別獲取不同位置上的參數(shù)(@MatrixParam獲取數(shù)組/集合類型的value)
  • @DefaultValue:默認(rèn)值
  • @ApplicationPath:標(biāo)注在類上,表示本應(yīng)用路徑。所有@Path的前綴,一個(gè)應(yīng)用只需有一個(gè)
  • @BeanParam:標(biāo)注在方法、方法參數(shù)、屬性上,since 2.0版本。效果類似于@RequestBody

Restful、JAX-RS、Jersey異同點(diǎn)

  • Restful:一種網(wǎng)絡(luò)應(yīng)用程序的設(shè)計(jì)風(fēng)格,基于http,適用于業(yè)務(wù)接口場(chǎng)景。它崇尚約定大于配置,有了統(tǒng)一的規(guī)范,在接口設(shè)計(jì)時(shí)能夠保證理解的一致性,所以對(duì)構(gòu)建大型項(xiàng)目很友好
  • JAX-RS:它是Java EE的一向規(guī)范,實(shí)現(xiàn)了Restful風(fēng)格。它通過Path將網(wǎng)絡(luò)上的資源唯一的標(biāo)識(shí)出來(lái)。值得注意的是:它只提供標(biāo)準(zhǔn),自己并沒提供實(shí)現(xiàn)
  • Jersey:一個(gè)框架,JAX-RS的官方參考實(shí)現(xiàn)。類似于Spring MVC一樣實(shí)現(xiàn)了MVC設(shè)計(jì)思想

Spring MVC對(duì)比Jersey

首先,Spring MVC是一個(gè)完整的 Web層框架,它除了提供JSON/XML的Restful處理能力之外,還包括對(duì)HTML以及其它模板(引擎)的支持。而Jersey只支持REST

說明:Spring MVC最初只支持處理Html等格式,直到2010年2月重磅發(fā)布了Spring 3.0版本,從此一騎絕塵,將其它框架越甩越遠(yuǎn)

其次,Spring MVC是Spring家族的親兒子,和Spring容器天然集成。所以從集成的方便度來(lái)看,Jersey自然比不上Spring MVC。當(dāng)然,你的應(yīng)用可能并非構(gòu)建在Spring之上,那么實(shí)現(xiàn)了Java EE/JAX-RS規(guī)范的Jersey的移植性可能更好,這也是為什么像Eureka這種開源框架選擇Jersey的原因

最后,Spring MVC和Jersey都是基于Servlet構(gòu)建Web應(yīng)用的(Spring 5后可選基于Reactor)。Spring MVC核心類為DispatcherServlet;Jersey核心類為ServletContainer

說明:Jersey和Spring框架整合的核心類為SpringServlet

  1. <!-- javax命名空間版本(Tomcat 9.x及以下版本支持) --> 
  2. <dependency> 
  3.     <groupId>javax.ws.rs</groupId> 
  4.     <artifactId>javax.ws.rs-api</artifactId> 
  5.     <version>2.1.1</version> 
  6. </dependency> 
  7.  
  8. <!-- jakarta命名空間版本(Tomcat 10.x及以上版本支持) --> 
  9. <dependency> 
  10.     <groupId>jakarta.ws.rs</groupId> 
  11.     <artifactId>jakarta.ws.rs-api</artifactId> 
  12.     <version>3.0.0</version> <!-- Jakarta命名空間 --> 
  13.     <!-- <version>2.1.6</version> 此版本命名空間同javax --> 
  14. </dependency> 

版本歷程

  • 2.0版本新特性:新增@BeanParam注解,可以將參數(shù)自動(dòng)封裝進(jìn)POJO(類似于@RequestBody注解);新增Client API來(lái)規(guī)范化客戶端的開發(fā)方式;增加了Filters和interceptors來(lái)分離關(guān)注點(diǎn),更好的實(shí)現(xiàn)代碼復(fù)用;引入異步處理(在客戶端返回Future對(duì)象);引入Bean Validation支持;
  • 2.1版本新特性:對(duì)客戶端增加JSON-P和JSON-B的綁定實(shí)現(xiàn)

說明:Jersey從2.26版本起就適配JAX-RS 2.1新特性啦

生存現(xiàn)狀

JAX-RS隸屬于Java EE規(guī)范,但實(shí)際的規(guī)范已然易主:Spring MVC。它在國(guó)內(nèi)幾乎不可見,但在海外崇尚Java EE的國(guó)度尚有一定忠誠(chéng)粉絲。

總的來(lái)講:不容樂觀,不可忽視。

實(shí)現(xiàn)(框架)

  • Jersey:官方參考實(shí)現(xiàn)(推薦)
  • Apache CXF:開源的Web服務(wù)框架
  • RESTEasy:JBoss提供的實(shí)現(xiàn)
  • Restlet:最早的REST框架,先于JAX-RS出現(xiàn)
  • Apache Wink:一個(gè)是使用簡(jiǎn)單,穩(wěn)定的Java框架。包含服務(wù)器端模塊和客戶端模塊

代碼示例

使用官方參考實(shí)現(xiàn)Jersey來(lái)構(gòu)建Server端Web程序。

加入Maven依賴:

  1. <dependencies> 
  2.     <!-- API規(guī)范 --> 
  3.     <!--<dependency>--> 
  4.     <!--    <groupId>jakarta.ws.rs</groupId>--> 
  5.     <!--    <artifactId>jakarta.ws.rs-api</artifactId>--> 
  6.     <!--    <version>2.1.6</version>--> 
  7.     <!--</dependency>--> 
  8.  
  9.     <dependency> 
  10.         <groupId>org.glassfish.jersey.core</groupId> 
  11.         <artifactId>jersey-server</artifactId> 
  12.     </dependency> 
  13.     <!-- 使用Servelt容器啟動(dòng),就得導(dǎo)入它 --> 
  14.     <dependency> 
  15.         <groupId>org.glassfish.jersey.containers</groupId> 
  16.         <artifactId>jersey-container-servlet</artifactId> 
  17.     </dependency> 
  18.     <!-- 若遇上java.lang.IllegalStateException: InjectionManagerFactory not found.異常,導(dǎo)入此包 --> 
  19.     <dependency> 
  20.         <groupId>org.glassfish.jersey.inject</groupId> 
  21.         <artifactId>jersey-hk2</artifactId> 
  22.     </dependency> 
  23.     <dependency> 
  24.         <groupId>javax.servlet</groupId> 
  25.         <artifactId>javax.servlet-api</artifactId> 
  26.         <scope>provided</scope> 
  27.     </dependency> 
  28. </dependencies> 

借助ResourceConfig書寫配置類來(lái)管理資源(這是方式之一,還可通過包掃描等方式注冊(cè)資源):

  1. /** 
  2.  * 相當(dāng)于資源管理器,啟動(dòng)此管理器就啟用了資源 
  3.  * 
  4.  * @author YourBatman. <a href=mailto:yourbatman@aliyun.com>Send email to me</a> 
  5.  * @site https://yourbatman.cn 
  6.  * @date 2021/10/24 17:22 
  7.  * @since 0.0.1 
  8.  */ 
  9. public class MyResourceConfig extends ResourceConfig { 
  10.  
  11.     // 在構(gòu)造階段,暴露資源 
  12.     public MyResourceConfig() { 
  13.         register(HelloResource.class); 
  14.     } 

書寫一個(gè)資源(類似于Controller):

  1. /** 
  2.  * 在此處添加備注信息 
  3.  * 
  4.  * @author YourBatman. <a href=mailto:yourbatman@aliyun.com>Send email to me</a> 
  5.  * @site https://yourbatman.cn 
  6.  * @date 2021/10/24 17:24 
  7.  * @since 0.0.1 
  8.  */ 
  9. @Path("/hello"
  10. public class HelloResource { 
  11.  
  12.     @Path("/demo"
  13.     @GET 
  14.     @Produces(MediaType.TEXT_PLAIN) 
  15.     public String demo() { 
  16.         return "hello jax-rs..."
  17.     } 

書寫描述符web.xml:

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4.          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" 
  5.          version="4.0"
  6.  
  7.     <!-- Jersey調(diào)度入口 --> 
  8.     <servlet> 
  9.         <servlet-name>JerseyServlet</servlet-name
  10.         <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
  11.         <!-- 啟動(dòng)Resource資源配置 --> 
  12.         <init-param> 
  13.             <param-name>javax.ws.rs.Application</param-name
  14.             <param-value>org.glassfish.jersey.server.ResourceConfig</param-value> 
  15.         </init-param> 
  16.         <!-- 通過掃包方式掃描Resource資源 --> 
  17.         <!--<init-param>--> 
  18.         <!--    <param-name>jersey.config.server.provider.packages</param-name>--> 
  19.         <!--    <param-value>cn.yourbatman.coding.jaxrs</param-value>--> 
  20.         <!--</init-param>--> 
  21.  
  22.         <load-on-startup>1</load-on-startup> 
  23.     </servlet> 
  24.     <servlet-mapping> 
  25.         <servlet-name>JerseyServlet</servlet-name
  26.         <url-pattern>/yourbatman/*</url-pattern> 
  27.     </servlet-mapping> 
  28.  
  29. </web-app> 

使用外置Tomcat,部署此war包:

啟動(dòng)Tomcat,瀏覽器就可正常訪問http://localhost:9090/yourbatman/hello/demo了,如下圖:

完美!

Tips:若訪問時(shí)出現(xiàn)如下異常,請(qǐng)?jiān)趐om里額外導(dǎo)入org.glassfish.jersey.inject:jersey-hk2這個(gè)jar即可解決。

上面是通過瀏覽器作為客戶端訪問HelloResource這個(gè)資源。其實(shí),JAX-RS還提供了javax.ws.rs.client.Client客戶端規(guī)范,并且Jersey-Client也給予了實(shí)現(xiàn)。這里也簡(jiǎn)單演示下:

導(dǎo)入Client依賴:

  1. <!-- Client無(wú)需單獨(dú)打包,因?yàn)閖ersey-server里已有。只有單獨(dú)使用Jersey Client時(shí)才需導(dǎo)入 --> 
  2. <!--<dependency>--> 
  3. <!--    <groupId>org.glassfish.jersey.core</groupId>--> 
  4. <!--    <artifactId>jersey-client</artifactId>--> 
  5. <!--</dependency>--> 

使用Jersey發(fā)送Http請(qǐng)求:

  1. /** 
  2.  * Jersey Client,發(fā)送Http請(qǐng)求 
  3.  * 
  4.  * @author YourBatman. <a href=mailto:yourbatman@aliyun.com>Send email to me</a> 
  5.  * @site https://yourbatman.cn 
  6.  * @date 2021/10/24 17:41 
  7.  * @since 0.0.1 
  8.  */ 
  9. public class JerseyClient { 
  10.  
  11.     public static void main(String[] args) { 
  12.         // ==== 創(chuàng)建Client的實(shí)例 === 
  13.         Client client = ClientBuilder.newClient(); 
  14.         WebTarget baseTarget = client.target("http://localhost:9090/yourbatman"); 
  15.  
  16.         // 具體請(qǐng)求 
  17.         WebTarget helloTarget = baseTarget.path("/hello/demo").queryParam("age""18"); 
  18.         // 發(fā)送get請(qǐng)求(可指定可接收的accept頭) 
  19.         Response response = helloTarget.request("*").get(); 
  20.         // Response response = helloTarget.request("text/plain""text/html""text/plain").get(); 
  21.  
  22.         // 打印結(jié)果 
  23.         int status = response.getStatus(); 
  24.         String result = response.readEntity(String.class); 
  25.         System.out.println("響應(yīng)狀態(tài)碼為:" + status + ",響應(yīng)值為:" + result); 
  26.     } 

運(yùn)行main方法,控制臺(tái)輸出:

  1. 響應(yīng)狀態(tài)碼為:200,響應(yīng)值為:hello jax-rs... 

完美。

說明:Jersey Client底層使用JDK的HttpURLConnection發(fā)送Http請(qǐng)求,可通過其SPI機(jī)制替換成其它Connection

總結(jié)

本文詳細(xì)介紹了JAX-RS規(guī)范,并代碼演示了其官方推薦實(shí)現(xiàn)Jersey的使用。在Spring MVC大行其道的今天,由于Java EE技術(shù)仍有不少受眾群體(特別是國(guó)外開源軟件),所以此部分知識(shí)點(diǎn)依舊不可或缺。

國(guó)內(nèi)的我們幾乎100%都是Spring技術(shù)棧的受眾,所以如果要選擇的話,當(dāng)然推薦Spring,畢竟也好找工作得多得多嘛。所以說JAX-RS是官方標(biāo)準(zhǔn),而Spring則是事實(shí)標(biāo)準(zhǔn)。

本文轉(zhuǎn)載自微信公眾號(hào)「Java方向盤」

 

責(zé)任編輯:姜華 來(lái)源: Java方向盤
相關(guān)推薦

2021-10-11 08:51:50

JavaMailJDBCJava

2021-10-08 06:50:32

版本歷史代碼

2009-09-22 13:04:19

ibmdwREST

2021-10-19 08:23:43

JMXJava 管理擴(kuò)展

2021-09-15 18:54:22

BATutopia-JWebSocket

2009-12-23 09:50:45

JAX-RSJerseyRESTful

2009-12-22 09:57:36

Java EE 6RESTfulJAX-RS

2021-09-13 18:39:50

ServeltELJSP

2010-12-21 11:36:58

職場(chǎng)

2023-03-10 14:55:28

2021-11-01 07:55:39

Java EE開發(fā)項(xiàng)目

2018-01-15 09:32:34

無(wú)人駕駛GPU主機(jī)輔助駕駛

2021-12-20 08:15:25

SpringFeignClientSpring Clou

2022-04-11 08:34:27

IDEA代碼補(bǔ)全

2021-11-29 08:13:41

Spring Boot環(huán)境變量Spring技術(shù)

2022-01-06 09:38:13

集度自動(dòng)駕駛apollo

2021-12-02 15:19:34

自動(dòng)駕駛技術(shù)蘋果

2022-03-28 08:35:33

IDEA快捷鍵操作視窗

2022-04-06 08:35:13

IDEADebug調(diào)試Run運(yùn)行
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)