最近論壇上看到好幾個朋友都在問,如何學習 Java的問題,“我已經學習了J2SE,怎麼樣才能轉向J2EE?”,“我看完了Thinking in Java, 可以學習J2EE了麼?”。于是就有了寫這篇文章的想法,希望能幫助初學者少走一些彎路。也算是對自己幾年來學習Java的一個總結吧。
在開始之前有必要再讨論一下J2ME,J2SE,J2EE這些概念。J2ME,The Micro Edition of the Java 2 Platform。主要用于嵌入式Java,如手機,PDA等等。J2SE,Java 2 Platform,Standard Edition,我們通常所說的JDK(Java Development Kit)包含在此,是J2EE的基礎。J2EE,Java 2 Platform,Enterprise Edition,就是所謂的企業級Java。這些隻是從API級别上的劃分,實際上Sun給J2EE的定義是:開發基于元件的多層的企業級應用的規範。也就是為各種不同的技術定義一個Java的規範,使這些不同的技術結合起來,在Java平台上建構強壯的企業級應用。從這一點來看,J2EE這個概念應該是涵蓋J2ME,J2SE的。比如一個典型的J2EE應用,網上商店,它支援web方式下訂單,也支援手機下訂單。顯然必須用到J2SE,J2ME。是以也就不存在所謂的從J2SE轉向J2EE的問題了,隻是後者包含的範圍更廣而已。
來看看Sun給出的J2EE 相關技術主要分為幾大塊。
1. Web Service技術
- Java API for XML Processing (JAXP)
- Java API for XML Registries (JAXR)
- Java API for XML-based RPC (JAX-RPC)
- SOAP with Attachments API for Java (SAAJ)
2. 元件模型技術(Component Model Technologies)
- Java Servlet
- JavaServer Pages
- JavaServer Faces
- Enterprise JavaBeans
- Java Message Service
- J2EE Connector Architecture
3. 管理技術(Management Technologies)
- J2EE Deployment Specification
- J2EE Management Specification
- J2EE Client Provisioning
- Java Authorization Contract for Containers
4. 其他相關技術(Other J2EE Technologies)
- JDBC
- Java Data Objects (JDO)
- CORBA (Java IDL and Java RMI-IIOP)
- JavaMail
- Transactions
如此之多的技術難免使初學者無所适從,望而卻步。即使是一位經驗豐富的J2EE開發者,又有幾個人敢說J2EE相關的技術我都熟練掌握了。不過作為一名普通J2EE應用程式的開發者來說,我們隻需要重點學習其中的一部分技術就可以了,對于其他部分隻要做到心中有數,哪天需要用到了知道跑哪裡去找到資料就行了。以我個人的觀點,下面這些技術是一般J2EE應用開發人員所必須熟練掌握的。Java Server Page,Java Servlet,Enterprise JavaBean,JDBC,Transactions。還有JAXP等XML相關技術,Java Message Service,Java Mail,JDO等等是最好應該掌握的。其他Management Technologies,Connector Architecture等等主要是給容器提供商中間件提供商參考的,應用開發者不需要怎麼關心,等用到了再去學習也不遲。
語言學習篇
首先是J2SE基礎。學習一門新技術,無外乎閱讀和實踐了。而一本好的參考書對于初學者來說顯得格外重要。現在市面上的 Java書籍可以說是鋪天蓋地,品質也是良莠不齊,令初學者無所适從。是以還是先推薦幾本書籍吧。目前對于Java基礎知識,大家一般都比較推薦兩本書,<<Thinking In Java>>和<< Core Java?? 2, Volume I: Fundamentals >>。第一本書不必多說了,Bruce Eckel的大作,Jolt獲獎書籍。内容比較全面,基本涵蓋了java語言的方方面面。這本書提供了相當豐富的例子,非常有利于對學習内容的了解。另外書中第一部分對于OO基本書籍的介紹,我覺得對于剛接觸OO的人來說幫助會很大。而且此書是Open Source的,可以從作者網上下載下傳http://www.mindview.net/Books/TIJ/而對于習慣于讀中文版的學習者來說,侯捷翻譯的中文版是不錯的選擇。要說這本說的缺點可能就是對于初學者來說厚了一點,這也是一些人并不推薦此書作為初學者學習用書的原因吧。後面一本<<Core Java?? 2, Volume I: Fundamentals>>,目前已經是第七版了,單從它出版的次數來看也可以看出此書受歡迎的程度,這本書特點也是講述比較全面系統,基本上一路啃下來的話Java語言基礎應該算過關了。缺點也是太厚了,有點像參考手冊,前面部分花了不少篇幅講Swing和Applet,可能對初學者不是很有用。還有一些像<< Java in a nutshell>>也是比較不錯的基礎書籍。
學習了基本的語言基礎,别忘了最重要也是最有用的資料還是JDK文檔。從你學習java的第一天開始JDK文檔應該是常備手頭了。如果你碰到問題首先想到的是到論壇上去提問而不是查閱Jdk文檔,那先别繼續往下學習了,學會查JDK文檔先。不誇張的說在我們的初學者論壇中60%的問題是光查一下JDK文檔就能解決問題的。最新JDK Documentation下載下傳位址http://java.sun.com/j2se/1.4.2/download.html(目前最新版是J2SE5 http://java.sun.com/j2se/1.5.0/download.jsp)不能光說不練,同一下載下傳頁面把JDK給下載下傳回來。安裝完後有一點我想提一下,安裝路徑下有一個src.zip(有些jdk版本是src.jar),好東西啊---JDK源代碼,老是有人在論壇上問哪裡有JDK源代碼下載下傳,你說東西就放在你家裡還到處找。有了這個有些問題就需要在論壇上跟人家争來争去了,翻開源代碼瞧一下什麼疑問都沒有了。幾個最重要的指令行工具是
javac: 編譯源檔案到class檔案
java: 運作class
jar: 打包工具。
javadoc: 生成java doc的工具。
對于初學java的人來說,我不推薦使用IDE而直接用文本編輯器,然後用指令行編譯運作。這樣有利于了解CLASSPATH,PATH這些最基本概念。CLASSPATH是初學者比較容易感覺迷惑的地方。現在的IDE太聰明了,給個名字就給你自動生成java source code,自動編譯。可能你運作完了你的第一個Hello World程式,還不知道java和javac是用來做什麼的。至于實際的項目開發,一款合适的IDE還是十分重要的,我們稍後再對java開發工具做一些介紹。
J2EE基礎和Java語言進階
學習完語言基礎,就可以比較自然地轉入J2EE實際技術的學習了。J2EE實在是比較龐雜,而EJB,Servlet,這些核心技術是作為每一個J2EE開發人員所需要掌握的。關于servlet,我比較推薦<<Core Servlet and JSP 2Edition>>和<<More Servlets and Java Server Pages>>,第一本是Sun推薦的Servlet教材。第二本是當年Amazon最暢銷Java書籍,五星級書籍。這本書機械工業出版社有中文版叫<<Servlet 與JSP權威指南>>,感覺翻譯得還可以,第二版好像還沒有看到有中文版。兩本書都全面系統地介紹了JSP和Sevlet知識,從web伺服器配置,JSP,Servlet基本程式設計,标記庫(Tag Lib),過濾器,事件架構都有很好地描述。提供地例子也比較實用。對于EJB學習,比較著名有兩本書,<< Enterprise JavaBeans, 3nd Edition>>和<< Mastering Enterprise Java Beans Third Edition>>,兩位作者Richard Monson,Ed Roman都是屬于業界重量級人物。而Richard Monson本身就是EJB規範專家組成員。對我來說,兩本書難分優劣,第二本書有個好處就是可以免費下載下傳http://www.theserverside.com/books/wiley/masteringEJB/index.tss。
還是那句話,不能光說不練,不過J2EE的練習做起來有一點麻煩,應用伺服器是不可少的,最好還得準備個輕量級的資料庫。下面簡單介紹一下這些工具。
web伺服器(Servlet Container)方面有。
Tomcat: http://jakarta.apache.org/tomcat/
Jetty: http://jetty.mortbay.org/jetty/
應用伺服器常用的有,
Jboss: http://www.jboss.org/products/index
Weblogic: http://www.bea.com/framework.jsp?CNT=index.htm&FP=/content/products/server
WebSphere: http://www-128.ibm.com/developerworks/downloads/ws/was/?S_TACT=105AGX28&S_CMP=DLMAIN。
Tomcat,Jetty,Jboss都是Open Source。Weblogic和WebSphere是J2EE伺服器中的老大級人物,價格也不菲。不過對于開發者有免費的試用版下載下傳。
如果單單隻是學習Servlet,推薦使用Tomcat,它是Sun官方指定的Servlet,JSP規範的參考實作。對初學者最重要的是它使用比較簡單,自帶文檔比較齊全,使用者衆多,有什麼問題容易在論壇上面得到幫助。如果學習EJB的話,推薦使用Jboss,不僅僅是因為它是Open Source的,主要是配置比較簡單,使用友善。比如說對于連接配接資料庫,對于常用的MySQL,Oracle,MS SQL等等都提供了Sample Config檔案,直接拿過來做些小改動扔到Deploy目錄下就可以用DataSource了,部署J2EE應用也簡單,把整個.ear或者.war扔到deploy下就可以了。唯一不友善的地方是從Jboss3.0開始,它的文檔開始收費了。但是對于一些基本的配置,在網上還是非常容易找到的,畢竟它太流行了。至于Weblogic,也比較容易使用,不過比起Jboss來個頭大了很多,通過強大的管理界面使得一些常用的配置工作變得十分簡單。和Jboss比起來它的文檔就太多了,簡直是有點羅裡八嗦,比如要部署一個.ear檔案,一般我們也就是直接扔到domain下的applications目錄下就會自動deploy了,但是要看它的文檔可是長篇大論,容易吓着初學者,以為這又是什麼高深的學問。至于WebSphere,個人不推薦初學者使用,相比前倆個Server比較難使,而且狂吃記憶體。不過在企業級市場這個家夥表現不俗,畢竟是出生于IBM這樣的豪門。
資料庫方面,目前常見的主要有PostgreSQL,MySQL,Oracle,MS SQL,DB2等等。前面兩個是開源資料庫,後面幾個基本上壟斷着大部分的資料庫市場。對于初學者用來做做EJB,JDBC的練習,我推薦MySQL,理由還是很簡單,開源軟體不要錢,個頭小使用方面,使用者衆多文檔齊全。下載下傳位址http://www.mysql.com/products/mysql/。PostgreSQL也可以考慮,不過國内使用者遠不如MySQL多,是以要在論壇上問起問題來就少友善一些了,下載下傳位址http://www.pervasive-postgres.com/downloads/。至于後面那些比較重量級的資料庫,為了做做練習而言就不用考慮了, 咱也花不起這個錢啊。
學習完J2EE的這些具體技術,這個時候進行基本的J2EE開發應該是不成問題了。此時應該考慮提高自己的代碼品質了。這裡我強烈推薦Martin Fowler的<<Refactoring: Improving the Design of Existing Code >>,這本書不是一本非常實際的書,作者完全是手把手地教你如何提高代碼品質,從具體地代碼中告訴你什麼是代碼的Bad Smell,如何去掉這些Bad Smell。不少書評是這麼說的,這本書對于初級,中級的讀者幫助是立杆見影的。至少就我接觸到的幾個學習程式設計不久的程式員,編碼品質在短期内都有很大提高。當然重構(Refactoring)這一概念并不隻針對Java語言的,它對所有OO語言都是适用的。重構的概念是如此深入人心,以至于今天幾乎所有流行的IDE工具都有對重構的支援。這裡我還想再推薦一本<<Effective Java>>。從C++過來的程式員都知道<<Effective C++>>在C++領域的地位,至今還流傳着這樣的趣話,C++程式員分為兩種,一種是讀過<<Effective C++>>的,另一種是沒有讀過C++的。雖然這本<<Effective Java>>在Java領域的影響也許沒有那麼大,但對于Java程式員絕對有相當的指導價值。作者是Sun公司的Joshua Bloch,java Collection framework的設計者。作者站在JDK設計者的角度向你介紹他的Best Practice,應該這樣做而不應該那樣做,對于JDK中某些API設計的缺陷他也毫不袒護的指出。Java語言之父James Gosling為此書寫的前言是這麼說的“I sure wish I had had this book ten years ago。 Some might think that I don\'t need any Java books, but I need this one”。這本書會讓你覺得原來你對Java還是有很多東西不了解的。舉個例子來說,對象的equals方法,我們認為它很簡單,也許你每天都在為你新寫的Class重載這個方法,但是你在重載的時候注意過“自反”,“對稱”,“傳遞”這些必須要考慮的因素,你是否同時還小心謹慎的重載了hashcode這個方法?如果沒有,建議你要讀一下這本書。讀完這本書,你會覺得離Java的距離更近了。上面兩本書都出過中文版,後面一本<<Effective Java>>還有兩個版本的中文版,第一次翻譯的比較差一點,後來機械工業出版社又委托潘愛民先生重新翻譯了一遍。同一本書在同一個出版社連續被翻譯了兩次也說明國内出版界對這本書還是比較重視的。
這個階段,在看書的同時,可以結合着學習一些優秀的開源項目的源代碼。這些開源項目的代碼風格,注釋都是值得借鑒的。實在太懶也别忘了手頭上還有個Jdk的源代碼。其實也不用刻意去找源代碼,在實際的J2EE項目開發中,基本上都會用到一些優秀的開源項目。Framework可能會用到Spring,Struts,Log機制基本上都會JarkartaCommons Log或者Log4j,單元測試會大多會用Junit,結合項目閱讀一下其中的一些源代碼,既可以提高自己又對項目會有所幫助,說不定是以而得到PM的賞識呢。一舉兩得,何樂而不為呢。呵呵,有點扯遠了。過了初學者階段,該學會如何找到适合自己的Java書籍了。曆經數十載,今天的Java技術已經變的如此之龐雜,我相信即使窮淨一個人畢生之精力也不可能把Java所有的相關技術都學通,何況新技術還在層出不窮地推出,3年之前誰會知道Struts會成為Web架構事實上的工業标準。2年之前誰會知道Hibernate會在今天獨領風騷。既然已經不能指望一次性把java技術的方方面面都學個通,在實際中也隻能是需要什麼技術再學習什麼技術了。而能否選擇一本好的參考書籍帶來的就是事半功倍和事倍工半的效果。是以我覺得花點時間放在選擇書籍上面還是很值得的,否則你在後面隻會花更多的時間。下面我談談自己選擇書籍的一些經驗,不一定正确。首先看作者,像上面提到的那些書的作者,都是業界鼎鼎大名的,選擇他們的書一般錯不了。大家看的書多了,自己胸中自然也會有一個list,哪些作者是信得過的。二看出版社,計算機書籍方面,Oreilly,Addison-Wesley都是公認比較好的出版社。對于目前比較流行的Java技術,Oreilly的<<XXXX in Action>>系列是不錯的選擇。另外我還會去看看Amazon網站(http://www.amazon.com/)的書評,一般小于3星級的書我都不會考慮。還有一個好去處theserverside,http://www.theserverside.com/的書評,這裡的書評比較有趣,往往都有很激烈的争論,裡面經常會看到一些名人在發言。我要向所有Java學習者推薦,如果我的收藏夾裡面隻能存放兩個網站,我會選擇java.sun和theserverside。在這裡你可以了解最新的Java動态,可以學習第一手的Java資料,可以看到Java高手們(裡面不乏業界大腕)激烈辯論。
到此階段,Java Developer的基本功底應該算是打好了吧,往後就是不斷學習喽。結束這一段之前,最後再介紹一本書Oreilly的<<Java Threads, Second Edition >>,因為我覺得多線程程式設計屬于Java基本功,每一個想學好Java的人都應該好好掌握。
提高篇
在這個階段應該從軟體架構,Framework層次上來學習了。作為面向對象的聖經<<Design Patterns>>, 這本書是不得不推薦的。不用再多說了,這本在面向對象領域地位完全是屬于教父級别的。不管你學習的是什麼OO語言,不管你現在是用.Net還是J2EE開發,這本書都是你進階之路上的必讀之書。而<<Core J2EE Patterns>>則專門針對于J2EE來讨論設計模式,書中Sun Java Center的資深設計師描述了J2EE關鍵技術的模式。最佳實踐,設計政策和經過驗證的解決方案。對于每一個希望成為J2EE 架構師或者設計師,這本書值得一讀。學習設計模式的時候,建議是結合實際的源代碼來看,比如看看Junit源代碼,你可以看到很多設計模式優雅的實作,作者之一Erich Gamma本身就是<<Design Patterns>>的作者。至于J2EE的設計模式,Sun還開辟了專門的空間http://java.sun.com/blueprints/patterns/,裡面有對常用模式的讨論又提供了詳細的源代碼樣例。正如Grady Booch所說,模式對于普遍問題提供了通用的解決方案,利用模式就等于擁有一個強大的專家隊伍。如果你還沒有學習,現在就開始吧。此外對于面向對象方法論,極限程式設計的思想也應該有所了解http://www.extremeprogramming.org/。對于J2EE項目的具體實施,Rod Johnson的<<Expert One-on-One J2EE Design and Development (Programmer to Programmer)>>也很有價值,該書以作者豐富的實戰經驗向我們展示如何用盡可能簡單的解決方案建構J2EE 應用,書中作者第一次提出這樣的觀點,很多時候,J2EE應用完全沒有必要用到EJB,對于言必稱EJB的廣大J2EE開發者來說,怎麼說也有點驚世咳俗的味道。當然,作為Servlet和JDO兩個專家組的成員,這可不是作者信口胡驺的。今天風靡Java世界的Spring架構最初便是源于此書,而IOC,AOP等概念更是被時下的java開發者挂在嘴邊。最後,作為對Java的深入學習,Java技術的各個Specification也有必要一讀。暫時就寫到這裡吧。