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。

· 或在欧莱礼台湾该书的网页 www.oreilly.com.tw/chinese/java/virtual.htm 下载。

· 写 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 中所扮演的角色,内容包含了 EJB 2.0 新的讯息驱动 bean。最后,第九章提供了一些 JMS 厂商和产品的简单介绍。下面是本书各章的大纲:

第一章:了解讯息传递 本章告诉你何为企业讯息传送以及讯息服务器厂商常用的架构,本章涵盖了 JMS 的定义、运作的解释、以及两种程序设计模型(出版与订阅、点对点)。本章也列举出一些适合使用 JMS 的例子。

第二章:开发一个简单的范例 透过一个简单的聊天室系统,带领读者走过一次出版订阅模型的开发过程。

第三章:JMS 讯息内部细节 剖析 JMS 讯息内部的组成。包括讯息标头、属性、装载物。

第四章:出版与订阅 透过一个 B2B 系统的实作过程,来让读者对出版订阅讯息模型的程序设计方式有所了解。

第五章:点对点 运用点对点技术来加强前一章的 B2B 系统,以对点对点有深入的了解。

第六章:保证送达、交易、响应确认、失败 本章对于一些进阶主题有更深入的讨论,这些主题包括保证送达、交易、响应确认、与失败的处理。我非常喜欢这章,透过许多图形的解说,讯息系统内部运作机制一切都变得再 清晰不过。

第七章:部署考量 本章深入地剖析了选择 JMS 服务器以及部署 JMS 程序时必须考量的问题。

第八章:J2EE、EJB、以及 JMS 本章对于 J2EE 和 JMS 有整体性的描述。本章也介绍了 EJB 2.0 所支持的 JMS 讯息驱动 bean。

第九章:JMS 产品 对于常见的几套 JMS 产品,本章有简短精要的介绍和比较,这些产品包括了:IBM MQSeries、Progress SonicMQ、FioranoMQ、Softwired iBus、Sun JMQ、BEA WebLogic、Exolab OpenJMS。

附录 A:JMS API 对 JMS API 内的类别、接口、method 作一个简短的介绍。

附录 B:讯息标头 提供讯息标头的详细信息。

附录 C:讯息属性 提供讯息属性的详细信息。

附录 D:讯息选择器 提供讯息选择器的详细信息。

随着 JMS 快速地变成 J2EE 中最重要的技术之一,许多成功的分布式运算专家需要知道 JMS 的工作原理以及使用时机。阅读本书来学习 JMS,可能是你的职业生涯中最睿智的抉择之一。

从 Applet 到 Servlet,从 Servlet 到 EJB,从 EJB 到 JMS。大家都开始准备享受讯息服务所带来的好处,而你也准备好了吗?

原文链接:http://blog.csdn.net/beseanlo/article/details/4543885

【转】O'Reilly Java系列书籍建议阅读顺序(转自蔡学庸)的更多相关文章

  1. [转载] 推荐的C++书籍以及阅读顺序

    2014-06-17 转载自 oiramario 的文章 推荐的C++书籍以及阅读顺序 当读者有一定c/c++基础 推荐的阅读顺序: level 1 从<<essential c++> ...

  2. Java系列笔记(6) - 并发(上)

    目录 1,基本概念 2,volatile 3,atom 4,ThreadLocal 5,CountDownLatch和CyclicBarrier 6,信号量 7,Condition 8,Exchang ...

  3. java推荐书籍及下载

    前言 一直有这么个想法,列一下我个人认为在学习和使用Java过程中可以推荐一读的书籍,给初学者或者想深入的朋友一些建议,帮助成长.推荐的的都是我自己读过,也会推荐一些朋友读过并且口碑不错的书籍.以下的 ...

  4. Java系列笔记(2) - Java RTTI和反射机制

    目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这 ...

  5. Java系列笔记(4) - JVM监控与调优

    目录 参数设置收集器搭配启动内存分配监控工具和方法调优方法调优实例     光说不练假把式,学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分析原因并解决之.通过学习,我觉得JVM ...

  6. JAVA程序员必看的15本书-JAVA自学书籍推荐

    作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水 ...

  7. Java 系书籍,,,,,,,,,,,,,

    Java 系书籍 本文仅对每本书做简单介绍,里面的精华我是希望留给各位看官仔细去阅读去琢磨~~ Java 1. <Java核心技术 卷1 基础知识> 2. <Java核心技术 卷II ...

  8. Java系列笔记(4) - JVM监控与调优【转】

    Java系列笔记(4) - JVM监控与调优[转]   目录 参数设置收集器搭配启动内存分配监控工具和方法调优方法调优实例     光说不练假把式,学习Java GC机制的目的是为了实用,也就是为了在 ...

  9. java相关书籍及网站

    原文链接:http://developer.51cto.com/art/201408/448609.htm 对于 Java™ 语言开发人员来说,信息过量是一个真正的问题.每个新入行的程序员都要面临一个 ...

随机推荐

  1. javascript oop深入学习笔记(二)--javascript的函数

    一.概述: 函数是进行模块化程序设计的基础, javascript重的的函数不同于其他语言,每个函数都作为一个对象被维护和运行.通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或则讲函数作为参 ...

  2. shell(1)

    bash变量类别: 本地变量 : 又叫局部变量,仅对当前shell进程有效 环境变量 : 当前shell及其子shell,子子shell-. 特殊变量 : $?  上一个命令执行的状态,0表示执行成功 ...

  3. [改善Java代码]使用构造块精炼程序

    建议36: 使用构造代码块精炼程序 什么叫代码块(Code Block)?用大括号把多行代码封装在一起,形成一个独立的数据体,实现特定算法的代码集合即为代码块,一般来说代码块是不能单独运行的,必须要有 ...

  4. 关于String和StringBuffer的使用

    java本身提供了n多对象方便我们进行开发,这些对象都是遵从着面向对象思想而出现的,后期再讲就不再讲思想了,而是不断学习这些对象的使用.我们的学习重点已经开始从面向对象思想转移到了面向对象的使用上来了 ...

  5. Linux 命令 - cp: 拷贝文件和目录

    命令格式 cp [OPTION]... [-T] SOURCE DEST cp [OPTION]... SOURCE... DIRECTORY cp [OPTION]... -t DIRECTORY ...

  6. Android第三方授权(QQ篇)

    QQ授权比微信授权相对来说会方便一些 同样需要去官网下载sdk和导入sdk到自己的工程 http://wiki.connect.qq.com/%E7%A7%BB%E5%8A%A8%E5%BA%94%E ...

  7. shell脚本字符串截取的8种方法

    假设有变量 var=http://www.aaa.com/123.htm. 1. # 号截取,删除左边字符,保留右边字符. echo ${var#*//} 其中 var 是变量名,# 号是运算符,*/ ...

  8. cv::mat转换成QImage的问题

    在进行cv::mat转换为QImage过程中,经常出现问题: cv::Mat image; ...QImage img=QImage((const unsigned char*)(image.data ...

  9. 第六篇、微信小程序-form组件

    表单: 将组件内的用户输入的<switch/> <input/> <checkbox/> <slider/> <radio/> <pi ...

  10. CSS常见的浏览器前缀

    为了让浏览器识别某些专属属性,有时候需要在CSS属性前增加浏览器前缀 -ms-:Microsoft IE -moz-:Mozilla Firefox -o-:Opera Opera -webkit-: ...