Java Web API (RESTful API) 教學 打通三個關節開發 API 後端服務

me
林彥成
2018-04-05 | 5 min.
文章目錄
  1. 1. 開發相關資源
    1. 1.1. 語法教學資源
    2. 1.2. 相關 Framework 學習
    3. 1.3. IDE (Integrated Development Environment) 選擇
  2. 2. 打通三個關節開發 API 後端服務
    1. 2.1. 創建 Java Web Appication
    2. 2.2. 透過 Jersey RESTful Service 寫入資料庫
      1. 2.2.1. JNDI
      2. 2.2.2. 資料物件名詞 (取名主要用來辨識關係)
      3. 2.2.3. @標註

這篇文章整理了 Java Web Appication 相關學習資源,分別從基礎建設、前端網頁、後端 Web API 及資料庫切入,從 0 到 1 打造一個網站應用程式。

開發相關資源

As Title,分成前後端及資料庫部分,需打通的關節分三個方面。
前端網頁(網址) <—Q1—> RESTful Web Service <—Q2—> Web 伺服器 <—Q3—> 實體資料庫

  1. 創建 Java Web Appication: 寫出前端網頁可使用的 RESTful Web Service
  2. 透過 War 檔發佈至容器: 將程式發佈至伺服器供前端存取
  3. 讓撰寫的 RESTful Web Service 存取實體資料庫

語法教學資源

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

語法教學資源

OpenSource 平台

相關 Framework 學習

IDE (Integrated Development Environment) 選擇

這篇附上 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自動排版

打通三個關節開發 API 後端服務

系統配置上 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 )

創建 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 中。

按照以下範例:

1
2
3
4
5
6
7
8
9
10
@Path("/test")
public class TestRestPractice {
我是之前實作class test = new 我是之前實作class();

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public enum ArticleDao {
instance;
//利用HashMap當資料來源
private Map<String, Article> contentProvider = new HashMap<>();

private ArticleDao() {

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);

}

public Map<String, Article> getModel() {
return contentProvider;
}
}

其他地方則透過 ArticleDao.instance.getModel().values() 來叫用內部資料。底下簡單示範了怎麼從 sqlite 中撈出 thing 中的所有資料。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class TestSqlite {

private static TestSqlite instance = new TestSqlite();

private TestSqlite() {

}

public static TestSqlite getInstance() {
return instance;
}

public String initialSqliteString() {

Connection conn = null;
try {
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx
.lookup("java:comp/env/jdbc/sqlite");
conn = ds.getConnection();
Statement statement = conn.createStatement();
try {
statement.executeUpdate("create table thing(x integer)");
} catch (Exception e) {
// Could well be already there
}
statement.executeUpdate("insert into thing values(42)");
ResultSet rs = statement.executeQuery("select * from thing");
while (rs.next()) {

LOGGER.info("id = " + rs.getInt(1));
}
} catch (Exception e) {

LOGGER.info("Exception = " + e.getMessage());
} finally {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {

LOGGER.info("Exception = " + e.getMessage());
}
}

return "test";
}

}

JNDI

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

譬如當我們想搞一個後端資料連結用的服務,那顯然需要把他配置到你的 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 去哪下載惹。

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

  1. POJO (pure old java object)
1
2
3
4
5
6
7
8
9
10
public class Employee {
private int id;

public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
  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 名稱
1
2
3
4
public class Name {
@JsonProperty("firstName")
public String _first_name;
}

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

1
2
3
public @interface Test {

}

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

下一篇文章我們會介紹如何如何使用 Jersey 這套框架來開發 RESTful Web services


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

share