Java REST API 教學 使用 Java 開發後端 API 服務

Lin Yen-Cheng on 2018-04-05 13 min. read

相關資源

As Title,分成前後端及資料庫部分,需打通的關節分三個方面。
前端網頁(網址) <—Q1—> RESTful Web Service <—Q2—> Web 伺服器 <—Q3—> 實體資料庫
Q1:如何寫出前端網頁可使用的 RESTful Web Service?
Q2:如何將程式發佈至伺服器供前端存取?要發佈在何種伺服器上?
Q3:如何讓撰寫的 RESTful Web Service 存取實體資料庫?

相關知識

Coding Conventions,推薦撰寫方式及風格上的統一,用意在於方便閱讀及增進效能。

語法教學資源

IDE (Integrated Development Environment) 選擇

相關 Framework 學習

OpenSource 平台

系統配置

斯斯有三種,感冒用咳嗽用鼻塞流鼻水用 XDDD 那 Java 也有三種,依照需求會選用不同版本,如下:

  • SE(Standard Edition)
  • ME(MicroEdition)
  • EE(Enterprise Edition)

介紹文連結(http://www.codedata.com.tw/book/java-basic/index.php?p=ch1-2

開工前,請先下載
JDK (Java Development Kit),從翻譯來看就是開發工具組,JDK 中就包含 JRE (Java Runtime Environment),有 JRE Java 程式就可以執行了。記得設環境變數,讓電腦找到工具組!!! 不然就!!! 什麼事都不會發生 XD

因為要寫 Web 應用,所以選擇 Java EE,下面是 EE 肚子裡裝 der 東西 XDDD (請參考圖片: http://blog.arungupta.me/wp-content/uploads/2013/10/javaee7-pancake.png )

環境設置完之後就是選用 IDE 的時候惹,這篇附上 Eclipse 的相關快捷鍵,另外建議自動完成須更改一下設定,讓鍵入每一字的時候都可以出現。設定位置在 Window → Preferences → Java → Editor → Content Assist,Auto activation triggers for Java 為 IDE 遇到何種字元會自動啟動提示,請改為 .abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ(,;,就會遇到什麼字元都自動提示惹。

快捷鍵功能
Ctrl+Shift+TOpening a class
Ctrl+Shift+ROpening a Resourse
F3 or ctrl+mouse clickgo into a class
Ctrl+OQuick Outline
Ctrl+HSearch menu
Ctrl+JIncremental Find
Ctrl+Shift+/全部收合
Ctrl+*全部展開
Ctrl+Shift+F自動排版

創建一個 Java Web Appication

首先!建立 Dynamic Web Project。
選擇 Runtime Server,列表請看第 12 頁。

可勾選自動生成 Web.xml ,或是自己打 Orz 目標!利用 Jersey 這個 Framework 實做功能並發佈到湯姆貓上, 未使用自動建構工具前,需自行下載 Library 並放進 WebContent/Web-INF/lib 資料夾裡,這是 War 檔中固定的架構勿更改。

實作!新增相關 class,並按照範例寫作,可依照這篇提供的範例 (http://www.vogella.com/tutorials/REST/article.html ),做到第六章即可 XD

完成之後我們就一次打通了 Q1 及 Q2 了 ╰( ̄︶ ̄)╯

前端網頁(網址) <—Q1—> RESTful Web Service <—Q2—> Web 伺服器
A1:利用 Jersey 寫出 RESTful Web Service
A2:JBoss 可利用 Export War 檔,將檔案發佈至 Server

透過 Jersey RESTful Service 寫入資料庫

現在剩下最後一個 Q3 惹!!!!!!!!!!
Web 伺服器 <—Q3—> 實體資料庫
Q3:如何讓撰寫的 RESTful Web Service 存取實體資料庫?
A3:複習 Java 連接 MySQL 的練習,並整合進 RESTful Service 中。
按照以下飯粒:

@Path("/test")
public class TestRestPractice &#123;
   我是之前實作class test = new 我是之前實作class();

     @GET
    public String hello() &#123;
    test.我是之前實作的功能();
     return "hello >////<";
    &#125;
&#125;

為了避免一些問題,可以參考廣為流傳的設計模式,像是 Singleton Design

設計模式,提供了大家程式架構的參考

這範例中的 ArticleDao,就有用到 Singleton 的概念,就是單一個 Instance。Singleton 模式可以保證一個類別只有一個 Instance。

public enum ArticleDao &#123;
    instance;
    //利用HashMap當資料來源
    private Map<String, Article> contentProvider = new HashMap<>();

    private ArticleDao() &#123;

    Article article = new Article("1", "Learn REST");
    article.setContent("Read http://www.vogella.com/tutorials/REST/article.html");
    contentProvider.put("1", article);
    article = new Article("2", "Do something");
    article.setContent("Read complete http://www.vogella.com");
    contentProvider.put("2", article);

    &#125;

    public Map<String, Article> getModel() &#123;
        return contentProvider;
    &#125;
&#125;

其他地方則透過 ArticleDao.instance.getModel().values() 來叫用內部資料。

資料物件名詞 (取名主要用來辨識關係)

  1. POJO (pure old java object)
public class Employee &#123;
    private int id;

    public int getId() &#123;
        return id;
    &#125;
    public void setId(int id) &#123;
        this.id = id;
    &#125;
&#125;
  1. DAO (data access objects)
    主要配合資料庫
  2. PO (persistant object)
    Hibernate example: 當 POJO 被實體化(instance) 有 set 值,接著進入 session 後。
  3. DTO(data transfer object)
    POJO 永久化成 PO,PO 組合成 DTO。
  4. JavaBean
    POJO 可序列化,有一個無參數的建構子,使用 getter 和 setter 方法來訪問屬性。
  5. XML,JSON
    都是 Web 常用的傳輸格式。

現況:表中有 100 個欄位,則相對應的 PO 有 100 個屬性。
情境:界面上只需顯示 10 個欄位。
實作:Client 向服務端取值,服務端不需傳全部的 PO,此時將只有 10 個屬性及傳遞的參數組成 DTO 來傳遞結果。

Hibernate
操作物件就可以完成讀寫資料庫,是一個結合 JDBC 和物件的 Framework。

@標註

主要就是對程式碼加些@標註,給人看也給機器讀。之前看過的 @Override 就是內建的一個標註,就是要進行 parent 函數覆寫的意思,@Deprecated 被標注的方法或類型已不再推薦使用。

用在其他 Annotation 上的 Annotation

  1. @Retention 確定標註的生命周期, 用一個 Enum 的 RetentionPolicy 參數設定。
  2. @Documented 文檔化。
  3. @Target 表示標註適用的範圍,也用 Enum 的 EnumType 的參數設定。
  4. @SessionScope?
  5. @Inject
    針對資料的標註,@JsonProperty 改變 JSON 名稱
public class Name &#123;
  @JsonProperty("firstName")
  public String _first_name;
&#125;

自訂標註則需要用到 @interface,不同於 interface,這次使用的是@interface

public @interface Test &#123;

&#125;

按照上面這樣撰寫後,其他地方就可以使用 @Test 做為自定標註了。

NDI (Java Naming and Directory Interface ),看了一陣子原文介紹之後,真心覺得歪果人發明一堆奇怪的名詞的目的在於!!!讓人覺得自己很蠢,導致會覺得作者很猛 XDDD 然後留一個小難跨過的 Gap,來讓知識不普及 XDDD

JNDI

譬如當我們想搞一個後端資料連結用的服務,那顯然需要把他配置到你的 Server 上,同時也會需要一個 JNDI name ,接著這個 JNDI Name 跟 interface 就都會被註冊到 JNDI Service。

當 Client 程式在執行時,要先去找 (lookup()) 到一個後端資料連結的 interface ,如果小幸運找到在 JNDI Service 裡面,這時候 JNDI Service 會回給你一個 remote 的 reference ,取得的這個 remote reference 是一個 Object ,有了這個 Object ,你就可以用它做你想做的事情惹譬如去 得到一個後端連結(getConnection)…

所以簡單來說,雖然是你做你的我做我的,不過出一張嘴的才是算數的,反正最後給我弄出這樣那樣的 OOO 讓我可以用就好,然後打雜小弟就可以開始努力實做出各種來提供,後人也就不用了解像是帳號密碼 IP 位置或是 Driver 去哪下載惹。


喜歡這篇文章,請幫忙拍拍手喔 🤣

share