1. 程式人生 > >O'Reilly Java系列書籍建議閱讀順序(轉自蔡學庸)

O'Reilly Java系列書籍建議閱讀順序(轉自蔡學庸)

Learning Java the O'Reilly's Way (Part I)

Java 技術可以說是越來越重要了,不但可以用在計算機上,甚至連電視等家電用品,行動電話、個人數字助理(PDA)等電子產品,以及智慧卡都可以透過 Java 的技術來為人們創造更便利的生活。許多人因此對 Java 感興趣,想好好學習 Java。

因為講授 Java 課程的關係,這幾年來,不少人問我:怎樣才能學好 Java,我給他們的建議很簡單 ---『多讀 Java 的好書,可以有系統又輕易地獲得許多高手的經驗』。其實,我說的也是我自己的經驗。

『那麼,要看什麼書呢?』我知道你會這麼問。畢竟書店裡 Java 的書琳琅滿目、怎樣從其中選出一本最適合自己的好書,絕對不是一件容易的事。在建議您看什麼 Java 書籍之前,讓我先為大家做一些簡單的分析比較。我認為,Java 原文書可以概略地分成兩種:

「主題廣泛」型:這類的書經常上千頁,厚厚的一本,裡面什麼主題都有。
「主題專一」型:這類的書通常薄薄的一本,少於五百頁,內容只專注在某特定主題。
「主題廣泛」型的書,優點是可以讓你一次學會很多名詞和大概的觀念,可是什麼都只是淺談即止,不夠深入。 不都說「樣樣通、樣樣鬆」麼!還真是有道理。

「主題專一」型的書就不一樣了,內容只設定在一個主題,此主題不相關的內容一概不談(或者只是概略地一提)。 這兩類的書各有優缺點,選擇哪一種端看您的需求而定。不過,我自己偏好「主題專一」的書,原因是這類的書有下面的好處:

內容深入:你真的相信「21 Days」就可以學通 Java?(我還看過一本書更誇張的,書名上有聳動的「24 Hours」字樣。)如果這樣的話,Java大師就滿街跑了。多讀一些 深入的內容,你才有可能超越別人。你可能認為:『我不過是剛入門的初學者,需要知道 Java 廣泛的知識,而非深入的知識,所以看「主題廣泛」型的 Java書有何不可?』 唔!話說得沒錯,但我認為這些簡介性的知識在許多地方都可輕易取得(特別是在

http://www.javasoft.com/),實在不需要去買一本 一千多頁的原文書來 K, 現在的原文書也挺貴的,錢可要花在刀口上。

主題屬性適合:如果只想學 Java 的網路設計,你當然不會去買一本大堆頭的書,其中涉及網路的部分只有區區 50 頁,看完之後依舊懵懵懂懂。你應該去買一本 500頁,由淺而深,內容完全涵蓋所有 Java 網路相關議題的書,看完這樣的書,你差不多也可以算是 Java 網路專家了。有了「主題專一」的書,你就可以不必去買一本 95% 的內容對你沒幫助的書。你可以想學什麼,就挑什麼。

新版本推出較快:Java 逐年在改版,書的內容也會跟著翻新,通常「主題專一」型的書比較能快速且完整地反應技術的改變。

許多出版社都有主題專一的 Java 系列,但其中規劃最完整、內容最受肯定的就非 O'Reilly 的「 The Java Series」莫屬了(可能和他們請了一個優秀的 Java 編輯有關)。 你可以到國外許多線上買書的網站上看看大家對於 O'Reilly「 The Java Series」的評價,就會知道我所言不假。

目前, O'Reilly Java 系列的書共有約二十(還在增加當中),我差不多全買齊了,雖然花了不少錢,但是值得。如果你認真的想學習 Java,我向您推薦 O'Reilly 的「 The Java Series」。套句傅培梅的廣告詞「教人 Java 三四年,這是我用過最理想的書」。

在後續的文章,我將陸續為大家介紹 O'Reilly Java 系列的每一本書。

Learning Java the O'Reilly's Way (Part II)

Java in a Nutshell A Desktop Quick Reference

O'Reilly 的「in a Nutshell」系列書籍向來以簡潔、不拖泥帶水著稱,常常一兩頁的內容可以抵得過其它書籍十多頁的篇幅,在計算機書籍內容灌水風氣盛行的今天,O'Reilly 的「in a Nutshell」系列可以算是個異數。「in a Nutshell」系列的每本書雖然薄,但該說的內容一件不少。除了簡潔之外,「in a Nutshell」還有一個特色,就是同時具備 入門學習和參考查閱的雙重功效。書的內容包含兩部分,前面的部分是深入淺出的入門教學,後面的部分是參考資料。

《Java in a Nutshell》第一版是 O'Reilly「in a Nutshell」系列的第一本,目前本書最新的版本是第二版。《Java in a Nutshell》第二版厚度約共六百頁,前面的223頁是入門 教學,後面的部分是參考手冊。如果,你能把本書前面薄薄的223頁讀懂,你的 Java 內功就會十分紮實。

C/C++ 和 Java 在語言上有許多相似性,所以 C/C++ 的程式設計師想跨入 Java 的領域比其它語言的使用者佔了許多便宜。讓我打個比方:C/C++ 的程式設計師只消翻過一道矮牆就可以從 C/C++ 的王國進入 Java 的領域。對於已經熟悉 C/C++ 的程式設計師來說,他們最希望能有 Java 書籍直接告訴他們 C/C++ 和 Java之間大大小小的差異,來讓他們快速地將他們所慣用的 C/C++ 思維轉成 Java 的思考方式,《Java in a Nutshell》正是這樣的一本書。雖然後來有不少書籍也定位成 C/C++ 的程式設計師快速學習 Java 的書,但都沒有《Java in a Nutshell》寫得精彩完整而小巧。

在寫 Java 程式的過程中,免不了要查一些資料,特別是API的用法,這時候,你會發現《Java in a Nutshell》後半部三百多頁的參考資料超乎想象地好用,在良好的編排以及索引 的引導之下,你可以輕鬆地查到你需要的資料。

本書後半部的參考資料部分有兩種查閱方式,方法一是透過 package 找 class,再透過 class 找 method或 field,這部分的參考資料在第十七章到第三十二章,通常使用這種方法 的人對於他所欲查詢的 API已經有了大概的預期;方法二是完全沒有概念時,直接透過第三十三章的字母排列方式找到他所欲查的資料,之後再透過方法一來找到詳細的說明。

以前,《Java in a Nutshell》一書是許多人寫 Java 程式時必備的速查手冊,但現在因為許多 Java 開發工具都提供了方便的線上輔助工具,比方說:Borland JBuilder 可以透過 sensitive help(也就是F1按鍵)來找到你感興趣的 API、或透過 Code Inside 之類的神奇功能來提示你某 API 的用法、或透過線上檔案(支援hyper-link)來互動查閱,所以現在《Java in a Nutshell》的參考手冊的地位已經不再像以前那般地重要了。

本書在 Java 書籍中已經建立了權威的地位,一提起 Java 的好書,大家第一本想到的就是本書,在 Java書籍氾濫的今天,要寫出一本這樣令大家共同推崇的書實在不容易,而 這也是我對本書作者 David Flanagan 至感欽佩的地方。有讀者說:『Flanagan 唯一的缺點是---寫的書還不夠多』。這真是對一個作家最極至的讚美。

為了達到精簡的目的,內容就必須有所取捨,不能大小通吃。比方說,本書就只包含 core API,對於standard extension API(也就是javax package)則完全略去,而 core API 中也有少數的 package 被捨棄在外(作者打算另外寫一本《Java Enterprise in a Nutshell》來容納部分本書未包含的內容)。

同樣為了精簡的目的,本書相當缺乏完整的程式範例,作者另外寫了一本《Java Examples in a Nutshell》來彌補這項不足。《Java Examples in a Nutshell》的程式範例之多, 媲美 The Waite Group 出版的《Java How-to》。我在後續的文章會介紹到《Java Examples in a Nutshell》。

評書的好壞時,不宜討論到書的價錢,但我實在忍不住要說:這本書的定價實在便宜得誇張,只需美金19.95。如果你常買資訊類原文書的話,你會發現大部分的書都是 30 到 60 美金,而且在這些高價位的書籍當中不乏爛書,這更襯托出《Java in a Nutshell》這本書實在「俗擱大碗」。其實,《Java in a Nutshell》就算賣三四倍的價錢我還是 會乖乖掏出錢來買的。

儘管這是一本好書,不過我還是要提醒各位讀者,如果你沒有 C/C++ 的背景,就想透過本書來學習Java 的話,恐怕你會鎩羽而歸。在本系列後續的文章中,我會介紹一本不要求讀者具備 C/C++ 背景的 Java 入門書。

Learning Java the O'Reilly's Way (Part III)

Java Examples in a Nutshell

許多程式設計初學者常有的困擾是:即使查到 API 的用法,也不知道怎麼樣將這些 API 兜在一起寫出想要的程式。其實,個別的 API 作用有限,如何將數個 API 結合起來解決問題才是學習程式設計的重點。對於許多人來說,有一本範例豐富的書可以觀摩學習,這比什麼都來得重要,也因此,以範例為導向的書向來頗受好評。《Java Examples In a Nutshell》正是這樣的一本書。

隔了整整三年,《Java Examples in a Nutshell》一書終於推出第二版。新版本涵蓋 JDK 1.3,比起前一個版本多出近六十個主題,共有約一百六十個主題。依據屬性,本書內容分成三部份,分別是「Part I:Core Java APIs」、「Part II:Graphics and GUIs」、「Part III:Enterprise Java」,這三部份剛好涵蓋了「Java 基礎」、「JFC」、以及「Enterprise Java」三大領域,所以此書可以視為《Java in a Nutshell》、《Java Foundation Classes in a Nutshell》以及《Java Enterprise in a Nutshell》的範例教學版本。

此版本和前一版比較大的差異是:

大幅改寫安全和加密的部分,因為 Java 在此領域有了不小的變動。l
新增對 GUI 的基本介紹l
繪圖的部分以 Java 2Dl 為主軸全部改寫。
新增列印的部分l
新增「data transfer」的部分(包括 copy-paste 以及l drag-and-drop)
新增 Servlet 和 JSPl
新增 XML 的部分(包括 SAX、DOM、JAXP、JDOM)l

舊章節的重新安排和改寫,以及新章節的加入,使得本書比起第一版更有條理,適合一章一章地循序閱讀。除了一般的索引之外,本書第二十章還特別編排了「範例索引」,可用來快速地查閱到需要的範例。本書章標題條列如下:

PART 1: Core Java APIs
Chapter 1. Java Basics
Chapter 2. Objects, Classes, and Interfaces
Chapter 3. Input/Output
Chapter 4. Threads
Chapter 5. Networking
Chapter 6. Security and Cryptography
Chapter 7. Internationalization
Chapter 8. Reflection
Chapter 9. Object Serialization

PART 2: Graphics and GUIs
Chapter 10. Graphical User Interfaces
Chapter 11. Graphics
Chapter 12. Printing
Chapter 13. Data Transfer
Chapter 14. JavaBeans
Chapter 15. Applets

PART 3: Enterprise Java
Chapter 16. Remote Method Invocation
Chapter 17. Database Access with SQL
Chapter 18. Servlets and JSP
Chapter 19. XML
Chapter 20. Example Index

「Part I」對於 Java 語言基礎與重要的 API 有很精簡的介紹。如果你具有豐富的程式經驗,你甚至不需要會 Java 語言,就可以直接透過 Part I 的範例來學會 Java。

「Part II」對於 GUI 程式設計的介紹很精簡。本書對 Java 2D 的介紹或許對許多讀者來說已經夠用,但是本書對 Swing 的介紹絕對不夠,畢竟 Swing 是個超級大的主題。

「Part III」是 J2EE 的部分。可惜的是沒有介紹 Enterprise JavaBeans(EJB)。比較特別的是,本書有一章介紹了 Java 的 XML 程式設計。

「學一個東西最好的方法就是去用它」。本書有許多範例程式,都是相當精簡而具代表性的。如果你是初學者,本書可以讓你邊做邊學,學習效果加倍。即使你不是 Java 初學者,本書也可以提供你速查的功用。以我的經驗來說,我懂得 RMI,但是我不可能將 RMI 的程式細節一一記在腦海中,當我要寫 RMI 程式時, 我會翻出此書第十六章 RMI 的部分,看看書上詳細的作法。

本書也相當適合當作 Java 課程的輔助教材,每個單元后面都有幾道程式習題,書上或 O'Reilly 網站上沒有這些習題的解答,所以這些習題可供教師當作學生的作業,也可以當作自我練習的題材。

依照 O'Reilly 的慣例,除了極少數的例外,書一律不附光碟片或磁碟,本書也是如此。這雖然會造成部分讀者的不便,但其實也有不少好處。通常附上光碟片的書成本提高,售價也會提高;而且 O'Reilly 的網站上都會免費提供相關程式或資料的下載,用下載的方式可以確保讀者們取得的程式和資料是最新版本的。以本書來說,我建議各位善用此資源下載程式回來,因為本書中的程式範例相當具代表性,常常只需要做小部分的修改就能符合自己所需,如果能有原始碼的檔案就可以透過 copy-paste-modify 的方式省下不少敲鍵盤的時間。

Learning Java the O'Reilly's Way (Part IV)
Exploring Java, 2nd Edition (本書的第三版,改名為 Learning Java)
O'Reilly 的 Java 入門書有兩本,一本是《Java in a Nutshell》,另一本是《Exploring Java》。O'Reilly 的 Java 系列書籍在出版前就已經做了良好的規劃,所以 雖然《Java in a Nutshell》和《Exploring Java》都是 Java 入門書,但定位卻截然不同。《Java in a Nutshell》定位為「讓 C/C++ 程式設計師快速學會 Java,且可以當作 API 速查手冊」的書;而《Exploring Java》則是定位成「一般的入門書,不限定讀者的背景」。

《Java in a Nutshell》比較著重在 Java 語言教學和 Java 語言相關特色的描述,許多常用的 API 都沒提到,所以許多人讀完《Java in a Nutshell》之後只知道自己學會 Java 語言了,但是還是寫不出 Java 程式。我認為這樣的讀者應該在讀完《Java in a Nutshell》之後,開始閱讀《Exploring Java》。《Exploring Java》介紹了許多常用的 API(比方說: java.awt、java.io、java.rmi、java.net、java.util),這些 API 都是每個 Java 程式設計師必須知道的。在閱讀完《Exploring Java》之後,你差不多就可以寫出 大部分的程式,《Exploring Java》可以讓你對 Java 有一個整體的概念。有了《Java in a Nutshell》和《Exploring Java》的基礎之後,設計程式如果遇到更深入或更專門的問題 ,你可以去查閱 O'Reilly 的其它 Java 書籍。

本書內容包含相當廣,下面列出本書的內容大綱:

Chapter 1. Yet Another Language:介紹 Java 的基本概念、優點、和用途。
Chapter 2. A First Applet:一個簡單的 applet範例
Chapter 3. Tools of the Trade:介紹 Java 直譯器、類別路徑、編譯器、Applet 在 HTML 的用法、JAR、安全性
Chapter 4. The Java Language:說明 Java 的基本型態、語法、例外處理、陣列 … 等。
Chapter 5. Objects in Java:Java 的類別和物件
Chapter 6. Relationships Between Classes:說明繼承、介面、Inner Class … 等主題
Chapter 7. Working with Objects and Classes:說明 Reflection 的相關主題
Chapter 8. Threads:介紹執行緒和相關的主題
Chapter 9. Basic Utility Classes:介紹一些常用的輔助列別
Chapter 10. Input/Output Facilities:介紹stream的觀念和用法,幷包括檔案、Serialization、資料壓縮等主題。
Chapter 11. Network Programming with Sockets and RMI:包括了TCP/UDP Socket,RMI等主題。
Chapter 12. Working with URLs:包括了URL、Content Handler、Protocol Handler等主題。
Chapter 13. The Abstract Window Toolkit:介紹Component、Container、Lightweight Component的觀念;說明Applet和AWT的關係;介紹Java Event Model。
Chapter 14. Creating GUI Components:介紹AWT常用的元件
Chapter 15. Layout Managers:介紹AWT的Layout Manager,也說明如何設計出自己的Layout Manager。
Chapter 16. Drawing with AWT:利用AWT來繪圖
Chapter 17. Working with Images:利用AWT來進行影像處理
Chapter 18. Java Beans:基本JavaBeans的觀念
本書用了相當多篇幅介紹 AWT,甚至連許多 AWT 進階用法都講得很詳細,所以如果你有了本書,你就不太需要購買 O'Reilly 的《Java AWT Reference》了。

本書有一些小缺點,包括了:

少部分內容過時:雖然本書內容大致上沒問題,但它畢竟是兩年前出版的書,所以少部分資訊已經過時了,比方說:執行緒、java.util 等。目前,第三版正由 Jonathan Knudsen 撰寫中。Jonathan Knudsen 稱得上是 Java 的全才型作家,不管是 Java 2D 圖學技術、Java 密碼學、JavaSound、Java AWT/Swing…等多種不同領域他都相當專精。 目前他也為 O'Reilly 美國網站撰寫「Byte-Size Java」專欄,我的「啜飲 Java 系列」正是翻譯自他的文章。我相當喜愛他的作品,也希望他的《Exploring Java 3rd Ed》早日問世。
雖然《Exploring Java》定位成「一般的入門書,不限定讀者的背景」。不過,以《Exploring Java》的撰寫方式來看,我認為讀者必須要有程式設計背景(可以是 BASIC 、Pascal、C/C++…)和物件導向基本概念,否則這本書還是太難。
範例都是片片斷斷的,無法讓讀者對整體有良好的認識。
贅詞太多,不像《Java in a Nutshell》的簡潔。
雖然有一些缺點,但是瑕不掩瑜。我正期待下一版的早日出現,也希望下一版夠把那些討論 AWT 的篇幅留給 Swing。


Learning Java the O'Reilly's Way (Part V)

Java Threads, 2nd Ed.

在 Windows 程式設計中,不是每個程式設計師都需要使用到執行緒,但對 Java 的程式設計師來說,想寫出一個真正的 Java 程式(那些交作業用的小程式不算),幾乎都會用到執行緒。執行緒之所以在 Windows 和 Java 中的重要性不同,原因有二:

· Windows 的 event-driven 方式和 Java 的 event model 不同: Windows 提供許多 non-blocking API、call-back function 機制;而 Java 的 API 都是 blocking 形式的,如果不想阻礙程式的進行,就必須使用執行緒。

· Windows 可以設定 timer(WM_TIMER 訊息),但 Java 不支援 timer ,必須利用執行緒來模擬 timer 。

除此之外,下面列出兩點也需要使用執行緒的時機:

某件工作如果獨立而冗長,使用執行緒可以讓使用者可以不用枯候,甚至有可能提升執行效率。

使用平行演算法時,也需要使用執行緒。

因為執行緒對 Java 來說實在太重要了,所以 Java 程式設計師有必要徹底瞭解執行緒的一切,才能駕馭得當。對 Java 執行緒說明得最完整而清楚的書,正是 Scott Oaks 和 Henry Wong 所合著的《Java Threads》。(注:其實由 Addison-Wesley 所出版, Doug Lea 所著的《Concurrent Programming in Java》也相當不錯,可惜寫得相當難懂,而且沒有推出新版本。)

許多人認為執行緒很難,其實不然。「緒可敘,非常序」,教導執行緒時,正確的順序很重要,否則讀者可能會懵懵懂懂、一知半解。我認為《Java Threads》在這方面做得很好,它以循序漸進、引導的方式教導讀者執行緒的正確使用方式,所以即使讀者原本對執行緒一點概念都沒有,也能輕易地閱讀並理解其內容。 下面列出此書的大綱和順序:

第一章,Introduction to Threading:簡單地介紹 thread。
第二章,The Java Threading API:介紹 Java 最基本的 thread API。
第三章,Synchronization Techniques:介紹多執行緒時要注意的同步化問題。
第四章,Wait and Notify:如何善用 wait() 和 notify() 來避免 busy waiting。
第五章,Useful Examples of Java Thread Programming:透過幾個範例程式讓你能體會執行緒的使用方式。
第六章,Java Thread Scheduling:自行控制執行緒的排程方式。
第七章,Java Thread Scheduling Examples:執行緒排程的範例。
第八章,Advanced Synchronization Topics:如何避免 deadlock、starvation ,如何設計出 thread-safe 的類別。
第九章,Parallelizing for Multiprocessor Machines:在多 CPU 的機器上,執行緒的相關問題。
第十章,Thread Groups:如何利用 Thread Group 來管理 thread。
附錄A,Miscellaneous Topics:討論一些前面未觸及的執行緒問題。
附錄B,Exceptions and Errors:討論執行緒相關的例外和錯誤。

本書提供了許多簡短的範例程式,讓讀者更能體會作者所欲陳述的內容。第五章更設計了一些實用的例子,讓你瞭解 thread 程式設計的方式和應用所在。

相當特別的是,本書大量採用引導式教學:先提出一個問題,然後提出一個直覺上的解決方法,再說明這個方法為什麼行不通,最後告訴讀者正確的方法為何。我相當 喜歡這樣的陳述方式,讓人有「山窮水盡移無路,柳暗花明又一村的」感覺,體會也因此更加深刻。

即使你認為自己已經懂得 Java thread 程式設計,我還是建議你看看此書,你將會有許多意料之外的收穫,而這些收穫對你以後的 Java 程式設計會有相當大的幫助。


Learning Java the O'Reilly's Way (Part VI)

Database Programming with JDBC and Java, 2nd Edtion

資料庫一直都是程式設計最重要的主題之一。如果某程式語言或平臺開始提供資料庫的 API,我們可以說它已經正式脫離玩具的階段,開始具備實用的價值了。

JDBC 是目前 Java 唯一的一套資料庫 API。也可以說是 Java 技術中,先定義規格,再由廠商實作 Service Provider,第一個廣為接受的成功例子。現在,除了微軟的資料庫產品之外,其它的資料庫產品幾乎都有廠商所提供的 JDBC 驅動程式。也因此,Java 程式可以很輕易地存取所有的資料庫,而不用改寫程式。微軟的資料庫產品雖然不提供 JDBC 驅動程式,但是 Java 程式可以透過 JRE 內附的一套 JDBC 轉 ODBC 的驅動程式,或向其它廠商購買微軟資料庫的 JDBC 驅動程式,所以 Java 程式依然可以存取微軟的資料庫產品。

在 Enterprise JavaBeans(EJB)技術流行之後,程式設計師直接使用 JDBC API 的機會似乎大減,因為 Container-Managed Entity Bean 會在部署的時候自動產生資料庫相關的程式程式碼。雖然如此,但還是有許多時機需要直接去存取資料庫,所以 JDBC 的知識對於多數 Java 程式設計師而言仍是必備的。

由 O'Reilly 出版,George Geese 所著的「Database Programming with JDBC and Java, 2nd Ed. 」正是著眼於 JDBC 這個重要的主題,它的內容大致上可以分成三部分。

第一部份:第一章到第五章,講述 JDBC API 的用法,包括了 JDBC Core API 和 Standard Extension API。這部分可以說是涵蓋了 JDBC 全部的 API,但是令人失望的是,解說並不夠深入。
第二部分:第六章到第十章,對於利用 JDBC API 來設計系統架構,有很精闢的說明。這部分的內容讓本書的價值大大地提高了。
第三部分:第十一、十二章,是 JDBC API 的完整列表,但是感覺像是從 Javadoc 抄出來的,有些粗糙。
下面是各章的內容介紹:

第一章:本章解說 Java 運用在企業內部的方式。我發現本章有一部分是沿襲自很久以前的本書第一版,並未在此新版本中修訂,內容有點過時。

第二章:本章對於關係型資料庫和 SQL 的解說有很簡單的介紹。SQL 語法對於 JDBC 程式設計師來說是必備的知識,所以本章對於原本不懂 SQL 語法的讀者來說,是很重要的。當然,原本完全不懂 SQL 的人,看完此章之後還是不夠的,需要另找 SQL 和關連式資料庫的書補充這部分的知識。

第三章:開始介紹利用 JDBC 存取資料庫的方式。如果你不講究效率或其它議題,那麼看完本章之後就可以開始利用 JDBC 寫資料庫程式了。

第四章:本章討論 JDBC 進階主題,包括加快速度存取的方式、Stored Procedure、Metadata 等。

第五章:解釋 JDBC Standard Extension API 的用法,包括了聯機管理、分散式交易等。

第六章:介紹 JNDI、RMI、EJB 等 J2EE 重要的技術。

第七章:透過一個銀行系統的範例,解說分散式架構。

第八章和第九章:討論分散式運算和資料庫會遇到的問題,包括:交易、安全、儲存。

第十章:如何利用 Swing 的元件來呈現資料。

第十章和第十一章:列出所有的 JDBC API。

如果你完全沒有資料庫的基本概念,這本書可能不適合你。如果你需要 JDBC 的 API 查詢手冊,這本書也不是很適合。這本書的主要價值在於讓有資料庫經驗的程式設計師,透過第一部份很快地熟悉 JDBC API,再透過第二部分的啟發而設計出良好的多層式系統架構。

雖然本書內容涵蓋了目前最新的 JDBC 2.0 版,但是我必須提醒你:

· JDBC 3.0 會隨著 JDK 1.4 而現身。

· JDBC 是目前官方唯一的 Java 資料庫 API,但是未來 JDO(Java Data Object) API 會正式成為官方的 Java 儲存 API,重要性甚至會凌駕 JDBC。

· 雖然 SQLJ 短期內被納入官方標準的機會很低,但是 Oracle 和 IBM DB2 都支援 SQLJ,而且 SQLJ 使用上也的確有一些方便的地方,值得注意。

在看完這本書之後,你可以繼續看下列兩本書:

· JDBC API Tutorial and Reference, Second Ed. (Published By Addison-Wesley)

· Understanding SQL and Java Together (Published By Morgan Kaufmann)

Learning Java the O'Reilly's Way (Part VIII)

Java Swing

現代的程式中,圖形化的使用者介面(GUI)相當重要,良好的GUI可以讓程式更具吸引力、更好操作、更容易學習。雖然 Java 早就有 AWT,可以用來設計 GUI,但是 AWT 有兩大缺失:

太陽春:AWT 只提供最基本的元件(比方說:按鈕、滾動條等),而不提供 TreeView 等現代化GUI元件。更糟的是,AWT 的元件還只提供最基本的功能,比方說:按鈕上面只能出現 文字,不能出現圖形。(當然,你也可以利用繼承的方式來設計出圖文相容的按鈕,但這還要花不少額外的時間。)
不能跨平臺:AWT透過「同儕系統(peer system)」來和作業系統溝通。每個使用者介面的物件都有一個對應的「同儕物件(peer object)」,用來管理作業系統所提供的真正 使用者介面物件。比方說:如果你建立一個按鈕(Button)物件,就會有一個按鈕同儕(ButtonPeer)物件一請被建立,此按鈕同儕物件會請底層的作業系統建立一個真正的按鈕。 如果此程式是在 Windows 98 上執行,所建立的按鈕自然是 Windows 98 的按鈕。AWT 元件的外觀就會受到底層作業系統的影響。
正因為 AWT 的這兩大缺點,所以許多軟體元件廠商紛紛推出它們的GUI元件庫。比方說,Inprise/Borland的JBCL,KL Group 的 JClass。使用這些協力廠商的 GUI 元件產品固然解決 了 AWT 的兩大問題,但是因為非標準 API,所以必須隨著軟體的發行而附上,不但元件使用授權需要額外的花費,使得軟體成本上升,而且軟體體積也因此變大許多。

如果能有一套免費、統一、完善、又可跨平臺的 GUI 元件庫的話,那該有多好!

Swing 正是這樣的產品,它是由 Sun 公司研發設計。有了 Swing,上述的問題都迎刃而解。Swing 不但填補了 Java GUI 不能跨平臺的缺點,也提供許多新的元件,可以用來組合出 複雜的使用者介面,除此之外,Swing 也為 Java 注入新的特色,支援包括了拖放功能(drag-and-drop)、復原(undo)、並允許使用者改變 GUI 的外觀(look and feel)。Swing 元件都是「輕量級的(lightweight)」(注:前述的 Inprise/Borland 的 JBCL,KL Group 的J Class 也都是輕量級元件)。

Swing 提供了這麼多特色,所以我們該學的東西也不少,Swing 比 AWT 複雜許多,想直接透過 Java Swing API 的檔案來學習如何將 Swing 完全駕馭得宜實在不太可能 (比方說:JTable、JTextPane、和 Look-and-Feel 這麼複雜的東西,我不相信有人光靠 Swing Javadoc 簡單的說明就能操控自如)。我們需要一本好的 Swing 書籍,除了教學功能, 也要能當 API 速查手冊。

由 Robert Eckstein、Marc Loy、和 Dave Wood 合著的《Java Swing》深入地涵蓋了 Swing 的一切,也正因為如此,它的厚度高達 1,200 頁。本書以 Swing 大架構的解說為開始, 接著分門別類、由淺而深地介紹 Swing 的每個類別。O'Reilly 的書向來附圖不多,但本書可以算是個異數,不但有許多類別繼承圖,更有不少示意圖和GUI的畫面。本書還有許多表格、 詳細地列出類別的 method 和 field。由於 Swing 元件一般都是搭配 RAD 工具(例如 JBuilder、VisualAge for Java)來當作 bean 使用,所以這些表格還貼心地標出 get、set、is、 這些和 bean access 相關的 method。本書也有不少範例,讓讀者可以馬上知道相關用法。除了利用本書來學習 swing 之外,本書也相當適合當作案頭查閱書,我把它放在計算機桌旁 隨手可及的地方。

就像 Windows 有一些未公開的 API,Swing 也一樣,本書闢一個章節告訴你這些好用的 API(比方說 timer)。另外,如果你對 Swing 內部運作原理感興趣,本書也有一章完整的 說明。這些內容在其它書並不容易看到。

除了介紹一般的 Swing 之外,本書也涵蓋了Look and Feel、Accessibility、Undo。本書關於 Look and Feel 的部分寫得尤其精彩。但是,請注意:本書不包含 Drag and Drop。

你還是覺得無法隨心所欲地控制 Swing 的某些元件嗎?你需要看看這本書,你會發現,其實 Swing 沒什麼好怕的。


Learning Java the O'Reilly's Way (Part IX)

Java 2D Graphics

在看過 Direct3D 和 OpenGL 之後,你一定會以為圖學的 API 都很複雜難用,那麼你應該瞧瞧 Java 2D 和 Java 3D,相信你一定會改變你的想法。Java 2D 和 Java 3D 整合進了物件導向的觀念來以簡馭繁,Java 程式設計師可以輕易地繪出令人讚歎的 2D/3D 圖形。想學繪圖程式設計,卻又在接觸 Direct3D 和 OpenGL 之後鎩羽而歸的讀者,不妨改從 Java 2D/3D 下手。

O'Reilly 已經出版了一本 Java 2D 的書,書名叫做「Java 2D Graphics」,本書中文版也即將於 2000 年 9 月出版,中文書名為「Java 2D 繪圖技術」。「Java 2D Graphics」一書是由 O'Reilly 的王牌作者 Jonathan Knudsen 所著。不過,目前 O'Reilly 尚未出版任何 Java 3D 的書。在詳讀過「Java 2D Graphics」之後,我倒很希望 Jonathan 再寫一本「Java 3D Graphics」來造福讀者(順便造福我)。

不要以為只有設計繪圖程式或遊戲軟體才會用到 Java 2D,其實 Java 2D 的用途可能遠比你想象來得廣泛。我認為,只要你的程式有 GUI,就很可能會用到 Java 2D。因為 AWT 和 Swing 的元件常常無法完全適合我們,這個時候自己繪製一部分的 GUI 就有絕對的必要。如果,你的 Java 程式需要 GUI,那麼我建議你早點把 Java 2D 學好,以備不時之需。以我自己的例子來說,我正在開發一套軟體,需要提供一個表格狀的 GUI,而 Swing 的 JTable 卻不適合我使用,因為我的表格需要能在同一個 column 的不同 cell 放進不同種類的元件,我也需要 cell 之間能夠合併,我還需要有特殊的 selection model...... 這些都是 JTabel 不支援的,所以我就用 Java 2D 自己繪製這一切。有了 Java 2D 的幫忙,這一切簡單多了,而呈現出來的視覺效果也很不錯(當然,一方面要歸功我的美術細胞,謝謝你們!我的美術細胞們)。

Java 2D 是 Core API,所以使用 Java 2D 的程式不需要額外安裝任何 package。其實,AWT 和 Swing 都是透過 Java 2D 來進行繪圖的。

你可能會問,Java 在 1.0 和 1.1 就有繪圖的 API 了,為什麼在 Java 2 (JDK 1.2) 之後還要多出一個 Java 2D。其實,Java 2D 比起以前的「陽春繪圖 API」可是功能強大許多, 下面列出以前「陽春繪圖 API」的幾點侷限之處:

* 所有線條只能用單一畫素的寬度畫出。
* 只能使用少數幾種字形。
* AWT 沒有提供很多繪畫控制元件目。舉例來說,你無法操縱單一字元的形狀。
* 如果你想要旋轉、或放大縮小任何物件,必須要自己動手進行數學運算才能達成。
* 如果你想要進行漸層或花紋等特殊著色方式,必須自己動手做。
* 只提供最基本的影像功能。
* 要控制透明度,必須大費周章。

這些都已經在 Java 2D 中得到解決。如果這些文字敘述無法讓你感受到 Java 2D 的威力,那麼請開啟你的計算機執行 JDK 所附的一個範例程式:

C:/> cd /jdk1.3/demo/jfc/Java2D
C:/jdk1.3/demo/jfc/Java2D> java -classpath Java2Demo.jar Java2Demo

很驚人,是不是?呵呵!還有更嚇人的呢!請看 Vincent J. Hardy 所著的「Java 2D API Graphics」(Sun Press 出版)一書所附的一堆彩色圖片,保證你會大吃一驚。沒錯!這都是用 Java 2D 做出來的。(可不是 Corel Draw 呦!)

繪圖本來就是很複雜的一件學問,Java 2D 的 API 雖然好用、易擴充,但是前提是:你要徹底懂它的原理和架構。這時候,一本深入淺出,說理清楚的入門書就有必要了,我認為 Jonathan 所著的這本書很適合用來載入程式員學習 Java 2D,是一本初、中階的書。而 Vincent J. Hardy 的「Java 2D API Graphics」(Sun Press 出版)也是一本很棒的書,較偏中、高階。在讀過 Jonathan 的「Java 2D Graphics」之後,我建議讀者再繼續把 Vincent J. Hardy 的「Java 2D API Graphics」一書讀過,因為 Vincent J. Hardy 的書中有介紹光影變化等進階的主題,還附有作者自行開發的 GLF(Graphics Layer Framework),讓程式設計師可以輕易地疊出漂亮的視覺效果。Vincent J. Hardy 目前是 Sun 的員工,所以 GLF 目前雖然是 com.sun.glf,但我覺得 GLF 以後有可能會變成 javax.glf,因為 GLF 實在好用。

在讀過 Jonathan 的書之後,讀者都會很喜歡 Jonathan 的寫作風格,因為 Jonathan 可以把複雜的原理用淺顯的方式來表達,「Java 密碼學」如是,「Java 2D 繪圖技術」一書亦如是。因為喜歡這本書,所以我接下本書中文版的技術編輯,希望中文版能讓你滿意。

Learning Java the O'Reilly's Way (Part XIV)

Java Virtual Machine

Java是近年突然竄紅的新星,「保全」、「跨平臺」......,大家對它的諸多特色津津樂道,但你可曾認真思考:是誰在 Java 的背後成就這些光彩的?

因為 Java 虛擬機器器(Java Virtual Machine,簡稱 JVM)的屏障,所以 Java 程式可以跨平臺;因為 JVM 進行多項驗證,所以 Java 具保全性。.... 原來,JVM 是成就 Java 的一大幕後功臣。

顧名思義,Java 虛擬機器器是一部假想的計算機,也是 Java 技術的核心所在,所有的 Java 程式都是在這部假想的計算機上執行的。Java 虛擬機器器可以以多種不同的形式存在:以一般程式的方式存在,架構在 OS 之上,例如 java.exe;以作業系統的方式存在,架構在硬體上,例如 Java OS;甚至直接以硬體的方式存在,例如 JavaChip(不過我認為以硬體的方式存在的虛擬機器器已經太「真實」,不適合叫做「虛擬」機器)。

本書讀者群設定在熟悉 Java 語言並略懂 C/C++ 的程式設計師。本書的內容介紹性與教學性兼而有之,某些部份還可以當成參考資料來查閱。本書是一本以「徹底解說」為導向的書,書中有許多實用的資訊以及 Java 虛擬機器器程式範例。

本書是寫來和 JVM 規格書作為互補之用的。JVM 規格書告訴我們細部的規則和語意,而本書提供了更多說明與深入淺出的描述,並伴隨著許多範例讓你親自嘗試。比方說:本書教你寫出一個類別載入者(class loader)、透過假碼(pseudo-code)的說明來揭露 instanceof 的運作細節、用 JVM 指令來寫出一個 applet.... 等等。本書也捨棄一些內容不提,比方說:IEEE 格式、類別驗證者(class verifier)的動作方式.... 等。不過,這些資料你分別可以在 O'Reilly 出版的《Java Language Reference》以及《Java Security》等書上找到詳細的資料。

本書的結構分為三部份:第一部份是機器概觀,第二部份是指令指南,第三部份是參考資料。如果你對 Java 虛擬機器器不熟悉,你可能想把這本書拿到一個安靜的地方,花些時間仔細地讀完前三章。稍後,你可以回來讀完第一部份的其它章節。如果你需要熟悉 JVM 的指令集,第二部份包含了所有 JVM 指令的快速瀏覽,並佐以適當的範例。或者,如果你需要查詢某 Java 虛擬機器器指令的操作細節,你可以到第三部份去看看,這部分以英文字母順序排列,查詢相當方便。

本書的中文版正是我以前翻譯的「細說Java虛擬機器器」,已經絕版了,市面上不容易看到。因為翻譯此書的關係,我在 Java 虛擬機器器花了不少功夫,也對 Java 有了更深入的認識。除非你有實際的需要,或和我一樣好奇地想更深入瞭解 Java,不然其實大部分的人並不需要閱讀本書。本書可能的讀者包括了﹕

· 教師:如果你正在教編譯器(compiler)課程,你可能想用 Java 虛擬機器器當學生習作的平臺,好處是可以讓學生在各種不同的機器上完成這份習作。

· 業餘愛好者:本書提供你一套工具,讓你能在虛擬機器器層級將 Java 操控於指掌間。

· 系統開發者:如果你正在開發一個 Java 執行時期系統(runtime system),或將 Java 移植到新的 平臺,這本書能讓你瞭解執行時期系統內如何分工合作。

· 程式設計師:透過本書與隨書附贈的 Jasmin(茉莉)軟體,你可以反組譯類別、觀察類別的內部、甚至 可以用組譯器來實作重要的類別和 method。或者,你也可以藉由本書來了解 Java 的執行效率議題 並直接使用 JVM 建立應用軟體。

· 語言實作者:如果你希望讓 Java 虛擬機器器也能執行某個你喜愛的程式語言,你打算實作此語言的 JVM 版本,本書對你會很有幫助。

· 電腦保安高手:Sun 公司要求 Java 可以保護你免於受到來者不善的程式之搗亂。本書幫助你能自行 控制這項權力。

本書以 Java 1.02 版為描述物件,而現在都已經跨過 Java 1.1,進入Java 2(JDK 1.2)的時代了。雖然 Java 歷經這些改版,JVM 指令集和 bytecode 的格式並未有任何變動,所以本書依然適用於現今的 Java 2,也因此原作者似乎短期之內沒打算改版。雖然 bytecode 的格式並未改變,但 Java 1.1 和 Java 2 以後的確是多出一些屬性,包括了:「InnerClasses」、「Synthetic」以及「Deprecated」,都是本書未涵蓋的,如果你正在實做 JVM 或 Java 編譯器,請特別留心這部分。

本書提供許多範例﹐用來幫助讀者瞭解 Java 虛擬機器器。因為 JVM 規格書並未定義 Java 類別檔案的文字格式(只有定義 Java 類別檔案的位元組格式),本書作者們開發了一套自己的 Java 虛擬機器器組譯器,叫作 Jasmin(茉莉)。Jasmin 需要用文字來描述 Java 類別檔案,以簡單易讀的語法撰寫,Jasmin 將其轉成合適的類別檔。使用 Jasmin,可以輕易地摸索出虛擬機器器的原理。本書所有JVM 程式的範例都是由Jasmin 語法撰寫。本書參考資料的部份對 Jasmin 語法和底層的 bytecode 格式有更詳細的描述。作者「原本」免費提供 Jasmin,可以到 www.ora.com/catalog/books/javavm/ 下載 Jasmin。不過,不知怎地,我發現 Jasmin 的網頁已經消失了,所以無法下載。因為 Jasmin 的版權屬於作者而非 O'Reilly,所以現在如果你想取得 Jasmin,無法透過 O'Reilly,可能的方式有:

· 買 O'Reilly 的《Java Virtiual Machine》一書,隨書所贈的磁碟中就有 Jasmin。

· 寫 email 求作者 Jon Meyer 發發慈悲,email 一份 Jasmin 給你。

什麼!你要我直接 email 給你!不成,不成,未經同意散播有版權的軟體是違法的。你們不希望看到我坐牢吧

Learning Java the O'Reilly's Way (Part XVIII)

Enterprise JavaBeans, 2nd Edition

Java 的諸多特點,使得 Java 很適合用在企業運算(Enterprise Computing)領域,而 EJB(Enterprise JavaBeans)可以說是其中最重要的技術。目前除了微軟之外,所有的 Application Server 幾乎都是支援 EJB 的。

EJB 雖然重要,但是 EJB 的知識相當繁瑣,不容易全盤理解,學習門檻很高。如果沒有花時間好好弄清楚每一個環節,實做時一定會遭遇到重重的困難。所以,在想享受到 EJB 的好處之前,你需要一本帶你跨越障礙的好書。

由 Richard Monson-Haefel 所著的《Enterprise JavaBeans, 2nd Ed》一書,可以說是最暢銷的 EJB 書籍。去年年底的一個 EJB 研討會,幾乎人手一本此書(或中文版,或英文版)。

只要懂 Java 語言,你不需要是資料庫或分散式運算的專家,你也能閱讀本書。本書由許多相關的技術說起,慢慢帶出這些技術的缺點,再導向 EJB 技術。前面章節以大局觀,並未提及太多 EJB 細節,後面章節才逐漸加入更多詳細的資訊。如此一來,讀者可以循序漸進,不會一開始就迷失在這些細節中,對 EJB 的好處可以有更深刻的體認。

如果你手上有一個 EJB 的計劃正在進行或即將進行,你會覺得本書簡直就是專門為你而寫的。本書以一家虛構的遊輪公司當作範例貫穿全書,有趣、生動又實用的內容安排,對於理解有很大的幫助。

本書第一章針對分散式物件、元件、伺服端元件、交易監控伺服器做了完整的解說。接下來第二章解釋 EJB 的大架構,並開始以遊輪公司當範例設計出一些 EJB 程式,也藉此解釋一些重要的 EJB API。第三章針對 EJB server 內部運作和 EJB server 所提供的服務有了精簡的解說。基本上,在讀完這三章之後,你就能夠掌握 EJB 的大架構了。建議將此三章多讀幾次,這三章是分散式運算的精華。

第四章提供了介紹 entity bean 和 session bean 的程式設計介紹,但是略過一些細節,讓讀者能很快上手寫 EJB 的程式。第五章是 EJB client 端的部分。這兩章讀完之後,你差不多已經會寫 EJB 的程式了。

第六章和第七章分別對 entity bean 和 session bean 進行地毯式的詳細介紹。許多觀念其實前面章節都提過,再加上程式範例很多,所以雖然此二章的篇幅不小,但其實可以很快就看完。

第八章對交易(transaction)有相當清楚的說明,這個主題是其它書欠缺或講不清楚的部分。第九章針對一些 EJB 的設計提出方針,這部分比較偏技巧面,如果你希望「Design Patterns」之類的書,你可以參考 Addison-Wesley 出版的《SanFrancisco Design Patterns》一書,O'Reilly 也有一本《Enterprise Java Design Pattern》的書正在撰寫中,其它出版公司也會在未來出版類似主題的書。第十章詳細介紹 XML 的配置描述檔案。第十一章對於 J2EE 中和 EJB 關係比較密切者(包括 Servlet、JSP)做了一些介紹。讓你知道 EJB 應該如何和其它 J2EE 的技術相互整合。

附錄是一些相當有參考價值的資料。附錄 A 是 EJB API 的解說。附錄 B 利用 UML 畫出許多 EJB 的狀態圖和循序圖,可以說是「一圖解千言」。附錄 C 是 EJB server 廠商列表。附錄 D 是 EJB 1.0 和 EJB 1.1 之間的差異比較。

我認為,本書的優點有:

* 對於分散式運算有深入淺出的介紹
* 不只教你 EJB 程式的寫法,也讓你知道 EJB 內部的原理
* 內容章節的次序安排循序漸進、易讀易懂
* 對交易(transaction)有詳細的討論。很精彩!
* 對 EJB 1.0 和 EJB 1.1 有完整的討論,並詳細解釋了兩者之間的差異
* 提供許多精心設計的插畫和表格讓許多複雜的觀念可以清楚地呈現

本書中文版《Enterprise JavaBeans 技術,第二版》集優秀的作者(Richard Monson-Haefel)、優秀的編輯(Michael Loukides)、優秀的中文版譯者(黃奕勤)的努力,中文版譯者甚至搶先在原文版公佈戡誤表之前就已經把書中的小錯誤幾乎都修正了。目前本書作者正進行第三版的改版動作,以符合 EJB 2.0 的新規格。我們可以期待新版的原文書或許在年底前會出版,而我也希望本書的原譯者可以繼續擔當本書第三版中文版編譯的重任。除了他,我不知道還有誰可以把 EJB 的書翻譯得如此好。


Learning Java the O'Reilly's Way (Part XIX)

Java Internationalization

「寫程式很難,寫中文的程式更難」這是許多程式設計師的心聲。許多平臺、語言、編譯器、資料庫、驅動程式 ... 對於英文以外的語言支援都不好,而使用雙位的東方語言更是常常會遇到亂碼的情況,這正是因為這些軟體在開發時,沒考慮到國際化(internationalization,i18n)的需求所造成。當這些不夠國際化的軟體欲進入另一個國家的市場,必須額外花費更多心力進行本土化(localization,l10n)的工作,才能符合當地的需求。

軟體市場的國際藩籬早已經被打破,所以在規劃軟體的同時,最好能有 i18n 的考量。近年來,IBM 和微軟的產品 i18n 得相當徹底,所以不太需要花時間進行各地區的本土化,這些公司的軟體在英文版上市的同時,世界各地的版本幾乎都能同時上市。i18n 不但減少他們各國版本在本土化時所需要的人力,節省成本,更可以讓產品提早上市,搶得商機。比方說:幾年前,MS-Windows 和 MS-Office 還沒有全面 i18n 之前,中文版上市時間會延遲數月甚至半年以上。

許多人以為軟體本土化只是軟體和手冊的文字翻譯罷了,如果你也這麼認為,那麼就太天真了。各國不同的不只是文字語言,還有習慣、文化、法規 ...。所以單純的翻譯只是本土化的第一步,後續還有許多工作要進行。設計時沒有 i18n 考量的軟體,在進行本土化時會遇到許多困難,甚至很有可能要改寫原始碼。不但成本大幅提高,上市日期延後,甚至會有更多的 bug 出現。也因此,軟體在一開始設計時,最好就把 i18n 考量進來,雖然會在初期帶來些許的不便,但是結果卻相當值得。

Java 不但希望能跨平臺,也希望能跨國際、族群。所以 Java 對於多國語言有相當好的支援,讓我們能開發出不同語言的使用者都能使用的軟體。Java 對於 i18n 的支援,是相當先進的,除了全面採用 Unicode 並提供許多編碼轉換之外,更內建許多機制(最為人所知的是 Locale 和 String Boundle),讓程式設計師能很簡單地開發出 i18n 的程式。

比較可惜的是,Java 在語音的部分對於 i18n 的支援並不佳,畢竟語音辨識和語音合成的技術門檻太高,而 Java Speech 也很久沒有動靜了。我希望在以後 Java Speech API 出新版本時,能有完善的 i18n 考量,而且各國語音的實作版本也能陸續推出,在這方面最有希望的是 IBM。

由 O'Reilly 出版,Andrew Deitsch 與 David Czarnecki 所合著的「Java Internationalization」一書,廣泛地涵蓋了 Java i18n 相關的主題。本書的各章節介紹如下:

第一章:討論國際化和本土化的一般觀念,以及 Java 對國際化的支援。
第二章:分析世界各地具代表性的書寫方式,包括西方的(由左至右)、東方的(任意方向)、和中東的(雙向混合)。這章可以讓你大開眼界。
第三章:討論 java.util.Locale 相關的用法。所謂的 Locale 指的是:一個特定的地區(以政治、經濟、宗教、語言 ... 來區分)。
第四章:討論如何透過 Resource Boundle 來將程式和相關資源隔離。許多人都以為資源指的是字串,但其實也可以是任何物件。
第五章:各種格式(貨幣符號,數字格式,日期時間格式 ...)的使用。
第六章:Unicode、各種編碼與轉碼相關的議題。如果你常遇到中文變亂碼的問題,這一章的知識對你來說應該會有幫助。《Java I/O 技術》一書對此已經有相當詳細的討論。
第七章:敘述文字的比對與排序相關的議題。
第八章:討論字型和呈現文字的方式。部分主題在《Java 2D 圖學技術》一書中有更完整的討論。
第九章:介紹圖形化的使用者介面對於 i18n 應該做的改變。不同的國家,可能會需要不同風格的 GUI。本章對此做一個概念性的解說,更詳細的 GUI 資訊可以從《Java Swing 基礎篇》和《Java Swing 進階篇》中獲得。
第十章:討論利用 Input Method Framework 來設計輸入法,讓 Java 程式所使用的輸入法也能不受作業系統的影響。
第十一章:國際化的 web 程式設計。讓 web(applet、servlet、JSP)也能夠國際化,從不同的地方讀取會得到不同語言的版本。
第十二章:敘述 Java 未來還可能針對 i18n 做出哪些改進。
附錄 A:各種語言和國碼
附錄 B:Java 所支援的編碼方式
附錄 C:Unicode 的編碼分類
附錄 D:Java i18n 相關的 API 列表
附錄 E:Java 各版本對於 i18n 支援的變革

這是一本 i18n 的入門書,不是百科全書,許多時候你會需要更進階的資訊,所以本書最後還列出許多參考資料。本書雖然是以 Java 為程式語言,但是書中所提到的這些概念,其實其它程式語言也可仿效採用。特別是,目前專門論述 i18n 的書很罕見,所以本書彌足珍貴。
關於編碼和文字的部分,我建議各位在看完本書之後,繼續看下面這兩本書:

· The Unicode Standard, Version 3.0 (published by Addison-Wesley)

· CJKV Information Processing (published by O'Reilly)

關於文化習俗,你還需要另外收集資料來看,特別是文明悠久的地區,例如:以色列、埃及、阿拉伯、印度 ... 等國家的文化習俗比較不為我們所熟知。而且因為有些國家比較激進一點,所以尚未全盤瞭解文化習俗之前,不要隨便推出當地版本,否則天曉得會出什麼亂子。闢用幾位當地人員作為本土化諮詢顧問,似乎是可行的管道。

Learning Java the O'Reilly's Way (Part XX)

Java Enterprise in a Nutshell

Java 現在最熱門的應用領域是在 Server 端。Java 2 Platform, Enterprise Edition(簡稱 J2EE)是 Java 在 Server 端的標準。現在,除了微軟之外,其它的 Application Server 廠商幾乎都是一面倒向使用 J2EE,由此可見 J2EE聲勢的浩大。再加上現在 Multi-Tier(多層)架構流行,電子商務 B2C 以及 B2B 當紅,使得 J2EE 更加地水漲船高。

本書正是介紹 J2EE 相關技術的書。有經驗的 Java 程式設計師適合以本書當作進入 Enterprise Computing 領域的嚮導,但無 Java 經驗的程式設計師應該先把 Java 語言學好再談。

本書涵蓋的主題包括了:

· JDBC:關係型資料庫的 API。

· RMI:物件導向分散式運算的 API,只能在 Java 程式之間使用。

· Java IDL:兼容於 CORBA 的物件導向分散式運算。

· Servlets:用來動態地產生網頁的 API。

· JNDI:命名、目錄、定位的 API。

· Enterprise JavaBeans:為公司內部設計元件化的 Business Logic 的 API。

可惜的是,本書沒有提到 JSP、SQLJ、XML、JAXP。希望下一版能將這些主題包含進來。

在不多的篇幅中,每個主題至少都能從入門涵蓋到中階的程度,算得上是乾淨俐落,精確詳實。在讀完本書之後,如果欲學習更完整深入的內容,必須看個別主題的專書。

本書 JDBC/SQL 的參考資料寫得尤其精采,用的篇幅不多,卻可以鉅細靡遺地涵蓋 JDBC 的詳細資料。本書還有一章是講述關係型資料的概念和 SQL 語法,所以即使你以前對資料庫 沒什麼概念,這本書依然適合。

本書也對 CORBA 有不錯的入門介紹。如果你想學 CORBA,但是又實在沒能力去讀 Robert Orfali 和 Dan Harkey 所寫的 CORBA 鉅著,那麼這本書倒是個適當的選擇。

如同其它「in a Nutshell」系列的書一樣,本書也在下半部附上了相關 API 的參考檔案。雖然本書沒有討論 JMS 和 JTS/JTA,但是 API 的參考資料中倒是有將此二者包含進來。

「Java in a Nutshell」有一本範例導向的姊妹品「Java Examples in a Nutshell 」;如果本書也能有一本範例導向的姊妹品(比方說,就叫做:「Java Enterprise Examples in a Nutshell」),就更完美了,畢竟透過範例來學習可以比較容易體會這些Enterprise API 的用法。甚至,如果能設計一個完整的範例(比方說,電子商務)來將本書的 API 都用進去,會更棒。

聊點輕鬆的主題吧!本書封面的動物是「海膽」。海膽可以在世界上許多海岸的沙質底部找到。海膽的介殼常常有花瓣狀排列的孔洞,海膽的嘴巴就在中心部位的殼底下。海膽可以 蠕動地在沙質海底表面挖洞。海膽可以在沙中找到其滋生的養分,它用管狀的足部將食物推進嘴巴。海膽上方有一些特殊的管狀足部是用來呼吸的管道。花狀的美麗外觀、以及遍佈世界 的特性,使得海膽變成殼類收集家的最愛。科學家也被海膽所吸引,常常拿海膽當作研究細胞有絲分裂的題材。

O'Reilly 的書向來愛用動物當作封面,有的封面動物和書的主題之間有一些隱喻的關聯。不過,我想了又想,實在不知道海膽和 J2EE 有什麼關聯。

Learning Java the O'Reilly's Way (Part XXI)

Java Power Reference

Java API 多得如恆河沙數,每個 Java 程式設計員都需要透過一套良好的 API 手冊來幫助撰寫程式。我心目中理想的 API手冊是像 The Waite Group 出版的《Win32 API Bible》,依功能將 API 分門別類,然後詳細介紹,還佐以短而具代表性的範例。

我認為 The Waite Group 出版的《Win32 API Bible》唯一的缺失在於它是印刷品。 API 手冊如果以紙張印刷的方式存在,儘管索引方式設計得再精良,查詢時仍然頗為費時、不便。更何況 Java 的 API 這麼多,真要印成手冊,恐怕會如大英百科全書般驚人。如果改以電子手冊的方式存在,並以 CD-ROM 的方式發行,無疑地是 Java API 手冊最好的現身方式,除了環保不需紙張的好處之外,查詢檢索起來更是方便,甚至可以使用交叉查詢的功能。

《Java Power Reference》是一份電子手冊,而且檔案一律使用 HTML 的格式,所以可以直接用計算機上的瀏覽器閱讀,無須安裝特殊的電子書軟體。除了一片 CD-ROM 之外,《Java Power Reference》還附有一本薄薄的書(約六十頁),簡單地描述 Java 2 平臺的現況。

《Java Power Reference》的優點包括了:

· 搜尋方式以及交叉索引都很方便,找資料的速度比 Sun 的線上說明快。

· 完整地列出 Java 2 所有的 API。包括了 182 package、3,900 個類別、38,384 個 methods 和 field 。(雖然如此,但其實資料量也只佔了光碟片的一小部分,約 130MB。)

雖然《Java Power Reference》是電子手冊,收集了齊全的 Java 2 API(包括了Core API 和 Standard Extension API),搜尋功能和索引作得不錯,也可以交叉查詢,但是 它卻讓我大失所望。任何人都可以輕易地發現《Java Power Reference》的兩大缺失:

· 沒有範例程式:你無法知道如何將這些 API 兜在一起,以達到特定功能。

· 沒有 API 說明:每個 method 只列出其傳入引數的型態和其傳出值的型態,其它的說明一概付之闕如。使用者只好透過 method 名稱來「望文生義」一番。

沒有範例、沒有 API 說明的 API 手冊,就好比是一本沒有例句、沒有單字說明的英文字典,我很懷疑這樣的字典能幫我寫好英文文章。對我來說,如果我想知道某 API 的用法,我寧願利用 Sun 提供的線上檔案,因為它對每個 API 有詳細說明;如果我想快速查詢 API 格式,我會使用開發工具提供的提示功能(比方說 Jbuilder 的 CodeInside)。

希望在不久的未來《Java Power Reference》能改版,加強範例和 API 說明,成為真正的 Java POWER Reference。

Learning Java the O'Reilly's Way (Part XXII)

Creating Effective JavaHelp

如果你設計過 WinHelp 格式的 online help,而且沒有 help 寫作工具的幫忙,那麼你可能知道,其實製作 WinHelp 需要懂一大堆知識,包括 RTF 的格式、編譯檔案的方式 ... 等,所以 WinHelp 的書厚度總是不小,但是 Java 平臺的 online help 就完全不同了。O'Reilly 最近出版的「Creating Effective JavaHelp」一書是講解 Java 平臺的 online help 製作,此書是 O'Reilly 的 Java 系列中最薄的一本書,只有 171 頁,原因無它,只因為 JavaHelp 原本就是一個迷你的主題。JavaHelp 使用 HTML 當作說明檔格式,使用 XML 當作附屬檔格式,使用一套 class(位於 javax.help 和 javax.help.event 此二 package)當作 Java 程式和說明檔案之間的銜接橋樑。

雖然「Creating Effective JavaHelp」是目前唯一一本 JavaHelp 的專書,其實市面上幾本 Swing 的書有討論到 JavaHelp,而且都是用一章的篇幅就帶過。但「Creating Effective JavaHelp」的定位不太一樣,因為它除了教導 JavaHelp API 的用法之外,也教你建立「effective(有用的、實際的)」的線上說明系統,如書名所示。此書除了解說 JavaHelp 的使用方法之外,作者用了許多篇幅來講解如何規劃一套實用的 online help。這是比較難能可貴的部分。

如果你是 online help 設計的老手,你可以不用看此書,直接看 JavaSoft 的 JavaHelp 檔案即可;如果你是 online help 的新手,那麼這本書應該可以帶你輕鬆入門。以我自己來說,因為我本來就懂 HTML 和 XML,又有製作 WinHelp 的經驗,加上這本 JavaHelp 的書又很薄,所以我花了兩天就差不多看完了。

雖然許多程式設計師都很「不屑」設計 online help,認為 online help 只是多餘的東西。但是我認為 online help 很重要,特別是近年來許多軟體的手冊都電子化,使用者也習慣在操作軟體時,一但遇到疑問,就去查 online help,如此一來可以快速地透過主題分類、搜尋、索引、互動查詢等 功能,不但找資料的速度比翻手冊快,還更環保呢!但是,我發現許多軟體的 online help 做得不好,常會有 broken link,或者讓我找了許久還找不到我要的說明,顯然它們 的 online help 沒有規劃好。每次遇到這種情況,我都會 show 出我那不肯輕易示人的中指(其它指頭成握拳狀)。

最近,我正打算為我所寫的軟體加上 JavaHelp。如果你正使用 Java 開發軟體,請別忘了把 JavaHelp 整合進去,而且多花一些時間規劃出一個「effective」的 online help 吧!

Learning Java the O'Reilly's Way (Part XXIII)

Java Message Service

只要你正在使用 J2EE 規劃 ERP、EAI、或 B2B 系統,你需要使用 JMS 的機會很大。如果 JMS 尚未進入你的系統規劃中,我想可能是因為 JMS 相對於其它 J2EE 的技術(EJB、JSP、Servlet、JDBC)來說,是比較新的技術,所以你對 JMS 並不熟悉,因此忽略了它的重要性。J2EE 相關的技術有相當多,而且彼此多少有應用上的替代性。但是如果你錯把某些功能規劃使用不適當的技術來實作,系統或許仍可以完成,但建置成本會提高、開發時間加長、系統 穩定性會降低。如果你正在利用 J2EE 建置企業系統,但你還不知道 JMS,我強烈建議你花一些時間好好弄懂 JMS。很可能你的系統規劃會因此而有很大的改變。

我一直很推崇 Richard Monson-Haefel,因為他不但具備企業運算的技術能力,而且知道如何將深奧的技術敘述得讓人很容易瞭解,這樣的作家實在不多。繼廣受好評的「Enterprise JavaBeans 技術」一書之後,Richard Monson-Haefel 偕同 David A. Chappell 寫了「Java 訊息服務」這本主題同等重要的書,兩本書的風格相當接近,「Enterprise JavaBeans 技術」的讀者不應該錯過「Java 訊息服務」。我認為 Richard Monson-Haefel 和 David A. Chappell 的這本「Java 訊息服務」可以說是 JMS 的經典之作,短期之內恐怕不會有其它 JMS 書籍可以超越本書的表現。

本書目前在 2001 年 JDJ 的讀者票選中排名第三,僅次於第一的「Java in Nutshell」和第二的「J2EE Blueprint」。以一本如此 進階主題的書,能僅次於 Java 入門書「Java in a Nutshell」,以及 J2EE 入門書(免費電子書)「J2EE Blueprint」,可見 JMS 的重要性。

Java 訊息服務一書完整地涵蓋了 JMS 1.02 API。對於既有的訊息系統來說,點對點是最常見的訊息機制。但是本書卻是先敘述出版訂閱模式,再討論到點對點。對於沒有接觸 過訊息系統的人來說,這是相當不錯的方式。

對於完全不懂訊息伺服器的人來說,這本書是一個很好的入門教材,對於已經懂訊息伺服器的人來說,本書是相當好的 JMS API 參考資料,是你在實作 J2EE 系統時,不可或缺的一本好書。

本書的架構是這樣的。第一章解釋訊息系統、集權式與分散式架構、以及 JMS 的重要性。第二章到第五章詳細地解說 JMS 客戶端的開發細節,內容涵蓋兩種訊息模型(出版與訂閱、點對點)。第六章到第七章可以被視為「進階主題」,內容涵蓋訊息系統的部署與管理。第八章是 JMS 在 J2EE 中所扮演的角色,內容包含了