SlideShare a Scribd company logo
1 of 98
Download to read offline
Java Tutorial 
林信良 caterpillar@openhome.cc http://openhome.cc
課程目標 
•源起 Python Tutorial 
•六小時課程,適合對某技術有興趣但想在短時間 內上手的開發者 
•藉由六小時的課程,快速概覽某個技術的生態系 
2 
可以在 Google Play 或 Pubu 購買 Java Tutorial 系列文章的電子書。
講師? 
http://www.linkedin.com/in/caterpillar 
3
學生? 
•六小時絕對不可能讓開發者完全學會某個技術, 然後用該技術飛天鑽地 
•六小時目的在於介紹一個技術的輪廊,某些程度 上要呈現該技術的優良部份(The good part) 
•期望在六小時課程結束之後,開發者可以有個出 發點與方向,自行去參與更多的主題,研究更多 的內容 
4
課程綱要 
•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
•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
JDK 版本與實作 
•就撰寫 Java Tutorial 時間點而言,JDK 已經歷七 個版本 
•Java Tutorial 基於 Java SE 7 
•Java SE 8 於 2014/03/18 釋出 
•有 Oracle/Sun JDK、OpenJDK 等實作 
7
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
•2004 年 9 月 29 日發表了 J2SE 5.0,版號從 1.4 突增至 5.0 
•主要是為了彰顯這個版本增加的重大語法以及功能 躍進 
•至今常用的重大語法變化有像是泛型(Generics)、 列舉(Enum)、標註(Annotation)等,都是在這 個版本奠定 
9
•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
•現在的 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
JCP 與 JSR 
•Sun 於 1998 年組成了 JCP(Java Community Process) 開放性國際組織,讓 Java 演進過程成 為代表成員公開監督的過程 
•想在未來版本 Java 中加入的功能或特性,必須 提交至 JCP 整理規範於 JSR(Java Specification Requests) 
•JSR 而後經過 JCP 執行委員會(Executive Committee)投票決定而成為最終標準文件,最 終的 JSR 會提供一個免費且公開原始碼的參考實 作(Reference Implementation, RI) 
12
Oracle JDK 與 OpenJDK7 
•有興趣的廠商或組織也以根據 JSR 自行實現產品 
•只有通過 TCK 相容性測試的實作,才可以使用 Java 這個商標 
•2006 年的 JavaOne 大會上,Sun 宣告對 Java 開放原始碼,從 JDK7 b10 開始有了 OpenJDK, 並於 2009 年 4 月 15 日正式發佈 OpenJDK 
•Oracle 時代發佈的 JDK7 正式版本,指定了 OpenJDK7 為官方參考實作。 
13
•Sun JDK 採 JRL,而 OpenJDK7 採 GPL(帶有 GPL linking exception 的修正版本) 
•前者原始碼可用於個人研究使用,但禁止任何商 業用途,後者則允許商業上的使用 
•OpenJDK7 必須拿掉許多在兩個授權間有衝突的 程式碼,也不包括一些部署(Deployment)工具, 有許多程式碼因授權衝突而必須拿掉 
14
•原始的 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
OpenJDK7 與 OpenJDK6 
•OpenJDK6 並不是 JDK6 的分支,而是將 OpenJDK7 中 JDK7 的特性拿掉,使之符合 JDK6 的規範 
•OpenJDK6 實際上是 OpenJDK7 的分支, OpenJDK6 可以通過 JCK 相容測試 
16
•Oracle 從 2012 年 7 月以來,就打算結束對 JDK6 的支持 
•JDK6 在企業間仍廣泛應用,Red Hat 於 2013 年 3 月時 宣布持有 OpenJDK6 領導權,以能持續對 OpenJDK6 發現的臭蟲與安全問題進行修補 
17
準備課程環境 
•Ubuntu 12.04 LTS 
•練習 0:安裝 Git 客戶端、Sublime Text 2 編輯器 
•練習 1:安裝 OpenJDK 7 
•練習 2:下載、安裝 Gradle 
18
關於 Gradle 
•在 Java 中要開發應用程式 
–必須撰寫原始碼、編譯、執行 
–過程中必須指定類別路徑(Class path)、原始碼路徑 (Source path) 
–相關應用程式檔案必須使用工具程式建構(Build)以 完成封裝與部署(Deploy) 
–嚴謹的應用程式還有測試(Test)等工作階段 … 
•開發過程中可能是有一定且重複性的流程,因而 Java 的世界中提供有建構工具(Build tool)來輔 助開發人員 
19
•Ant(Another Neat Tool) 
–元老級的專案 
–專案結構上有很大的彈性 
–然而彈性的另一面就是鎖碎的設定 
•Maven 
–提供預設專案及相關慣例設定 
–解決程式庫或框架相依性問題 
–提供了集中式貯藏室(Central repository) 
–(對於相依性管理問題,Ant 也結合了 Ivy 來進行解決) 
•Ant Ivy、Maven,主要都使用 XML 進行設定,設 定繁鎖,而且有較高的學習曲線 
20
•Gradle 
–結合了 Ant 與 Maven 的一些好的概念(像是 Task、 Repository 等) 
–Groovy 語言作為腳本設定,在設定上有了極大的簡化 
–可以輕易地與 Ant、Maven 進行整合 
–不少重大專案宣佈改用 Gradle 做為建構工具 
•考量課程進行的簡易性,這門課中使用 Gradle 
21
哈囉!世界! 
•準備「撰寫、編譯與執行」第一個 Java 程式 
•練習 3:哈囉!世界! 
•練習 4:使用 Gradle 的哈囉!世界! 
22
套件管理 
•程式開發中會使用到程式庫,程式庫中會包括許 多類別 
•為了避免彼此名稱衝突,也為了避免檔案彼此覆 蓋,Java 提到了套件(Package)來加以管理 
23
•對於一些語言中有的函式(Function),Java 可 使用靜態(static)方法定義於類別之中 
•類別是作為靜態方法的名稱空間(Namespace) 
•除了靜態方法,也可以定義靜態變數,也就是以 類別作為名稱空間的變數 
24
輸入輸出 
•Java 的程式進入點是 public static void main(String[] args),為何這麼寫? 
–要給簡單答案的話「這是規定」 
–main 是公開(public)方法,如此才能在其他套件中 取用 
–它是靜態成員,因此 JVM 就可以在收集好命令列引數 (Command line arguments)為一個字串陣列 args 後,以 HelloWorld.main(args) 來呼叫它 
25
•輸入輸出 
–可以基於串流(Stream)程式庫 
–可以基於高階的 New IO 程式 
– JDK7 增加 NIO2 功能 
•Ubuntu 12.04 LTS 中,預設文字編碼是 UTF-8 
•對於 Files.readAllLines」讀取的每一行,指定給 line 變數,然後執行迴圈內容 
for(String line : Files.readAllLines(source, charset)) 
26
例外 
•Java 中對於錯誤的表示,不以某個常數來表示 
•這也是程式進入點宣告為 void 的原因 
•我們嘗試執行: 
•如果 Files.readAllLines 真的發生輸入輸出 的錯誤 
27
•當初設計 Files.readAllLines 方法時,就好 心地在方法的原始碼上聲明了,這個方法會拋出 IOException 
•只要查詢文件,不用看原始碼,也可以知道這個 方法會拋出什麼例外 
28
•如果你忘了要處理例外,像是 … 
•編譯器也會以編譯失敗來提示 
29
•Java 是唯一採用這種作法的語言 
•Java 最常被攻訐的缺點之一,因為這必須造成語 法上的繁瑣 
•在應用程式演化至一定規模時,也會遭遇到設計 上的麻煩 
•與其抗拒它,不如正確地認識如何使用它 
30
數值與字串型態 
•哪些東西才是語言中重要而基本的元素呢? Pascal 之父 Niklaus E. Writh 曾說過: 
•對於 Java 語言講解的重點將選定在: 
–型態系統、變數(Variable)與運算子(Operator) 
–方法(Method)、類別(Class)與套件(Package) 
31 
Algorithms + Data Structures = Programs
型態系統 
•雖然帶動與普及了物件導向的設計,不過 Java 本身並不是純綷的物件導向語言 
•就目前版本的 Java 而言,混合了兩個型態系統: 
–基本型態(Primitive type) 
–物件型態(Object type) 
•在未來的版本中也許會拿掉 Java 中基本型態, 只留下物件型態 
•不過現階段而言,基本型態與物件型態還是並存 的,兩種都必須瞭解 
32
數值型態 
•整數可以使用 byte(單位元組)、short(雙位 元組)、int(四位元組)與 long(八位元組) 型態 
•僅寫下 1 這樣的實字(Literal),會是 int 型態 
•如果想要寫下的實字是 long 型態,必須在實字 後加上 L: 
33
•超過 long 可容納範圍的數要怎麼表示? 
•switch 從 JDK7 開始,可以支援字串 
34
•要將基本型態包裝為物件型態,可以直接使用對 應的 Byte、Short、Integer 與 Long 包裹器 (Wrapper)類別 
•在程式中寫下像是 0.3 這樣的浮點數實字,會使 用 double 型態 
35
•如果想要使用 float 型態,有兩種方式: 
•在數值前加上一個型態限定,通常被稱之為轉型 (CAST),實際上,這是關閉編譯器在此處的 型態檢查 
•多數 CPU 與浮點運算器多採用 IEEE754 浮點數 運算(IEEE 754 floating-point arithmetic) 
36
37
•在需要浮點數精度的時候,Java 中可以使用 java.math.BigDecimal,例如: 
38
字元、字串型態 
•在 Java 中要表示字元,必須使用單引號來包裹, 像是 'A'、'程' 就表示字元,型態是 char 基 本型態 
•Java 支援 Unicode,內部實作採用 UTF-16 Big Endian,也就是說,無論中英文字元,都會使用 兩個位元組 
•字串的話,Java 中使用雙引號來包裹,像是 "codedata"、"程式" 就表示字串 
•Java 中的字串不可變(Immutable) 
39
40
•Java 中若要比較兩個基本型態,可以使用 ==, 然而要比較兩個物件的狀態是否相同,則需透過 物件上定義的 equals 方法 
41
容器型態 
•需要容量固定且有序的容器,可以使用陣列物件 
•如果需要有序具索引特性的容器,且需要比陣列 擁有更多功能,可以使用 List: 
•可以視需求採用適當資料結構實作的物件 
42 
Integer[] numbers = {1, 2, 3}; 
List<Integer> numbers = Arrays.asList(1, 2, 3);
•Set 型態是無序群集(Collection),管理的元素 不會重複 
43
•鍵值對應的物件,在 Java 中可使用 Map 型態, 
44
Guava Collections 
•Java 標準 API 的容器物件,著重在功能性的定義 與實作,少於考量易用性 
•Java 的世界中有不少的開放原始碼程式庫,可以 補強 Java 在這方面的不足 
•在這邊使用一下 guava-libraries 的 Collections,讓需求在操作上比較方便一些 
•練習 5:使用 Guava Collections 
45
if、switch、while 與 for 
46
47
•要是具備 java.lang.Iterable 行為的物件, 都可以搭配 foreach 語法 
–練習 6:使用 foreach 迭代路徑 
48
方法、類別與套件 
•Java 基本上是個以物件導向為主要典範的語言 
•基本上,無論採用何種典範,關鍵在於架構程式 時應思考的幾個重點,像是… 
–抽象層的封裝與隔離 
–物件的狀態 
–名稱空間(Namespace) 
–資源的實體組織方式,像是原始碼檔案、套件 (Package)等 
49
靜態方法 
•當發現到兩個程式片段極為類似: 
50
•就某些程度上,包括靜態方法的類別充當了名稱 空間 
–java.lang.Math 
–java.util.Arrays 
•當想操作的功能不渉及狀態時,可以考慮使用靜 態方法 
51
類別 
52
53
•何不將相關的狀態與操作黏在一起呢?這樣比較 容易使用些? 
54
•客戶端在使用上就容易得多了… 
•在討論物件導向時,大家總是愛談可重用性 (Reusability),然而要談到重用性的話,函式 的重用性還高上許多,在考量物件導向時,易用 性(Usability)其實才是它的重點。 
55
•檔案名稱衝突是有可能發生的 
56
•package 宣告 Account 在 tw.codedata.bank 
–如果在其他套件中使用它,必須使用類別全名 tw.codedata.bank.Account 
–Account.java 必須放置在原始碼路徑(SOURCEPATH) (可使用 javac 的 -sourcepath 指定)的 tw/codedata/bank 目錄中 
–編譯完成的 Account.class 必須放在類別路徑 (CLASSPATH)的 tw/codedata/bank 目錄中 
57
•練習 7:運用類別與套件來組織程式 
58
Gradle 與 IDE 
•基本的專案目錄結構,能不能請 Gradle 來協助建 立呢? 
•執行 gradle create-dirs,就會自動建立 src 目錄及其下各個子目錄 
59
•如果想讓你的 Gradle 專案,可以直接在 Eclipse 中進行匯入,可以在 build.gradle 中加上: 
60
•如果你想在 Eclipse 中可以直接管理相依性,或 者是執行建構任務,亦可在 Eclipse 中安裝 eclipse-integration-gradle 
61
•練習 8:安裝、使用 NetBeans 與 Gradle Plugins 
62
關於 JDBC 
•如果要想確實瞭解 Java 如何存取資料庫,學習 JDBC 確實是必要的 
63
使用 spring-jdbc 
•實際上 JDBC 撰寫來冗長且痛苦,就六個小時的 課程來說,也沒有閒功夫來做這樣的練習 
•就目前來說,如果想使用 Spring 的任何元件,必 須透過 Maven 或 Gradle 來取得相依程式庫 
•練習 9:使用 spring-jdbc 
64
使用 Servlet、JSP 開發 Web 應用程式 
•在 Java 中開發 Web 應用程式會基於 Servlet、 JSP 等標準,Servlet、JSP 必須運行於 Web 容 器(Container) 
•Web 容器簡單來說,就是個用 Java 寫的應用程 式,從 Servlet、JSP 的角度來看,就是它們唯一 認得的 Web 平台 
•只要你能提供 Web 容器作為 Servlet、JSP 運行 的平台,你的 Web 應用程式理想上就不用理會底 層實際的 HTTP 伺服器為何 
65
•編譯出來的 .class 檔案,必須放置在 Web 應用 程式目錄中的 /WEB-INF/classes/ 目錄 
•JAR 檔案必須放置在 /WEB-INF/lib/ 目錄 
•可直接被 HTTP 客戶端請求的資源(像是 HTML、 JavaScript、JSP等原始碼),則可放置在 /WEB-INF/ 以外的其他目錄。 
•Web 應用程式必須包裝為 WAR(Web Archive) 
•Web 容器如何實作有標準規範,Java 領域最常 聽到的實作之一是 Apache Tomcat 
66
•使用 Servlet 3.x,可使用標註(Annotation)來 設定 URL 模式(Pattern)等資訊 
•如果是先前的 Servlet 規範,你會需要 /WEB- INF/web.xml 來進行對應的資訊設定 
67
•雖然 Servlet 可以直接輸出呈現內容,不過設計 上,Servlet 最好只接受、驗證與轉發請求,不要 涉及呈現內容,如果要呈現內容可使用 JSP 技術 
•練習 10:使用 Servlet、JSP 
68
使用 spring-webmvc 框架 
•基於快速開發、團隊規範、第三方整合等因素, 你可能會選擇使用 Web 框架(Framework) 
•什麼是框架?它跟程式庫(Library)有何不同? 
69
程式庫 vs 框架 
•IoC(Inversion of Control) 
–流程的控制權被反轉,現在是框架在定義流程 
–在既定的流程中框架會呼叫你的函式,而不是你來呼 叫框架 
•我們需要使用框架嗎? 
–使用程式庫時,開發者會擁有較高的自由度;使用框 架時,開發者會受到較大的限制 
–是否要遵循框架規範的流程? 
–使用框架是基於技術考量? 
–還是基於商業上的考量? 
70
•練習 11:使用 spring-webmvc 
•spring-webmvc 是個支援 MVC 流程架構的框架 
71 
http://openhome.cc/Gossip/ServletJSP/Model2.html
使用 spring 相依注入 
•為了能夠使用 DvdDaoJdbcImpl,我們必須建立 DataSource 實例並進行相關設定: 
72
物件建立與相依注入 
•物件的建立與相依注入(Dependency Injection) 是我們所關心的 
•只不過當過程太過冗長,模糊了商務流程之時, 應該適當地將之分離 
73
•隨著你打算開始整合各種程式庫或方案,你會遇 到各種物件建立與相依設定需求,為此,你可能 會重構 DaoHelper,使之越來越通用 
•像是可透過組態檔來進行相依設定,甚至成為一 個通用於各式物件建立與相依設定的容器 (Container) 
•實際上,這類容器,在 Java 的世界中早已存在, 且有多樣性的選擇,你可以調查看看有哪些可以 使用,避免直接重新打造輪子。 
74
Spring 相依注入 
•Spring 本身的核心就是一個相依注入容器 
•spring-webmvc 本身就是基於 Spring 相依注入容 器而建立起來的 
•Spring 的相依注入容器,英文上也常簡稱為 DI(Dependency Injection)容器 
•更早前 Spring 採用 IoC(Inversion of Control) 容器這個名詞 
75
•Spring 的 IoC 指的是物件建立與相依設定的控制 權,由開發者手中轉換至容器身上 
•Web 框架之類的 IoC,指的是對流程的控制權, 從開發者手中轉換至框架身上 
•為了避免名詞混淆,Spring 建立使用 DI 容器來 稱呼其核心容器 
•練習 12:使用 Spring 相依注入 
76
Hibernate 與 JPA 
•物件關聯對應(Object-Relational Mapping, ORM) 
–如果設計變更,要為每個影片的導演增加更多資訊, 因而 Dvd 類別中 String 的 director,必須成為一 個 Director 型態.. 
77
•那麼你的 DvdDaoJdbcImpl 將得因為這個需求 變化而修改程式了 
•隨著後續的程式開發,這類需求不斷增加,可能 會導致這類修改不斷發生 
•你會逐漸感受到物件導向與關聯式資料庫因為模 型不匹配導致的種種問題 
–像是物件導向的繼承如何在關聯式資料庫中對應,多 型查詢如何實現等問題。 
78
•物件關聯對應(Object-Relational Mapping, ORM)解決方案 
–Hibernate 
–由於 Hibernate 廣為流行,設計方式後續影響了 EJB3 中 JPA(Java Persistence API) 規格製定 
•使用 Hibernate 這類的 ORM 方案,基本上需 要… 
–宣告物件與關聯式資料庫的對應關係 
–從物件的觀點來進行操作 
–Hibernate 會自動為你產生對應的 SQL 語句。 
79
對應關係宣告 
•hibernate.cfg.xml 
80
•Entity 宣告 
81
SessionFactory 
•可以使用 Configuration 讀取 hibernate.cfg.xml、建立 SessionFactory 物件, 後者用來建立Session 物件,負責資料庫操作過 程的功能。不過這個過程 
•建立一個 HibernateUtil 類別會比較方便一些 
82
儲存與查詢 
83 
•練習 13:使用 Hibernate
使用 spring-orm 整合 Hibernate 
•DVDLibrary 專案 
–在練習 11 時使用 spring-webmvc 框架,建立簡單的 Web 應用程式 
–在練習 12 時使用 spring 相依注入,進行依賴物件注入 
–因為接觸了 Hibernate,就整合進去吧!…XD 
•練習 14:使用 spring-orm 
84
JUnit 與 Gradle 
•在先前一連串的練習中,我們作了數次的重構 (Refactoring) 
•每次重構時是不是會有些怕怕的,如果不小心改 爛了怎麼辦? 
•每次重構完總得執行整個應用程式,看看功能是 不是正確? 
•對這種測試方式終究有些不安!? 
85
•你應該為撰寫的程式加入一些專門用的測試程式 
•在測試中最基本的單位是單元測試(Unit test), 
•測試一個工作單元(a unit of work)的行為 
–對於建築橋墩而言,一個螺絲釘、一根鋼筋、一條鋼 索甚至一公斤的水泥等,都可謂是一個工作單元 
–驗證這些工作單元行為或功能 (硬度、張力等)是否 符合預期,方可確保最後橋墩安全無虞 
•在 Java 的世界談到單元測試,基本上都得認識 一下 JUnit 這個元老級的單元測試框架 
•IDE 多半都有整合這個框架 
86
•練習 15:在 Gradle 中使用 JUnit 
87
測試與重構 DvdController 
•在瞭解如何使用 JUnit 之後,接著來試著重新做 一次 練習 14,由於時間有限,我們僅將重點放 在 DvdController 的測試與重構 
•練習 16:為 DvdController 建立測試 
•練習 17:重構與測試 DvdController 
88
REST 與 JAX-RS 
•REST 是一種軟體架構風格,全名是 REpresentational State Transfer 
–REST 的架構由客戶端(Client)/伺服端(Server)組 成 
–資源在 REST 中是可定址的(Addressed) 
–請求動作必須能表現出如何處理請求(例如 HTTP 中 的 GET、POST、PUT、DELETE 等請求) 
–回應的內容型態與資源的概念是分離的,一個資源可 以有多種內容型態來展現(狀態) 
–… 
89
•REST Triangle 中有名詞(Nouns)、動詞(Verbs) 與內容型態(Content Types) 
•分別用以代表資源獨一無二的識別、對資源進行操作 的動作,以及資源的表徵(表現方式) 
90
•以 HTTP 來說 
–URI 就是處於名詞角色,為資源定義了識別名稱 
–具有一組有限的 GET、POST、PUT 與 DELETE 等方法 來操作資源 
–可以使用 content-type 標頭來定義資源表現方式 
•這些概念與 REST 概念不謀而合,REST 架構基 於 HTTP 1.0,與 HTTP1.1 平行發展 
•符合 REST 最大實現就是 WWW,整個 Web 就 像是個狀態機,藉由連結不斷改變狀態 
•不過 REST 架構的風格與特定協定無關,雖然最 初是使用 HTTP 來描述,但不限於 HTTP。 
91
•以基本 CRUD 來說,針對 DVD 記錄而言,設計 的範例之一可以是: 
–GET /dvds/ 
–GET /dvds/1 
–GET /dvds/add 
–POST /dvds/ 
–PUT /dvds/1 
–DELETE /dvds/1 
92
•這幾個 HTTP 方法與 URI 結合的意義分別是: 
–取得 DVD 清單(從 /dvds/ 資源取得表徵) 
–取得第一筆 DVD 記錄(從 /dvds/1 資源取得表徵) 
–取得新增 DVD 的頁面(從 /dvds/add 資源取得表徵) 
–發送一筆 DVD(將資料發送至 /dvds/ 作新增) 
–推送一筆 DVD(將資料發送至 /dvds/ 作新增或更新) 
–刪除一筆 DVD(刪除 /dvds/1 資源) 
•每個 URI 代表一個可處理請求的資源,根據請求 為 GET、PUT 或 POST,就可以知道對該資源要 作什麼樣的處理 
93
•Java EE 6 起包含了對 RESful Web Service 的解 決方案 JAX-RS 
•架構於 Servlet 標準之上 
•JAX-RS 是個技術標準,各家廠商可以有自己的 實作,在練習中,會使用的實作是 Jersey 
•練習 18:使用 JAX-RS 
94
使用 Jersey 實作 MVC 
•Jersey 本身定義了一個 Viewable 類別,可以做 為請求處理方法的傳回型態 
•Viewable 的實例可以攜帶方法的執行結果,並 交由指定的畫面元件去處理,因而可用來實作 MVC/Model 2 架構 
95
•練習 19:使用 Jersey 實作 MVC/Model 2 
96
整合 Jersey/Spring/Hibernate 
•將練習 14 的成果中的 Spring MVC 換成 Jersey, 作為本課程的最後一個練習 
•練習 20:整合 Jersey/Spring/Hibernate 
97
繼續前進 
•本課程到了尾聲了 … 
•製作〈Java Tutorial〉電子書正值 JDK8 發表不 久,算算 Java 也歷經了快二十年的變遷,這麼 多年來 Java 累積的東西非常龐大 
•JDK8 又試著導入新的典範與不少的觀念 … 
•這個課程只是個簡短的生態之旅,如果你正要進 入 Java 的世界,別忘了,你的旅程才剛要開 始!… 
98

More Related Content

What's hot

Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletJustin Lin
 
Amazon RDS Proxy 집중 탐구 - 윤석찬 :: AWS Unboxing 온라인 세미나
Amazon RDS Proxy 집중 탐구 - 윤석찬 :: AWS Unboxing 온라인 세미나Amazon RDS Proxy 집중 탐구 - 윤석찬 :: AWS Unboxing 온라인 세미나
Amazon RDS Proxy 집중 탐구 - 윤석찬 :: AWS Unboxing 온라인 세미나Amazon Web Services Korea
 
아름답고 유연한 데이터 파이프라인 구축을 위한 Amazon Managed Workflow for Apache Airflow - 유다니엘 A...
아름답고 유연한 데이터 파이프라인 구축을 위한 Amazon Managed Workflow for Apache Airflow - 유다니엘 A...아름답고 유연한 데이터 파이프라인 구축을 위한 Amazon Managed Workflow for Apache Airflow - 유다니엘 A...
아름답고 유연한 데이터 파이프라인 구축을 위한 Amazon Managed Workflow for Apache Airflow - 유다니엘 A...Amazon Web Services Korea
 
[db tech showcase Tokyo 2018] #dbts2018 #D34 『サポートのトップエンジニアが語る - ワンランク上のStats...
[db tech showcase Tokyo 2018] #dbts2018 #D34 『サポートのトップエンジニアが語る - ワンランク上のStats...[db tech showcase Tokyo 2018] #dbts2018 #D34 『サポートのトップエンジニアが語る - ワンランク上のStats...
[db tech showcase Tokyo 2018] #dbts2018 #D34 『サポートのトップエンジニアが語る - ワンランク上のStats...Insight Technology, Inc.
 
Oracle WebLogic Server製品紹介資料(2020年/3月版)
Oracle WebLogic Server製品紹介資料(2020年/3月版)Oracle WebLogic Server製品紹介資料(2020年/3月版)
Oracle WebLogic Server製品紹介資料(2020年/3月版)オラクルエンジニア通信
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式Justin Lin
 
Kafka: Journey from Just Another Software to Being a Critical Part of PayPal ...
Kafka: Journey from Just Another Software to Being a Critical Part of PayPal ...Kafka: Journey from Just Another Software to Being a Critical Part of PayPal ...
Kafka: Journey from Just Another Software to Being a Critical Part of PayPal ...confluent
 
워크로드 특성에 따른 안전하고 효율적인 Data Lake 운영 방안
워크로드 특성에 따른 안전하고 효율적인 Data Lake 운영 방안워크로드 특성에 따른 안전하고 효율적인 Data Lake 운영 방안
워크로드 특성에 따른 안전하고 효율적인 Data Lake 운영 방안Amazon Web Services Korea
 
Text tagging with finite state transducers
Text tagging with finite state transducersText tagging with finite state transducers
Text tagging with finite state transducerslucenerevolution
 
Ozone: scaling HDFS to trillions of objects
Ozone: scaling HDFS to trillions of objectsOzone: scaling HDFS to trillions of objects
Ozone: scaling HDFS to trillions of objectsDataWorks Summit
 
Cognos vs Hyperion vs SSAS Comparison
Cognos vs Hyperion vs SSAS ComparisonCognos vs Hyperion vs SSAS Comparison
Cognos vs Hyperion vs SSAS ComparisonAsis Mohanty
 
Oracle Database Enterprise Edition で解決する データベースシステムの課題 (12c対応版)
Oracle Database Enterprise Edition で解決するデータベースシステムの課題 (12c対応版)Oracle Database Enterprise Edition で解決するデータベースシステムの課題 (12c対応版)
Oracle Database Enterprise Edition で解決する データベースシステムの課題 (12c対応版)オラクルエンジニア通信
 
Aurora는 어떻게 다른가 - 김일호 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
Aurora는 어떻게 다른가 - 김일호 솔루션즈 아키텍트:: AWS Cloud Track 3 GamingAurora는 어떻게 다른가 - 김일호 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
Aurora는 어떻게 다른가 - 김일호 솔루션즈 아키텍트:: AWS Cloud Track 3 GamingAmazon Web Services Korea
 
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニング
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニングしばちょう先生による特別講義! RMANバックアップの運用と高速化チューニング
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニングオラクルエンジニア通信
 
Apache Kafka at LinkedIn
Apache Kafka at LinkedInApache Kafka at LinkedIn
Apache Kafka at LinkedInGuozhang Wang
 
まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -
まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -
まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -歩 柴田
 

What's hot (20)

Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
 
Amazon RDS Proxy 집중 탐구 - 윤석찬 :: AWS Unboxing 온라인 세미나
Amazon RDS Proxy 집중 탐구 - 윤석찬 :: AWS Unboxing 온라인 세미나Amazon RDS Proxy 집중 탐구 - 윤석찬 :: AWS Unboxing 온라인 세미나
Amazon RDS Proxy 집중 탐구 - 윤석찬 :: AWS Unboxing 온라인 세미나
 
아름답고 유연한 데이터 파이프라인 구축을 위한 Amazon Managed Workflow for Apache Airflow - 유다니엘 A...
아름답고 유연한 데이터 파이프라인 구축을 위한 Amazon Managed Workflow for Apache Airflow - 유다니엘 A...아름답고 유연한 데이터 파이프라인 구축을 위한 Amazon Managed Workflow for Apache Airflow - 유다니엘 A...
아름답고 유연한 데이터 파이프라인 구축을 위한 Amazon Managed Workflow for Apache Airflow - 유다니엘 A...
 
[db tech showcase Tokyo 2018] #dbts2018 #D34 『サポートのトップエンジニアが語る - ワンランク上のStats...
[db tech showcase Tokyo 2018] #dbts2018 #D34 『サポートのトップエンジニアが語る - ワンランク上のStats...[db tech showcase Tokyo 2018] #dbts2018 #D34 『サポートのトップエンジニアが語る - ワンランク上のStats...
[db tech showcase Tokyo 2018] #dbts2018 #D34 『サポートのトップエンジニアが語る - ワンランク上のStats...
 
Oracle WebLogic Server製品紹介資料(2020年/3月版)
Oracle WebLogic Server製品紹介資料(2020年/3月版)Oracle WebLogic Server製品紹介資料(2020年/3月版)
Oracle WebLogic Server製品紹介資料(2020年/3月版)
 
Oracle GoldenGate 概要 2020年11月版
Oracle GoldenGate 概要 2020年11月版Oracle GoldenGate 概要 2020年11月版
Oracle GoldenGate 概要 2020年11月版
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
 
Kafka: Journey from Just Another Software to Being a Critical Part of PayPal ...
Kafka: Journey from Just Another Software to Being a Critical Part of PayPal ...Kafka: Journey from Just Another Software to Being a Critical Part of PayPal ...
Kafka: Journey from Just Another Software to Being a Critical Part of PayPal ...
 
Messaging in the AWS Cloud
Messaging in the AWS CloudMessaging in the AWS Cloud
Messaging in the AWS Cloud
 
워크로드 특성에 따른 안전하고 효율적인 Data Lake 운영 방안
워크로드 특성에 따른 안전하고 효율적인 Data Lake 운영 방안워크로드 특성에 따른 안전하고 효율적인 Data Lake 운영 방안
워크로드 특성에 따른 안전하고 효율적인 Data Lake 운영 방안
 
Text tagging with finite state transducers
Text tagging with finite state transducersText tagging with finite state transducers
Text tagging with finite state transducers
 
Ozone: scaling HDFS to trillions of objects
Ozone: scaling HDFS to trillions of objectsOzone: scaling HDFS to trillions of objects
Ozone: scaling HDFS to trillions of objects
 
MongoDB Overview
MongoDB OverviewMongoDB Overview
MongoDB Overview
 
Cognos vs Hyperion vs SSAS Comparison
Cognos vs Hyperion vs SSAS ComparisonCognos vs Hyperion vs SSAS Comparison
Cognos vs Hyperion vs SSAS Comparison
 
Oracle Database Enterprise Edition で解決する データベースシステムの課題 (12c対応版)
Oracle Database Enterprise Edition で解決するデータベースシステムの課題 (12c対応版)Oracle Database Enterprise Edition で解決するデータベースシステムの課題 (12c対応版)
Oracle Database Enterprise Edition で解決する データベースシステムの課題 (12c対応版)
 
Aurora는 어떻게 다른가 - 김일호 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
Aurora는 어떻게 다른가 - 김일호 솔루션즈 아키텍트:: AWS Cloud Track 3 GamingAurora는 어떻게 다른가 - 김일호 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
Aurora는 어떻게 다른가 - 김일호 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
 
Zero Data Loss Recovery Appliance 設定手順例
Zero Data Loss Recovery Appliance 設定手順例Zero Data Loss Recovery Appliance 設定手順例
Zero Data Loss Recovery Appliance 設定手順例
 
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニング
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニングしばちょう先生による特別講義! RMANバックアップの運用と高速化チューニング
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニング
 
Apache Kafka at LinkedIn
Apache Kafka at LinkedInApache Kafka at LinkedIn
Apache Kafka at LinkedIn
 
まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -
まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -
まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -
 

Viewers also liked

網站系統安全及資料保護設計認知
網站系統安全及資料保護設計認知網站系統安全及資料保護設計認知
網站系統安全及資料保護設計認知Justin Lin
 
Brig:Node.js + QML 華麗大冒險
Brig:Node.js + QML 華麗大冒險Brig:Node.js + QML 華麗大冒險
Brig:Node.js + QML 華麗大冒險Fred Chien
 
Java 基本程式設計
Java 基本程式設計Java 基本程式設計
Java 基本程式設計Brad Chao
 
Node.js中间件 connect模块深入浅出
Node.js中间件 connect模块深入浅出Node.js中间件 connect模块深入浅出
Node.js中间件 connect模块深入浅出Eric Xiao
 
TypeScript 綜合格鬥技
TypeScript 綜合格鬥技TypeScript 綜合格鬥技
TypeScript 綜合格鬥技Will Huang
 

Viewers also liked (6)

網站系統安全及資料保護設計認知
網站系統安全及資料保護設計認知網站系統安全及資料保護設計認知
網站系統安全及資料保護設計認知
 
Brig:Node.js + QML 華麗大冒險
Brig:Node.js + QML 華麗大冒險Brig:Node.js + QML 華麗大冒險
Brig:Node.js + QML 華麗大冒險
 
Java 基本程式設計
Java 基本程式設計Java 基本程式設計
Java 基本程式設計
 
Node.js中间件 connect模块深入浅出
Node.js中间件 connect模块深入浅出Node.js中间件 connect模块深入浅出
Node.js中间件 connect模块深入浅出
 
Node way
Node wayNode way
Node way
 
TypeScript 綜合格鬥技
TypeScript 綜合格鬥技TypeScript 綜合格鬥技
TypeScript 綜合格鬥技
 

Similar to Java Tutorial:Learn Java in 06:00:00

Java SE 8 技術手冊第 1 章 - Java平台概論
Java SE 8 技術手冊第 1 章 - Java平台概論Java SE 8 技術手冊第 1 章 - Java平台概論
Java SE 8 技術手冊第 1 章 - Java平台概論Justin Lin
 
2. java introduction
2. java introduction2. java introduction
2. java introductionnetdbncku
 
1, java intro
1, java intro1, java intro
1, java introted-xu
 
Java SE 7 技術手冊投影片第 01 章 - Java平台概論
Java SE 7 技術手冊投影片第 01 章 - Java平台概論Java SE 7 技術手冊投影片第 01 章 - Java平台概論
Java SE 7 技術手冊投影片第 01 章 - Java平台概論Justin Lin
 
如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scalajavatwo2011
 
Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得Weizhong Yang
 
Langchain and Azure ML and Open AI
Langchain and Azure ML and Open AILangchain and Azure ML and Open AI
Langchain and Azure ML and Open AIKo Ko
 
Serious clojurescript
Serious clojurescript Serious clojurescript
Serious clojurescript Young Lee
 
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Justin Lin
 
Spock:願你的測試長長久久、生生不息
Spock:願你的測試長長久久、生生不息Spock:願你的測試長長久久、生生不息
Spock:願你的測試長長久久、生生不息Shihpeng Lin
 
Elastic stack day-1
Elastic stack day-1Elastic stack day-1
Elastic stack day-1YI-CHING WU
 
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJava SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJustin Lin
 
flashcache原理及改造
flashcache原理及改造flashcache原理及改造
flashcache原理及改造Hao(Robin) Dong
 
如何與全世界分享你的 Library
如何與全世界分享你的 Library如何與全世界分享你的 Library
如何與全世界分享你的 LibraryMu Chun Wang
 
必备的 Java 参考资源列表
必备的 Java 参考资源列表必备的 Java 参考资源列表
必备的 Java 参考资源列表wensheng wei
 
Ch02 撰寫與設定Servlet
Ch02 撰寫與設定ServletCh02 撰寫與設定Servlet
Ch02 撰寫與設定ServletJustin Lin
 
Java Build Tool course in 2011
Java Build Tool course in 2011Java Build Tool course in 2011
Java Build Tool course in 2011Ching Yi Chan
 
淺談 Groovy 與 Gradle
淺談 Groovy 與 Gradle淺談 Groovy 與 Gradle
淺談 Groovy 與 GradleJustin Lin
 
Kubernetes project update and how to contribute
Kubernetes project update and how to contributeKubernetes project update and how to contribute
Kubernetes project update and how to contributeinwin stack
 

Similar to Java Tutorial:Learn Java in 06:00:00 (20)

Java SE 8 技術手冊第 1 章 - Java平台概論
Java SE 8 技術手冊第 1 章 - Java平台概論Java SE 8 技術手冊第 1 章 - Java平台概論
Java SE 8 技術手冊第 1 章 - Java平台概論
 
2. java introduction
2. java introduction2. java introduction
2. java introduction
 
1, java intro
1, java intro1, java intro
1, java intro
 
Java SE 7 技術手冊投影片第 01 章 - Java平台概論
Java SE 7 技術手冊投影片第 01 章 - Java平台概論Java SE 7 技術手冊投影片第 01 章 - Java平台概論
Java SE 7 技術手冊投影片第 01 章 - Java平台概論
 
如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala
 
Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得
 
Langchain and Azure ML and Open AI
Langchain and Azure ML and Open AILangchain and Azure ML and Open AI
Langchain and Azure ML and Open AI
 
Serious clojurescript
Serious clojurescript Serious clojurescript
Serious clojurescript
 
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
 
Spock:願你的測試長長久久、生生不息
Spock:願你的測試長長久久、生生不息Spock:願你的測試長長久久、生生不息
Spock:願你的測試長長久久、生生不息
 
Elastic stack day-1
Elastic stack day-1Elastic stack day-1
Elastic stack day-1
 
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJava SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
 
flashcache原理及改造
flashcache原理及改造flashcache原理及改造
flashcache原理及改造
 
如何與全世界分享你的 Library
如何與全世界分享你的 Library如何與全世界分享你的 Library
如何與全世界分享你的 Library
 
必备的 Java 参考资源列表
必备的 Java 参考资源列表必备的 Java 参考资源列表
必备的 Java 参考资源列表
 
Ch02 撰寫與設定Servlet
Ch02 撰寫與設定ServletCh02 撰寫與設定Servlet
Ch02 撰寫與設定Servlet
 
Java Build Tool course in 2011
Java Build Tool course in 2011Java Build Tool course in 2011
Java Build Tool course in 2011
 
beidakejian
beidakejianbeidakejian
beidakejian
 
淺談 Groovy 與 Gradle
淺談 Groovy 與 Gradle淺談 Groovy 與 Gradle
淺談 Groovy 與 Gradle
 
Kubernetes project update and how to contribute
Kubernetes project update and how to contributeKubernetes project update and how to contribute
Kubernetes project update and how to contribute
 

More from Justin Lin

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring BootJustin Lin
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityJustin Lin
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMailJustin Lin
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Justin Lin
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤Justin Lin
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Justin Lin
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理Justin Lin
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題Justin Lin
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步Justin Lin
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能Justin Lin
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組Justin Lin
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換Justin Lin
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構Justin Lin
 
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組Justin Lin
 
7. 例外處理
7. 例外處理7. 例外處理
7. 例外處理Justin Lin
 
6. 類別的繼承
6. 類別的繼承6. 類別的繼承
6. 類別的繼承Justin Lin
 
5. 從模組到類別
5. 從模組到類別5. 從模組到類別
5. 從模組到類別Justin Lin
 
4. 流程語法與函式
4. 流程語法與函式4. 流程語法與函式
4. 流程語法與函式Justin Lin
 
3.型態與運算子
3.型態與運算子3.型態與運算子
3.型態與運算子Justin Lin
 
1. Python起步走
1. Python起步走1. Python起步走
1. Python起步走Justin Lin
 

More from Justin Lin (20)

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構
 
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組
 
7. 例外處理
7. 例外處理7. 例外處理
7. 例外處理
 
6. 類別的繼承
6. 類別的繼承6. 類別的繼承
6. 類別的繼承
 
5. 從模組到類別
5. 從模組到類別5. 從模組到類別
5. 從模組到類別
 
4. 流程語法與函式
4. 流程語法與函式4. 流程語法與函式
4. 流程語法與函式
 
3.型態與運算子
3.型態與運算子3.型態與運算子
3.型態與運算子
 
1. Python起步走
1. Python起步走1. Python起步走
1. Python起步走
 

Java Tutorial:Learn Java in 06:00:00

  • 1. Java Tutorial 林信良 caterpillar@openhome.cc http://openhome.cc
  • 2. 課程目標 •源起 Python Tutorial •六小時課程,適合對某技術有興趣但想在短時間 內上手的開發者 •藉由六小時的課程,快速概覽某個技術的生態系 2 可以在 Google Play 或 Pubu 購買 Java Tutorial 系列文章的電子書。
  • 4. 學生? •六小時絕對不可能讓開發者完全學會某個技術, 然後用該技術飛天鑽地 •六小時目的在於介紹一個技術的輪廊,某些程度 上要呈現該技術的優良部份(The good part) •期望在六小時課程結束之後,開發者可以有個出 發點與方向,自行去參與更多的主題,研究更多 的內容 4
  • 5. 課程綱要 •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
  • 6. •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
  • 7. JDK 版本與實作 •就撰寫 Java Tutorial 時間點而言,JDK 已經歷七 個版本 •Java Tutorial 基於 Java SE 7 •Java SE 8 於 2014/03/18 釋出 •有 Oracle/Sun JDK、OpenJDK 等實作 7
  • 8. 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
  • 9. •2004 年 9 月 29 日發表了 J2SE 5.0,版號從 1.4 突增至 5.0 •主要是為了彰顯這個版本增加的重大語法以及功能 躍進 •至今常用的重大語法變化有像是泛型(Generics)、 列舉(Enum)、標註(Annotation)等,都是在這 個版本奠定 9
  • 10. •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
  • 11. •現在的 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
  • 12. JCP 與 JSR •Sun 於 1998 年組成了 JCP(Java Community Process) 開放性國際組織,讓 Java 演進過程成 為代表成員公開監督的過程 •想在未來版本 Java 中加入的功能或特性,必須 提交至 JCP 整理規範於 JSR(Java Specification Requests) •JSR 而後經過 JCP 執行委員會(Executive Committee)投票決定而成為最終標準文件,最 終的 JSR 會提供一個免費且公開原始碼的參考實 作(Reference Implementation, RI) 12
  • 13. Oracle JDK 與 OpenJDK7 •有興趣的廠商或組織也以根據 JSR 自行實現產品 •只有通過 TCK 相容性測試的實作,才可以使用 Java 這個商標 •2006 年的 JavaOne 大會上,Sun 宣告對 Java 開放原始碼,從 JDK7 b10 開始有了 OpenJDK, 並於 2009 年 4 月 15 日正式發佈 OpenJDK •Oracle 時代發佈的 JDK7 正式版本,指定了 OpenJDK7 為官方參考實作。 13
  • 14. •Sun JDK 採 JRL,而 OpenJDK7 採 GPL(帶有 GPL linking exception 的修正版本) •前者原始碼可用於個人研究使用,但禁止任何商 業用途,後者則允許商業上的使用 •OpenJDK7 必須拿掉許多在兩個授權間有衝突的 程式碼,也不包括一些部署(Deployment)工具, 有許多程式碼因授權衝突而必須拿掉 14
  • 15. •原始的 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
  • 16. OpenJDK7 與 OpenJDK6 •OpenJDK6 並不是 JDK6 的分支,而是將 OpenJDK7 中 JDK7 的特性拿掉,使之符合 JDK6 的規範 •OpenJDK6 實際上是 OpenJDK7 的分支, OpenJDK6 可以通過 JCK 相容測試 16
  • 17. •Oracle 從 2012 年 7 月以來,就打算結束對 JDK6 的支持 •JDK6 在企業間仍廣泛應用,Red Hat 於 2013 年 3 月時 宣布持有 OpenJDK6 領導權,以能持續對 OpenJDK6 發現的臭蟲與安全問題進行修補 17
  • 18. 準備課程環境 •Ubuntu 12.04 LTS •練習 0:安裝 Git 客戶端、Sublime Text 2 編輯器 •練習 1:安裝 OpenJDK 7 •練習 2:下載、安裝 Gradle 18
  • 19. 關於 Gradle •在 Java 中要開發應用程式 –必須撰寫原始碼、編譯、執行 –過程中必須指定類別路徑(Class path)、原始碼路徑 (Source path) –相關應用程式檔案必須使用工具程式建構(Build)以 完成封裝與部署(Deploy) –嚴謹的應用程式還有測試(Test)等工作階段 … •開發過程中可能是有一定且重複性的流程,因而 Java 的世界中提供有建構工具(Build tool)來輔 助開發人員 19
  • 20. •Ant(Another Neat Tool) –元老級的專案 –專案結構上有很大的彈性 –然而彈性的另一面就是鎖碎的設定 •Maven –提供預設專案及相關慣例設定 –解決程式庫或框架相依性問題 –提供了集中式貯藏室(Central repository) –(對於相依性管理問題,Ant 也結合了 Ivy 來進行解決) •Ant Ivy、Maven,主要都使用 XML 進行設定,設 定繁鎖,而且有較高的學習曲線 20
  • 21. •Gradle –結合了 Ant 與 Maven 的一些好的概念(像是 Task、 Repository 等) –Groovy 語言作為腳本設定,在設定上有了極大的簡化 –可以輕易地與 Ant、Maven 進行整合 –不少重大專案宣佈改用 Gradle 做為建構工具 •考量課程進行的簡易性,這門課中使用 Gradle 21
  • 22. 哈囉!世界! •準備「撰寫、編譯與執行」第一個 Java 程式 •練習 3:哈囉!世界! •練習 4:使用 Gradle 的哈囉!世界! 22
  • 23. 套件管理 •程式開發中會使用到程式庫,程式庫中會包括許 多類別 •為了避免彼此名稱衝突,也為了避免檔案彼此覆 蓋,Java 提到了套件(Package)來加以管理 23
  • 24. •對於一些語言中有的函式(Function),Java 可 使用靜態(static)方法定義於類別之中 •類別是作為靜態方法的名稱空間(Namespace) •除了靜態方法,也可以定義靜態變數,也就是以 類別作為名稱空間的變數 24
  • 25. 輸入輸出 •Java 的程式進入點是 public static void main(String[] args),為何這麼寫? –要給簡單答案的話「這是規定」 –main 是公開(public)方法,如此才能在其他套件中 取用 –它是靜態成員,因此 JVM 就可以在收集好命令列引數 (Command line arguments)為一個字串陣列 args 後,以 HelloWorld.main(args) 來呼叫它 25
  • 26. •輸入輸出 –可以基於串流(Stream)程式庫 –可以基於高階的 New IO 程式 – JDK7 增加 NIO2 功能 •Ubuntu 12.04 LTS 中,預設文字編碼是 UTF-8 •對於 Files.readAllLines」讀取的每一行,指定給 line 變數,然後執行迴圈內容 for(String line : Files.readAllLines(source, charset)) 26
  • 27. 例外 •Java 中對於錯誤的表示,不以某個常數來表示 •這也是程式進入點宣告為 void 的原因 •我們嘗試執行: •如果 Files.readAllLines 真的發生輸入輸出 的錯誤 27
  • 28. •當初設計 Files.readAllLines 方法時,就好 心地在方法的原始碼上聲明了,這個方法會拋出 IOException •只要查詢文件,不用看原始碼,也可以知道這個 方法會拋出什麼例外 28
  • 30. •Java 是唯一採用這種作法的語言 •Java 最常被攻訐的缺點之一,因為這必須造成語 法上的繁瑣 •在應用程式演化至一定規模時,也會遭遇到設計 上的麻煩 •與其抗拒它,不如正確地認識如何使用它 30
  • 31. 數值與字串型態 •哪些東西才是語言中重要而基本的元素呢? Pascal 之父 Niklaus E. Writh 曾說過: •對於 Java 語言講解的重點將選定在: –型態系統、變數(Variable)與運算子(Operator) –方法(Method)、類別(Class)與套件(Package) 31 Algorithms + Data Structures = Programs
  • 32. 型態系統 •雖然帶動與普及了物件導向的設計,不過 Java 本身並不是純綷的物件導向語言 •就目前版本的 Java 而言,混合了兩個型態系統: –基本型態(Primitive type) –物件型態(Object type) •在未來的版本中也許會拿掉 Java 中基本型態, 只留下物件型態 •不過現階段而言,基本型態與物件型態還是並存 的,兩種都必須瞭解 32
  • 33. 數值型態 •整數可以使用 byte(單位元組)、short(雙位 元組)、int(四位元組)與 long(八位元組) 型態 •僅寫下 1 這樣的實字(Literal),會是 int 型態 •如果想要寫下的實字是 long 型態,必須在實字 後加上 L: 33
  • 34. •超過 long 可容納範圍的數要怎麼表示? •switch 從 JDK7 開始,可以支援字串 34
  • 35. •要將基本型態包裝為物件型態,可以直接使用對 應的 Byte、Short、Integer 與 Long 包裹器 (Wrapper)類別 •在程式中寫下像是 0.3 這樣的浮點數實字,會使 用 double 型態 35
  • 36. •如果想要使用 float 型態,有兩種方式: •在數值前加上一個型態限定,通常被稱之為轉型 (CAST),實際上,這是關閉編譯器在此處的 型態檢查 •多數 CPU 與浮點運算器多採用 IEEE754 浮點數 運算(IEEE 754 floating-point arithmetic) 36
  • 37. 37
  • 39. 字元、字串型態 •在 Java 中要表示字元,必須使用單引號來包裹, 像是 'A'、'程' 就表示字元,型態是 char 基 本型態 •Java 支援 Unicode,內部實作採用 UTF-16 Big Endian,也就是說,無論中英文字元,都會使用 兩個位元組 •字串的話,Java 中使用雙引號來包裹,像是 "codedata"、"程式" 就表示字串 •Java 中的字串不可變(Immutable) 39
  • 40. 40
  • 41. •Java 中若要比較兩個基本型態,可以使用 ==, 然而要比較兩個物件的狀態是否相同,則需透過 物件上定義的 equals 方法 41
  • 42. 容器型態 •需要容量固定且有序的容器,可以使用陣列物件 •如果需要有序具索引特性的容器,且需要比陣列 擁有更多功能,可以使用 List: •可以視需求採用適當資料結構實作的物件 42 Integer[] numbers = {1, 2, 3}; List<Integer> numbers = Arrays.asList(1, 2, 3);
  • 45. Guava Collections •Java 標準 API 的容器物件,著重在功能性的定義 與實作,少於考量易用性 •Java 的世界中有不少的開放原始碼程式庫,可以 補強 Java 在這方面的不足 •在這邊使用一下 guava-libraries 的 Collections,讓需求在操作上比較方便一些 •練習 5:使用 Guava Collections 45
  • 47. 47
  • 48. •要是具備 java.lang.Iterable 行為的物件, 都可以搭配 foreach 語法 –練習 6:使用 foreach 迭代路徑 48
  • 49. 方法、類別與套件 •Java 基本上是個以物件導向為主要典範的語言 •基本上,無論採用何種典範,關鍵在於架構程式 時應思考的幾個重點,像是… –抽象層的封裝與隔離 –物件的狀態 –名稱空間(Namespace) –資源的實體組織方式,像是原始碼檔案、套件 (Package)等 49
  • 51. •就某些程度上,包括靜態方法的類別充當了名稱 空間 –java.lang.Math –java.util.Arrays •當想操作的功能不渉及狀態時,可以考慮使用靜 態方法 51
  • 53. 53
  • 55. •客戶端在使用上就容易得多了… •在討論物件導向時,大家總是愛談可重用性 (Reusability),然而要談到重用性的話,函式 的重用性還高上許多,在考量物件導向時,易用 性(Usability)其實才是它的重點。 55
  • 57. •package 宣告 Account 在 tw.codedata.bank –如果在其他套件中使用它,必須使用類別全名 tw.codedata.bank.Account –Account.java 必須放置在原始碼路徑(SOURCEPATH) (可使用 javac 的 -sourcepath 指定)的 tw/codedata/bank 目錄中 –編譯完成的 Account.class 必須放在類別路徑 (CLASSPATH)的 tw/codedata/bank 目錄中 57
  • 59. Gradle 與 IDE •基本的專案目錄結構,能不能請 Gradle 來協助建 立呢? •執行 gradle create-dirs,就會自動建立 src 目錄及其下各個子目錄 59
  • 60. •如果想讓你的 Gradle 專案,可以直接在 Eclipse 中進行匯入,可以在 build.gradle 中加上: 60
  • 61. •如果你想在 Eclipse 中可以直接管理相依性,或 者是執行建構任務,亦可在 Eclipse 中安裝 eclipse-integration-gradle 61
  • 62. •練習 8:安裝、使用 NetBeans 與 Gradle Plugins 62
  • 63. 關於 JDBC •如果要想確實瞭解 Java 如何存取資料庫,學習 JDBC 確實是必要的 63
  • 64. 使用 spring-jdbc •實際上 JDBC 撰寫來冗長且痛苦,就六個小時的 課程來說,也沒有閒功夫來做這樣的練習 •就目前來說,如果想使用 Spring 的任何元件,必 須透過 Maven 或 Gradle 來取得相依程式庫 •練習 9:使用 spring-jdbc 64
  • 65. 使用 Servlet、JSP 開發 Web 應用程式 •在 Java 中開發 Web 應用程式會基於 Servlet、 JSP 等標準,Servlet、JSP 必須運行於 Web 容 器(Container) •Web 容器簡單來說,就是個用 Java 寫的應用程 式,從 Servlet、JSP 的角度來看,就是它們唯一 認得的 Web 平台 •只要你能提供 Web 容器作為 Servlet、JSP 運行 的平台,你的 Web 應用程式理想上就不用理會底 層實際的 HTTP 伺服器為何 65
  • 66. •編譯出來的 .class 檔案,必須放置在 Web 應用 程式目錄中的 /WEB-INF/classes/ 目錄 •JAR 檔案必須放置在 /WEB-INF/lib/ 目錄 •可直接被 HTTP 客戶端請求的資源(像是 HTML、 JavaScript、JSP等原始碼),則可放置在 /WEB-INF/ 以外的其他目錄。 •Web 應用程式必須包裝為 WAR(Web Archive) •Web 容器如何實作有標準規範,Java 領域最常 聽到的實作之一是 Apache Tomcat 66
  • 67. •使用 Servlet 3.x,可使用標註(Annotation)來 設定 URL 模式(Pattern)等資訊 •如果是先前的 Servlet 規範,你會需要 /WEB- INF/web.xml 來進行對應的資訊設定 67
  • 68. •雖然 Servlet 可以直接輸出呈現內容,不過設計 上,Servlet 最好只接受、驗證與轉發請求,不要 涉及呈現內容,如果要呈現內容可使用 JSP 技術 •練習 10:使用 Servlet、JSP 68
  • 69. 使用 spring-webmvc 框架 •基於快速開發、團隊規範、第三方整合等因素, 你可能會選擇使用 Web 框架(Framework) •什麼是框架?它跟程式庫(Library)有何不同? 69
  • 70. 程式庫 vs 框架 •IoC(Inversion of Control) –流程的控制權被反轉,現在是框架在定義流程 –在既定的流程中框架會呼叫你的函式,而不是你來呼 叫框架 •我們需要使用框架嗎? –使用程式庫時,開發者會擁有較高的自由度;使用框 架時,開發者會受到較大的限制 –是否要遵循框架規範的流程? –使用框架是基於技術考量? –還是基於商業上的考量? 70
  • 71. •練習 11:使用 spring-webmvc •spring-webmvc 是個支援 MVC 流程架構的框架 71 http://openhome.cc/Gossip/ServletJSP/Model2.html
  • 72. 使用 spring 相依注入 •為了能夠使用 DvdDaoJdbcImpl,我們必須建立 DataSource 實例並進行相關設定: 72
  • 73. 物件建立與相依注入 •物件的建立與相依注入(Dependency Injection) 是我們所關心的 •只不過當過程太過冗長,模糊了商務流程之時, 應該適當地將之分離 73
  • 74. •隨著你打算開始整合各種程式庫或方案,你會遇 到各種物件建立與相依設定需求,為此,你可能 會重構 DaoHelper,使之越來越通用 •像是可透過組態檔來進行相依設定,甚至成為一 個通用於各式物件建立與相依設定的容器 (Container) •實際上,這類容器,在 Java 的世界中早已存在, 且有多樣性的選擇,你可以調查看看有哪些可以 使用,避免直接重新打造輪子。 74
  • 75. Spring 相依注入 •Spring 本身的核心就是一個相依注入容器 •spring-webmvc 本身就是基於 Spring 相依注入容 器而建立起來的 •Spring 的相依注入容器,英文上也常簡稱為 DI(Dependency Injection)容器 •更早前 Spring 採用 IoC(Inversion of Control) 容器這個名詞 75
  • 76. •Spring 的 IoC 指的是物件建立與相依設定的控制 權,由開發者手中轉換至容器身上 •Web 框架之類的 IoC,指的是對流程的控制權, 從開發者手中轉換至框架身上 •為了避免名詞混淆,Spring 建立使用 DI 容器來 稱呼其核心容器 •練習 12:使用 Spring 相依注入 76
  • 77. Hibernate 與 JPA •物件關聯對應(Object-Relational Mapping, ORM) –如果設計變更,要為每個影片的導演增加更多資訊, 因而 Dvd 類別中 String 的 director,必須成為一 個 Director 型態.. 77
  • 78. •那麼你的 DvdDaoJdbcImpl 將得因為這個需求 變化而修改程式了 •隨著後續的程式開發,這類需求不斷增加,可能 會導致這類修改不斷發生 •你會逐漸感受到物件導向與關聯式資料庫因為模 型不匹配導致的種種問題 –像是物件導向的繼承如何在關聯式資料庫中對應,多 型查詢如何實現等問題。 78
  • 79. •物件關聯對應(Object-Relational Mapping, ORM)解決方案 –Hibernate –由於 Hibernate 廣為流行,設計方式後續影響了 EJB3 中 JPA(Java Persistence API) 規格製定 •使用 Hibernate 這類的 ORM 方案,基本上需 要… –宣告物件與關聯式資料庫的對應關係 –從物件的觀點來進行操作 –Hibernate 會自動為你產生對應的 SQL 語句。 79
  • 82. SessionFactory •可以使用 Configuration 讀取 hibernate.cfg.xml、建立 SessionFactory 物件, 後者用來建立Session 物件,負責資料庫操作過 程的功能。不過這個過程 •建立一個 HibernateUtil 類別會比較方便一些 82
  • 83. 儲存與查詢 83 •練習 13:使用 Hibernate
  • 84. 使用 spring-orm 整合 Hibernate •DVDLibrary 專案 –在練習 11 時使用 spring-webmvc 框架,建立簡單的 Web 應用程式 –在練習 12 時使用 spring 相依注入,進行依賴物件注入 –因為接觸了 Hibernate,就整合進去吧!…XD •練習 14:使用 spring-orm 84
  • 85. JUnit 與 Gradle •在先前一連串的練習中,我們作了數次的重構 (Refactoring) •每次重構時是不是會有些怕怕的,如果不小心改 爛了怎麼辦? •每次重構完總得執行整個應用程式,看看功能是 不是正確? •對這種測試方式終究有些不安!? 85
  • 86. •你應該為撰寫的程式加入一些專門用的測試程式 •在測試中最基本的單位是單元測試(Unit test), •測試一個工作單元(a unit of work)的行為 –對於建築橋墩而言,一個螺絲釘、一根鋼筋、一條鋼 索甚至一公斤的水泥等,都可謂是一個工作單元 –驗證這些工作單元行為或功能 (硬度、張力等)是否 符合預期,方可確保最後橋墩安全無虞 •在 Java 的世界談到單元測試,基本上都得認識 一下 JUnit 這個元老級的單元測試框架 •IDE 多半都有整合這個框架 86
  • 87. •練習 15:在 Gradle 中使用 JUnit 87
  • 88. 測試與重構 DvdController •在瞭解如何使用 JUnit 之後,接著來試著重新做 一次 練習 14,由於時間有限,我們僅將重點放 在 DvdController 的測試與重構 •練習 16:為 DvdController 建立測試 •練習 17:重構與測試 DvdController 88
  • 89. REST 與 JAX-RS •REST 是一種軟體架構風格,全名是 REpresentational State Transfer –REST 的架構由客戶端(Client)/伺服端(Server)組 成 –資源在 REST 中是可定址的(Addressed) –請求動作必須能表現出如何處理請求(例如 HTTP 中 的 GET、POST、PUT、DELETE 等請求) –回應的內容型態與資源的概念是分離的,一個資源可 以有多種內容型態來展現(狀態) –… 89
  • 90. •REST Triangle 中有名詞(Nouns)、動詞(Verbs) 與內容型態(Content Types) •分別用以代表資源獨一無二的識別、對資源進行操作 的動作,以及資源的表徵(表現方式) 90
  • 91. •以 HTTP 來說 –URI 就是處於名詞角色,為資源定義了識別名稱 –具有一組有限的 GET、POST、PUT 與 DELETE 等方法 來操作資源 –可以使用 content-type 標頭來定義資源表現方式 •這些概念與 REST 概念不謀而合,REST 架構基 於 HTTP 1.0,與 HTTP1.1 平行發展 •符合 REST 最大實現就是 WWW,整個 Web 就 像是個狀態機,藉由連結不斷改變狀態 •不過 REST 架構的風格與特定協定無關,雖然最 初是使用 HTTP 來描述,但不限於 HTTP。 91
  • 92. •以基本 CRUD 來說,針對 DVD 記錄而言,設計 的範例之一可以是: –GET /dvds/ –GET /dvds/1 –GET /dvds/add –POST /dvds/ –PUT /dvds/1 –DELETE /dvds/1 92
  • 93. •這幾個 HTTP 方法與 URI 結合的意義分別是: –取得 DVD 清單(從 /dvds/ 資源取得表徵) –取得第一筆 DVD 記錄(從 /dvds/1 資源取得表徵) –取得新增 DVD 的頁面(從 /dvds/add 資源取得表徵) –發送一筆 DVD(將資料發送至 /dvds/ 作新增) –推送一筆 DVD(將資料發送至 /dvds/ 作新增或更新) –刪除一筆 DVD(刪除 /dvds/1 資源) •每個 URI 代表一個可處理請求的資源,根據請求 為 GET、PUT 或 POST,就可以知道對該資源要 作什麼樣的處理 93
  • 94. •Java EE 6 起包含了對 RESful Web Service 的解 決方案 JAX-RS •架構於 Servlet 標準之上 •JAX-RS 是個技術標準,各家廠商可以有自己的 實作,在練習中,會使用的實作是 Jersey •練習 18:使用 JAX-RS 94
  • 95. 使用 Jersey 實作 MVC •Jersey 本身定義了一個 Viewable 類別,可以做 為請求處理方法的傳回型態 •Viewable 的實例可以攜帶方法的執行結果,並 交由指定的畫面元件去處理,因而可用來實作 MVC/Model 2 架構 95
  • 96. •練習 19:使用 Jersey 實作 MVC/Model 2 96
  • 97. 整合 Jersey/Spring/Hibernate •將練習 14 的成果中的 Spring MVC 換成 Jersey, 作為本課程的最後一個練習 •練習 20:整合 Jersey/Spring/Hibernate 97
  • 98. 繼續前進 •本課程到了尾聲了 … •製作〈Java Tutorial〉電子書正值 JDK8 發表不 久,算算 Java 也歷經了快二十年的變遷,這麼 多年來 Java 累積的東西非常龐大 •JDK8 又試著導入新的典範與不少的觀念 … •這個課程只是個簡短的生態之旅,如果你正要進 入 Java 的世界,別忘了,你的旅程才剛要開 始!… 98