98
Java Tutorial 林信良 [email protected] http://openhome.cc

Java Tutorial:Learn Java in 06:00:00

Embed Size (px)

DESCRIPTION

這個投影片是搭配《Java Tutorial》課程,你可以在 CodeData 上看到所有內容,也可以直接在 Google Play 或 Pubu 上搜尋 "Java Tutorial" 以購得電子書。

Citation preview

Page 1: Java Tutorial:Learn Java in 06:00:00

Java

Tutorial

林信良

[email protected]

http://openhome.cc

Page 2: Java Tutorial:Learn Java in 06:00:00

課程目標

• 源起 Python Tutorial

• 六小時課程,適合對某技術有興趣但想在短時間內上手的開發者

• 藉由六小時的課程,快速概覽某個技術的生態系

2

可以在 Google Play 或 Pubu 購買 Java Tutorial

系列文章的電子書。

Page 3: Java Tutorial:Learn Java in 06:00:00

講師?

http://www.linkedin.com/in/caterpillar

3

Page 4: Java Tutorial:Learn Java in 06:00:00

學生?

• 六小時絕對不可能讓開發者完全學會某個技術,然後用該技術飛天鑽地

• 六小時目的在於介紹一個技術的輪廊,某些程度上要呈現該技術的優良部份(The good part)

• 期望在六小時課程結束之後,開發者可以有個出發點與方向,自行去參與更多的主題,研究更多的內容

4

Page 5: Java Tutorial:Learn Java in 06:00:00

課程綱要

• Java Tutorial 第一堂 – Java Tutorial 第一堂(1)JDK 版本與實作

– Java Tutorial 第一堂(2)準備課程環境

– Java Tutorial 第一堂(3)哈囉!世界!

– Java Tutorial 第一堂(4)套件、I/O 與例外

• Java Tutorial 第二堂 – Java Tutorial 第二堂(1)數值與字串型態

– Java Tutorial 第二堂(2)容器與流程語法

– Java Tutorial 第二堂(3)方法、類別與套件

• Java Tutorial 第三堂 – Java Tutorial 第三堂(1)IDE 與 Gradle

– Java Tutorial 第三堂(2)使用 spring-jdbc 存取資料庫

– Java Tutorial 第三堂(3)使用 Servlet、JSP 開發 Web 應用程式

5

Page 6: Java Tutorial:Learn Java in 06:00:00

• Java Tutorial 第四堂 – Java Tutorial 第四堂(1)使用 spring-webmvc 框架

– Java Tutorial 第四堂(2)使用 spring 相依注入

– Java Tutorial 第四堂(3)Hibernate 與 JPA

• Java Tutorial 第五堂 – Java Tutorial 第五堂(1)使用 spring-orm 整合

Hibernate

– Java Tutorial 第五堂(2)JUnit 與 Gradle

– Java Tutorial 第五堂(3)測試與重構 DvdController

• Java Tutorial 第六堂 – Java Tutorial 第六堂(1)REST 與 JAX-RS

– Java Tutorial 第六堂(2)使用 Jersey 實作 MVC

– Java Tutorial 第六堂(3)整合 Jersey/Spring/Hibernate

6

Page 7: Java Tutorial:Learn Java in 06:00:00

JDK 版本與實作

• 就撰寫 Java Tutorial 時間點而言,JDK 已經歷七個版本

• Java Tutorial 基於 Java SE 7

• Java SE 8 於 2014/03/18 釋出

• 有 Oracle/Sun JDK、OpenJDK 等實作

7

Page 8: Java Tutorial:Learn Java in 06:00:00

JDK 的版本

• 1995 年 5 月 23 日被認為是 Java 的生日

• 1998 年 12 月 4 日,Sun 發佈 Java 2 Platform,簡稱 J2SE 1.2,從該版本之後,大家開始習慣用

Java 2 這個名稱

• 之後約每隔兩年發表的 J2SE 1.3、J2SE 1.4,也一直使用 Java 2 這個名稱。

8

Page 9: Java Tutorial:Learn Java in 06:00:00

• 2004 年 9 月 29 日發表了 J2SE 5.0,版號從 1.4

突增至 5.0

• 主要是為了彰顯這個版本增加的重大語法以及功能躍進

• 至今常用的重大語法變化有像是泛型(Generics)、列舉(Enum)、標註(Annotation)等,都是在這個版本奠定

9

Page 10: Java Tutorial:Learn Java in 06:00:00

• 2006 年 12 月 11 日,Sun 發表 Java Platform,

Standard Edition 6,簡稱 Java SE 6

• Sun 官方從這個版本開始,不再使用 Java 2 而是使用 Java 這個名詞了

• 過去基於 Java 2 的 J2EE(Java 2 Platform,

Enterprise Edition)與 J2ME(Java 2 Platform,

Micro Edition),後續在基於 Java SE 6 版本而推出的新版本,也正名為 Java EE 與 Java ME

10

Page 11: Java Tutorial:Learn Java in 06:00:00

• 現在的 Java 是 Oracle 所擁有

• Sun 在 2010 年 4 月被 Oracle 併購,在易主之後,Oracle 於 2011 年 7 月 28 日推出了 Java SE 7

• Java SE 8 於 2014 年 3 月 18 日釋出,其中最受人曙目的功能為 Lambda 與新日期時間 API,詳情可參考《Java SE 8 技術手冊》

11

Page 12: Java Tutorial:Learn Java in 06:00:00

JCP 與 JSR

• Sun 於 1998 年組成了 JCP(Java Community Process) 開放性國際組織,讓 Java 演進過程成為代表成員公開監督的過程

• 想在未來版本 Java 中加入的功能或特性,必須提交至 JCP 整理規範於 JSR(Java Specification Requests)

• JSR 而後經過 JCP 執行委員會(Executive Committee)投票決定而成為最終標準文件,最終的 JSR 會提供一個免費且公開原始碼的參考實作(Reference Implementation, RI)

12

Page 13: Java Tutorial:Learn Java in 06:00:00

Oracle JDK 與 OpenJDK7

• 有興趣的廠商或組織也以根據 JSR 自行實現產品

• 只有通過 TCK 相容性測試的實作,才可以使用

Java 這個商標

• 2006 年的 JavaOne 大會上,Sun 宣告對 Java

開放原始碼,從 JDK7 b10 開始有了 OpenJDK,並於 2009 年 4 月 15 日正式發佈 OpenJDK

• Oracle 時代發佈的 JDK7 正式版本,指定了

OpenJDK7 為官方參考實作。

13

Page 14: Java Tutorial:Learn Java in 06:00:00

• Sun JDK 採 JRL,而 OpenJDK7 採 GPL(帶有

GPL linking exception 的修正版本)

• 前者原始碼可用於個人研究使用,但禁止任何商業用途,後者則允許商業上的使用

• OpenJDK7 必須拿掉許多在兩個授權間有衝突的程式碼,也不包括一些部署(Deployment)工具,有許多程式碼因授權衝突而必須拿掉

14

Page 15: Java Tutorial:Learn Java in 06:00:00

• 原始的 OpenJDK7 是不完整的,因此無法通過 JCK 相容測試

• 如果執行 java -version,原始的 OpenJDK7 顯示的會是 openjdk version 字樣,而不是 java version 字樣

• 為了解決授權問題,以便在 Fedora 或 Linux 分支中能自由發佈 OpenJDK7,Red Hat 於 2007 年發起了 IcedTea 計畫

• IcedTea 致力於修補 OpenJDK7 使之完備,並通過了 JCK 相容測試

• 如果使用 IcedTea 修補過後的 OpenJDK7,執行 java -version,就會顯示 java version 字樣。

15

Page 16: Java Tutorial:Learn Java in 06:00:00

OpenJDK7 與 OpenJDK6

• OpenJDK6 並不是 JDK6 的分支,而是將

OpenJDK7 中 JDK7 的特性拿掉,使之符合

JDK6 的規範

• OpenJDK6 實際上是 OpenJDK7 的分支,OpenJDK6 可以通過 JCK 相容測試

16

Page 17: Java Tutorial:Learn Java in 06:00:00

• Oracle 從 2012 年 7 月以來,就打算結束對

JDK6 的支持

• JDK6 在企業間仍廣泛應用,Red Hat 於 2013 年

3 月時 宣布持有 OpenJDK6 領導權,以能持續對

OpenJDK6 發現的臭蟲與安全問題進行修補

17

Page 18: Java Tutorial:Learn Java in 06:00:00

準備課程環境

• Ubuntu 12.04 LTS

• 練習 0:安裝 Git 客戶端、Sublime Text 2 編輯器

• 練習 1:安裝 OpenJDK 7

• 練習 2:下載、安裝 Gradle

18

Page 19: Java Tutorial:Learn Java in 06:00:00

關於 Gradle

• 在 Java 中要開發應用程式

– 必須撰寫原始碼、編譯、執行

– 過程中必須指定類別路徑(Class path)、原始碼路徑(Source path)

– 相關應用程式檔案必須使用工具程式建構(Build)以完成封裝與部署(Deploy)

– 嚴謹的應用程式還有測試(Test)等工作階段 …

• 開發過程中可能是有一定且重複性的流程,因而

Java 的世界中提供有建構工具(Build tool)來輔助開發人員

19

Page 20: Java Tutorial:Learn Java in 06:00:00

• Ant(Another Neat Tool)

– 元老級的專案

– 專案結構上有很大的彈性

– 然而彈性的另一面就是鎖碎的設定

• Maven

– 提供預設專案及相關慣例設定

– 解決程式庫或框架相依性問題

– 提供了集中式貯藏室(Central repository)

– (對於相依性管理問題,Ant 也結合了 Ivy 來進行解決)

• Ant Ivy、Maven,主要都使用 XML 進行設定,設定繁鎖,而且有較高的學習曲線

20

Page 21: Java Tutorial:Learn Java in 06:00:00

• Gradle

– 結合了 Ant 與 Maven 的一些好的概念(像是 Task、Repository 等)

– Groovy 語言作為腳本設定,在設定上有了極大的簡化

– 可以輕易地與 Ant、Maven 進行整合

– 不少重大專案宣佈改用 Gradle 做為建構工具

• 考量課程進行的簡易性,這門課中使用 Gradle

21

Page 22: Java Tutorial:Learn Java in 06:00:00

哈囉!世界!

• 準備「撰寫、編譯與執行」第一個 Java 程式

• 練習 3:哈囉!世界!

• 練習 4:使用 Gradle 的哈囉!世界!

22

Page 23: Java Tutorial:Learn Java in 06:00:00

套件管理

• 程式開發中會使用到程式庫,程式庫中會包括許多類別

• 為了避免彼此名稱衝突,也為了避免檔案彼此覆蓋,Java 提到了套件(Package)來加以管理

23

Page 24: Java Tutorial:Learn Java in 06:00:00

• 對於一些語言中有的函式(Function),Java 可使用靜態(static)方法定義於類別之中

• 類別是作為靜態方法的名稱空間(Namespace)

• 除了靜態方法,也可以定義靜態變數,也就是以類別作為名稱空間的變數

24

Page 25: Java Tutorial:Learn Java in 06:00:00

輸入輸出

• Java 的程式進入點是 public static void

main(String[] args),為何這麼寫?

– 要給簡單答案的話「這是規定」

– main 是公開(public)方法,如此才能在其他套件中取用

– 它是靜態成員,因此 JVM 就可以在收集好命令列引數(Command line arguments)為一個字串陣列 args

後,以 HelloWorld.main(args) 來呼叫它

25

Page 26: Java Tutorial:Learn Java in 06:00:00

• 輸入輸出

– 可以基於串流(Stream)程式庫

– 可以基於高階的 New IO 程式

– JDK7 增加 NIO2 功能

• Ubuntu 12.04 LTS 中,預設文字編碼是 UTF-8

• 對於 Files.readAllLines」讀取的每一行,指定給

line 變數,然後執行迴圈內容

for(String line : Files.readAllLines(source, charset))

26

Page 27: Java Tutorial:Learn Java in 06:00:00

例外

• Java 中對於錯誤的表示,不以某個常數來表示

• 這也是程式進入點宣告為 void 的原因

• 我們嘗試執行:

• 如果 Files.readAllLines 真的發生輸入輸出

的錯誤

27

Page 28: Java Tutorial:Learn Java in 06:00:00

• 當初設計 Files.readAllLines 方法時,就好

心地在方法的原始碼上聲明了,這個方法會拋出 IOException

• 只要查詢文件,不用看原始碼,也可以知道這個方法會拋出什麼例外

28

Page 29: Java Tutorial:Learn Java in 06:00:00

• 如果你忘了要處理例外,像是 …

• 編譯器也會以編譯失敗來提示

29

Page 30: Java Tutorial:Learn Java in 06:00:00

• Java 是唯一採用這種作法的語言

• Java 最常被攻訐的缺點之一,因為這必須造成語法上的繁瑣

• 在應用程式演化至一定規模時,也會遭遇到設計上的麻煩

• 與其抗拒它,不如正確地認識如何使用它

30

Page 31: Java Tutorial:Learn Java in 06:00:00

數值與字串型態

• 哪些東西才是語言中重要而基本的元素呢?Pascal 之父 Niklaus E. Writh 曾說過:

• 對於 Java 語言講解的重點將選定在:

– 型態系統、變數(Variable)與運算子(Operator)

– 方法(Method)、類別(Class)與套件(Package)

31

Algorithms + Data Structures = Programs

Page 32: Java Tutorial:Learn Java in 06:00:00

型態系統

• 雖然帶動與普及了物件導向的設計,不過 Java

本身並不是純綷的物件導向語言

• 就目前版本的 Java 而言,混合了兩個型態系統:

– 基本型態(Primitive type)

– 物件型態(Object type)

• 在未來的版本中也許會拿掉 Java 中基本型態,只留下物件型態

• 不過現階段而言,基本型態與物件型態還是並存的,兩種都必須瞭解

32

Page 33: Java Tutorial:Learn Java in 06:00:00

數值型態

• 整數可以使用 byte(單位元組)、short(雙位元組)、int(四位元組)與 long(八位元組)

型態

• 僅寫下 1 這樣的實字(Literal),會是 int 型態

• 如果想要寫下的實字是 long 型態,必須在實字後加上 L:

33

Page 34: Java Tutorial:Learn Java in 06:00:00

• 超過 long 可容納範圍的數要怎麼表示?

• switch 從 JDK7 開始,可以支援字串

34

Page 35: Java Tutorial:Learn Java in 06:00:00

• 要將基本型態包裝為物件型態,可以直接使用對應的 Byte、Short、Integer 與 Long 包裹器

(Wrapper)類別

• 在程式中寫下像是 0.3 這樣的浮點數實字,會使用 double 型態

35

Page 36: Java Tutorial:Learn Java in 06:00:00

• 如果想要使用 float 型態,有兩種方式:

• 在數值前加上一個型態限定,通常被稱之為轉型(CAST),實際上,這是關閉編譯器在此處的型態檢查

• 多數 CPU 與浮點運算器多採用 IEEE754 浮點數運算(IEEE 754 floating-point arithmetic)

36

Page 37: Java Tutorial:Learn Java in 06:00:00

37

Page 38: Java Tutorial:Learn Java in 06:00:00

• 在需要浮點數精度的時候,Java 中可以使用 java.math.BigDecimal,例如:

38

Page 39: Java Tutorial:Learn Java in 06:00:00

字元、字串型態

• 在 Java 中要表示字元,必須使用單引號來包裹,像是 'A'、'程' 就表示字元,型態是 char 基

本型態

• Java 支援 Unicode,內部實作採用 UTF-16 Big

Endian,也就是說,無論中英文字元,都會使用兩個位元組

• 字串的話,Java 中使用雙引號來包裹,像是 "codedata"、"程式" 就表示字串

• Java 中的字串不可變(Immutable)

39

Page 40: Java Tutorial:Learn Java in 06:00:00

40

Page 41: Java Tutorial:Learn Java in 06:00:00

• Java 中若要比較兩個基本型態,可以使用 ==,

然而要比較兩個物件的狀態是否相同,則需透過物件上定義的 equals 方法

41

Page 42: Java Tutorial:Learn Java in 06:00:00

容器型態

• 需要容量固定且有序的容器,可以使用陣列物件

• 如果需要有序具索引特性的容器,且需要比陣列擁有更多功能,可以使用 List:

• 可以視需求採用適當資料結構實作的物件

42

Integer[] numbers = {1, 2, 3};

List<Integer> numbers = Arrays.asList(1, 2, 3);

Page 43: Java Tutorial:Learn Java in 06:00:00

• Set 型態是無序群集(Collection),管理的元素

不會重複

43

Page 44: Java Tutorial:Learn Java in 06:00:00

• 鍵值對應的物件,在 Java 中可使用 Map 型態,

44

Page 45: Java Tutorial:Learn Java in 06:00:00

Guava Collections

• Java 標準 API 的容器物件,著重在功能性的定義與實作,少於考量易用性

• Java 的世界中有不少的開放原始碼程式庫,可以補強 Java 在這方面的不足

• 在這邊使用一下 guava-libraries 的 Collections,讓需求在操作上比較方便一些

• 練習 5:使用 Guava Collections

45

Page 46: Java Tutorial:Learn Java in 06:00:00

if、switch、while 與 for 46

Page 47: Java Tutorial:Learn Java in 06:00:00

47

Page 48: Java Tutorial:Learn Java in 06:00:00

• 要是具備 java.lang.Iterable 行為的物件,

都可以搭配 foreach 語法

– 練習 6:使用 foreach 迭代路徑

48

Page 49: Java Tutorial:Learn Java in 06:00:00

方法、類別與套件

• Java 基本上是個以物件導向為主要典範的語言

• 基本上,無論採用何種典範,關鍵在於架構程式時應思考的幾個重點,像是…

– 抽象層的封裝與隔離

– 物件的狀態

– 名稱空間(Namespace)

– 資源的實體組織方式,像是原始碼檔案、套件(Package)等

49

Page 50: Java Tutorial:Learn Java in 06:00:00

靜態方法

• 當發現到兩個程式片段極為類似:

50

Page 51: Java Tutorial:Learn Java in 06:00:00

• 就某些程度上,包括靜態方法的類別充當了名稱空間

– java.lang.Math

– java.util.Arrays

• 當想操作的功能不渉及狀態時,可以考慮使用靜態方法

51

Page 52: Java Tutorial:Learn Java in 06:00:00

類別

52

Page 53: Java Tutorial:Learn Java in 06:00:00

53

Page 54: Java Tutorial:Learn Java in 06:00:00

• 何不將相關的狀態與操作黏在一起呢?這樣比較容易使用些?

54

Page 55: Java Tutorial:Learn Java in 06:00:00

• 客戶端在使用上就容易得多了…

• 在討論物件導向時,大家總是愛談可重用性(Reusability),然而要談到重用性的話,函式的重用性還高上許多,在考量物件導向時,易用性(Usability)其實才是它的重點。

55

Page 56: Java Tutorial:Learn Java in 06:00:00

• 檔案名稱衝突是有可能發生的

56

Page 57: Java Tutorial:Learn Java in 06:00:00

• package 宣告 Account 在 tw.codedata.bank

– 如果在其他套件中使用它,必須使用類別全名

tw.codedata.bank.Account

– Account.java 必須放置在原始碼路徑(SOURCEPATH)

(可使用 javac 的 -sourcepath 指定)的

tw/codedata/bank 目錄中

– 編譯完成的 Account.class 必須放在類別路徑(CLASSPATH)的 tw/codedata/bank 目錄中

57

Page 58: Java Tutorial:Learn Java in 06:00:00

• 練習 7:運用類別與套件來組織程式

58

Page 59: Java Tutorial:Learn Java in 06:00:00

Gradle 與 IDE

• 基本的專案目錄結構,能不能請 Gradle 來協助建立呢?

• 執行 gradle create-dirs,就會自動建立 src

目錄及其下各個子目錄

59

Page 60: Java Tutorial:Learn Java in 06:00:00

• 如果想讓你的 Gradle 專案,可以直接在 Eclipse

中進行匯入,可以在 build.gradle 中加上:

60

Page 62: Java Tutorial:Learn Java in 06:00:00

• 練習 8:安裝、使用 NetBeans 與 Gradle Plugins

62

Page 63: Java Tutorial:Learn Java in 06:00:00

關於 JDBC

• 如果要想確實瞭解 Java 如何存取資料庫,學習

JDBC 確實是必要的

63

Page 64: Java Tutorial:Learn Java in 06:00:00

使用 spring-jdbc

• 實際上 JDBC 撰寫來冗長且痛苦,就六個小時的課程來說,也沒有閒功夫來做這樣的練習

• 就目前來說,如果想使用 Spring 的任何元件,必須透過 Maven 或 Gradle 來取得相依程式庫

• 練習 9:使用 spring-jdbc

64

Page 65: Java Tutorial:Learn Java in 06:00:00

使用 Servlet、JSP 開發 Web 應用程式

• 在 Java 中開發 Web 應用程式會基於 Servlet、JSP 等標準,Servlet、JSP 必須運行於 Web 容器(Container)

• Web 容器簡單來說,就是個用 Java 寫的應用程式,從 Servlet、JSP 的角度來看,就是它們唯一認得的 Web 平台

• 只要你能提供 Web 容器作為 Servlet、JSP 運行的平台,你的 Web 應用程式理想上就不用理會底層實際的 HTTP 伺服器為何

65

Page 66: Java Tutorial:Learn Java in 06:00:00

• 編譯出來的 .class 檔案,必須放置在 Web 應用程式目錄中的 /WEB-INF/classes/ 目錄

• JAR 檔案必須放置在 /WEB-INF/lib/ 目錄

• 可直接被 HTTP 客戶端請求的資源(像是 HTML、JavaScript、JSP等原始碼),則可放置在

/WEB-INF/ 以外的其他目錄。

• Web 應用程式必須包裝為 WAR(Web Archive)

• Web 容器如何實作有標準規範,Java 領域最常聽到的實作之一是 Apache Tomcat

66

Page 67: Java Tutorial:Learn Java in 06:00:00

• 使用 Servlet 3.x,可使用標註(Annotation)來設定 URL 模式(Pattern)等資訊

• 如果是先前的 Servlet 規範,你會需要 /WEB-

INF/web.xml 來進行對應的資訊設定

67

Page 68: Java Tutorial:Learn Java in 06:00:00

• 雖然 Servlet 可以直接輸出呈現內容,不過設計上,Servlet 最好只接受、驗證與轉發請求,不要涉及呈現內容,如果要呈現內容可使用 JSP 技術

• 練習 10:使用 Servlet、JSP

68

Page 69: Java Tutorial:Learn Java in 06:00:00

使用 spring-webmvc 框架

• 基於快速開發、團隊規範、第三方整合等因素,你可能會選擇使用 Web 框架(Framework)

• 什麼是框架?它跟程式庫(Library)有何不同?

69

Page 70: Java Tutorial:Learn Java in 06:00:00

程式庫 vs 框架

• IoC(Inversion of Control)

– 流程的控制權被反轉,現在是框架在定義流程

– 在既定的流程中框架會呼叫你的函式,而不是你來呼叫框架

• 我們需要使用框架嗎?

– 使用程式庫時,開發者會擁有較高的自由度;使用框架時,開發者會受到較大的限制

– 是否要遵循框架規範的流程?

– 使用框架是基於技術考量?

– 還是基於商業上的考量?

70

Page 71: Java Tutorial:Learn Java in 06:00:00

• 練習 11:使用 spring-webmvc

• spring-webmvc 是個支援 MVC 流程架構的框架

71

http://openhome.cc/Gossip/ServletJSP/Model2.html

Page 72: Java Tutorial:Learn Java in 06:00:00

使用 spring 相依注入

• 為了能夠使用 DvdDaoJdbcImpl,我們必須建立 DataSource 實例並進行相關設定:

72

Page 73: Java Tutorial:Learn Java in 06:00:00

物件建立與相依注入

• 物件的建立與相依注入(Dependency Injection)是我們所關心的

• 只不過當過程太過冗長,模糊了商務流程之時,應該適當地將之分離

73

Page 74: Java Tutorial:Learn Java in 06:00:00

• 隨著你打算開始整合各種程式庫或方案,你會遇到各種物件建立與相依設定需求,為此,你可能會重構 DaoHelper,使之越來越通用

• 像是可透過組態檔來進行相依設定,甚至成為一個通用於各式物件建立與相依設定的容器(Container)

• 實際上,這類容器,在 Java 的世界中早已存在,且有多樣性的選擇,你可以調查看看有哪些可以使用,避免直接重新打造輪子。

74

Page 75: Java Tutorial:Learn Java in 06:00:00

Spring 相依注入

• Spring 本身的核心就是一個相依注入容器

• spring-webmvc 本身就是基於 Spring 相依注入容器而建立起來的

• Spring 的相依注入容器,英文上也常簡稱為 DI

(Dependency Injection)容器

• 更早前 Spring 採用 IoC(Inversion of Control)容器這個名詞

75

Page 76: Java Tutorial:Learn Java in 06:00:00

• Spring 的 IoC 指的是物件建立與相依設定的控制權,由開發者手中轉換至容器身上

• Web 框架之類的 IoC,指的是對流程的控制權,從開發者手中轉換至框架身上

• 為了避免名詞混淆,Spring 建立使用 DI 容器來稱呼其核心容器

• 練習 12:使用 Spring 相依注入

76

Page 77: Java Tutorial:Learn Java in 06:00:00

Hibernate 與 JPA

• 物件關聯對應(Object-Relational Mapping,

ORM)

– 如果設計變更,要為每個影片的導演增加更多資訊,因而 Dvd 類別中 String 的 director,必須成為一個 Director 型態..

77

Page 78: Java Tutorial:Learn Java in 06:00:00

• 那麼你的 DvdDaoJdbcImpl 將得因為這個需求

變化而修改程式了

• 隨著後續的程式開發,這類需求不斷增加,可能會導致這類修改不斷發生

• 你會逐漸感受到物件導向與關聯式資料庫因為模型不匹配導致的種種問題

– 像是物件導向的繼承如何在關聯式資料庫中對應,多型查詢如何實現等問題。

78

Page 79: Java Tutorial:Learn Java in 06:00:00

• 物件關聯對應(Object-Relational Mapping,

ORM)解決方案

– Hibernate

– 由於 Hibernate 廣為流行,設計方式後續影響了 EJB3

中 JPA(Java Persistence API) 規格製定

• 使用 Hibernate 這類的 ORM 方案,基本上需要…

– 宣告物件與關聯式資料庫的對應關係

– 從物件的觀點來進行操作

– Hibernate 會自動為你產生對應的 SQL 語句。

79

Page 80: Java Tutorial:Learn Java in 06:00:00

對應關係宣告

• hibernate.cfg.xml

80

Page 81: Java Tutorial:Learn Java in 06:00:00

• Entity 宣告

81

Page 82: Java Tutorial:Learn Java in 06:00:00

SessionFactory

• 可以使用 Configuration 讀取

hibernate.cfg.xml、建立 SessionFactory 物件,後者用來建立Session 物件,負責資料庫操作過

程的功能。不過這個過程

• 建立一個 HibernateUtil 類別會比較方便一些

82

Page 83: Java Tutorial:Learn Java in 06:00:00

儲存與查詢

83

• 練習 13:使用 Hibernate

Page 84: Java Tutorial:Learn Java in 06:00:00

使用 spring-orm 整合 Hibernate

• DVDLibrary 專案

– 在練習 11 時使用 spring-webmvc 框架,建立簡單的

Web 應用程式

– 在練習 12 時使用 spring 相依注入,進行依賴物件注入

– 因為接觸了 Hibernate,就整合進去吧!…XD

• 練習 14:使用 spring-orm

84

Page 85: Java Tutorial:Learn Java in 06:00:00

JUnit 與 Gradle

• 在先前一連串的練習中,我們作了數次的重構(Refactoring)

• 每次重構時是不是會有些怕怕的,如果不小心改爛了怎麼辦?

• 每次重構完總得執行整個應用程式,看看功能是不是正確?

• 對這種測試方式終究有些不安!?

85

Page 86: Java Tutorial:Learn Java in 06:00:00

• 你應該為撰寫的程式加入一些專門用的測試程式

• 在測試中最基本的單位是單元測試(Unit test),

• 測試一個工作單元(a unit of work)的行為

– 對於建築橋墩而言,一個螺絲釘、一根鋼筋、一條鋼索甚至一公斤的水泥等,都可謂是一個工作單元

– 驗證這些工作單元行為或功能 (硬度、張力等)是否符合預期,方可確保最後橋墩安全無虞

• 在 Java 的世界談到單元測試,基本上都得認識一下 JUnit 這個元老級的單元測試框架

• IDE 多半都有整合這個框架

86

Page 87: Java Tutorial:Learn Java in 06:00:00

• 練習 15:在 Gradle 中使用 JUnit

87

Page 88: Java Tutorial:Learn Java in 06:00:00

測試與重構 DvdController

• 在瞭解如何使用 JUnit 之後,接著來試著重新做一次 練習 14,由於時間有限,我們僅將重點放在 DvdController 的測試與重構

• 練習 16:為 DvdController 建立測試

• 練習 17:重構與測試 DvdController

88

Page 89: Java Tutorial:Learn Java in 06:00:00

REST 與 JAX-RS

• REST 是一種軟體架構風格,全名是

REpresentational State Transfer

– REST 的架構由客戶端(Client)/伺服端(Server)組成

– 資源在 REST 中是可定址的(Addressed)

– 請求動作必須能表現出如何處理請求(例如 HTTP 中的 GET、POST、PUT、DELETE 等請求)

– 回應的內容型態與資源的概念是分離的,一個資源可以有多種內容型態來展現(狀態)

– …

89

Page 90: Java Tutorial:Learn Java in 06:00:00

• REST Triangle 中有名詞(Nouns)、動詞(Verbs)與內容型態(Content Types)

• 分別用以代表資源獨一無二的識別、對資源進行操作的動作,以及資源的表徵(表現方式)

90

Page 91: Java Tutorial:Learn Java in 06:00:00

• 以 HTTP 來說

– URI 就是處於名詞角色,為資源定義了識別名稱

– 具有一組有限的 GET、POST、PUT 與 DELETE 等方法

來操作資源

– 可以使用 content-type 標頭來定義資源表現方式

• 這些概念與 REST 概念不謀而合,REST 架構基於 HTTP 1.0,與 HTTP1.1 平行發展

• 符合 REST 最大實現就是 WWW,整個 Web 就像是個狀態機,藉由連結不斷改變狀態

• 不過 REST 架構的風格與特定協定無關,雖然最初是使用 HTTP 來描述,但不限於 HTTP。

91

Page 92: Java Tutorial:Learn Java in 06:00:00

• 以基本 CRUD 來說,針對 DVD 記錄而言,設計的範例之一可以是:

– GET /dvds/

– GET /dvds/1

– GET /dvds/add

– POST /dvds/

– PUT /dvds/1

– DELETE /dvds/1

92

Page 93: Java Tutorial:Learn Java in 06:00:00

• 這幾個 HTTP 方法與 URI 結合的意義分別是:

– 取得 DVD 清單(從 /dvds/ 資源取得表徵)

– 取得第一筆 DVD 記錄(從 /dvds/1 資源取得表徵)

– 取得新增 DVD 的頁面(從 /dvds/add 資源取得表徵)

– 發送一筆 DVD(將資料發送至 /dvds/ 作新增)

– 推送一筆 DVD(將資料發送至 /dvds/ 作新增或更新)

– 刪除一筆 DVD(刪除 /dvds/1 資源)

• 每個 URI 代表一個可處理請求的資源,根據請求為 GET、PUT 或 POST,就可以知道對該資源要

作什麼樣的處理

93

Page 94: Java Tutorial:Learn Java in 06:00:00

• Java EE 6 起包含了對 RESful Web Service 的解決方案 JAX-RS

• 架構於 Servlet 標準之上

• JAX-RS 是個技術標準,各家廠商可以有自己的實作,在練習中,會使用的實作是 Jersey

• 練習 18:使用 JAX-RS

94

Page 95: Java Tutorial:Learn Java in 06:00:00

使用 Jersey 實作 MVC

• Jersey 本身定義了一個 Viewable 類別,可以做

為請求處理方法的傳回型態

• Viewable 的實例可以攜帶方法的執行結果,並

交由指定的畫面元件去處理,因而可用來實作

MVC/Model 2 架構

95

Page 96: Java Tutorial:Learn Java in 06:00:00

• 練習 19:使用 Jersey 實作 MVC/Model 2

96

Page 97: Java Tutorial:Learn Java in 06:00:00

整合 Jersey/Spring/Hibernate

• 將練習 14 的成果中的 Spring MVC 換成 Jersey,作為本課程的最後一個練習

• 練習 20:整合 Jersey/Spring/Hibernate

97

Page 98: Java Tutorial:Learn Java in 06:00:00

繼續前進

• 本課程到了尾聲了 …

• 製作〈Java Tutorial〉電子書正值 JDK8 發表不久,算算 Java 也歷經了快二十年的變遷,這麼多年來 Java 累積的東西非常龐大

• JDK8 又試著導入新的典範與不少的觀念 …

• 這個課程只是個簡短的生態之旅,如果你正要進入 Java 的世界,別忘了,你的旅程才剛要開始!…

98