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
- Jersey必需的jar包
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框架入门学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络安全基础知识笔记
- 下一篇: Java学习笔记之基础应用(2015.3