Más contenido relacionado
La actualidad más candente (20)
Similar a Java Tutorial:Learn Java in 06:00:00 (20)
Java Tutorial:Learn Java in 06:00:00
- 2. 課程目標
•源起 Python Tutorial
•六小時課程,適合對某技術有興趣但想在短時間 內上手的開發者
•藉由六小時的課程,快速概覽某個技術的生態系
2
可以在 Google Play 或 Pubu 購買 Java Tutorial 系列文章的電子書。
- 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
- 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
- 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
- 36. •如果想要使用 float 型態,有兩種方式:
•在數值前加上一個型態限定,通常被稱之為轉型 (CAST),實際上,這是關閉編譯器在此處的 型態檢查
•多數 CPU 與浮點運算器多採用 IEEE754 浮點數 運算(IEEE 754 floating-point arithmetic)
36
- 39. 字元、字串型態
•在 Java 中要表示字元,必須使用單引號來包裹, 像是 'A'、'程' 就表示字元,型態是 char 基 本型態
•Java 支援 Unicode,內部實作採用 UTF-16 Big Endian,也就是說,無論中英文字元,都會使用 兩個位元組
•字串的話,Java 中使用雙引號來包裹,像是 "codedata"、"程式" 就表示字串
•Java 中的字串不可變(Immutable)
39
- 45. Guava Collections
•Java 標準 API 的容器物件,著重在功能性的定義 與實作,少於考量易用性
•Java 的世界中有不少的開放原始碼程式庫,可以 補強 Java 在這方面的不足
•在這邊使用一下 guava-libraries 的 Collections,讓需求在操作上比較方便一些
•練習 5:使用 Guava Collections
45
- 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
- 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
- 69. 使用 spring-webmvc 框架
•基於快速開發、團隊規範、第三方整合等因素, 你可能會選擇使用 Web 框架(Framework)
•什麼是框架?它跟程式庫(Library)有何不同?
69
- 70. 程式庫 vs 框架
•IoC(Inversion of Control)
–流程的控制權被反轉,現在是框架在定義流程
–在既定的流程中框架會呼叫你的函式,而不是你來呼 叫框架
•我們需要使用框架嗎?
–使用程式庫時,開發者會擁有較高的自由度;使用框 架時,開發者會受到較大的限制
–是否要遵循框架規範的流程?
–使用框架是基於技術考量?
–還是基於商業上的考量?
70
- 72. 使用 spring 相依注入
•為了能夠使用 DvdDaoJdbcImpl,我們必須建立 DataSource 實例並進行相關設定:
72
- 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
- 84. 使用 spring-orm 整合 Hibernate
•DVDLibrary 專案
–在練習 11 時使用 spring-webmvc 框架,建立簡單的 Web 應用程式
–在練習 12 時使用 spring 相依注入,進行依賴物件注入
–因為接觸了 Hibernate,就整合進去吧!…XD
•練習 14:使用 spring-orm
84
- 85. JUnit 與 Gradle
•在先前一連串的練習中,我們作了數次的重構 (Refactoring)
•每次重構時是不是會有些怕怕的,如果不小心改 爛了怎麼辦?
•每次重構完總得執行整個應用程式,看看功能是 不是正確?
•對這種測試方式終究有些不安!?
85
- 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
- 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
- 98. 繼續前進
•本課程到了尾聲了 …
•製作〈Java Tutorial〉電子書正值 JDK8 發表不 久,算算 Java 也歷經了快二十年的變遷,這麼 多年來 Java 累積的東西非常龐大
•JDK8 又試著導入新的典範與不少的觀念 …
•這個課程只是個簡短的生態之旅,如果你正要進 入 Java 的世界,別忘了,你的旅程才剛要開 始!…
98