最近論壇上看到好幾個(gè)朋友都在問,如何學(xué)習(xí) Java的問題,”我已經(jīng)學(xué)習(xí)了J2SE,怎么樣才能轉(zhuǎn)向J2EE?”, “我看完了Thinking in Java, 可以學(xué)習(xí)J2EE了么?”.于是就有了寫這篇文章的想法,希望能幫助初學(xué)者少走一些彎路。也算是對(duì)自己幾年來學(xué)習(xí)Java的一個(gè)總結(jié)吧.
在開始之前有必要再討論一下J2ME, J2SE, J2EE這些概念。J2SE, The Micro Edition of the Java 2 Platform. 主要用于嵌入式Java,如手機(jī),PDA等等。J2SE, Java 2 Platform, Standard Edition, 我們通常所說的JDK(Java Development Kit)包含在此,是J2EE的基礎(chǔ)。J2EE, Java 2 Platform, Enterprise Edition , 就是所謂的企業(yè)級(jí)Java. 這些只是從API級(jí)別上的劃分,實(shí)際上Sun給J2EE的定義是:開發(fā)基于組件的多層的企業(yè)級(jí)應(yīng)用的規(guī)范。也就是為各種不同的技術(shù)定義一個(gè)Java的規(guī)范,使這些不同的技術(shù)結(jié)合起來,在Java平臺(tái)上構(gòu)建強(qiáng)壯的企業(yè)級(jí)應(yīng)用。從這一點(diǎn)來看,J2EE這個(gè)概念應(yīng)該是涵蓋J2ME, J2SE的。比如一個(gè)典型的J2EE應(yīng)用,網(wǎng)上商店, 它支持web 方式下訂單,也支持手機(jī)下訂單。顯然必須用到J2SE,J2ME. 所以也就不存在所謂的從J2SE轉(zhuǎn)向J2EE的問題了,只是后者包含的范圍更廣而已。
來看看Sun給出的J2EE 相關(guān)技術(shù)主要分為幾大塊。
1. Web Service技術(shù)
- 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. 組件模型技術(shù)(Component Model Technologies)
- Java Servlet
- JavaServer Pages
- JavaServer Faces
- Enterprise JavaBeans
- Java Message Service
- J2EE Connector Architecture
3 .管理技術(shù)(Management Technologies)
- J2EE Deployment Specification
- J2EE Management Specification
- J2EE Client Provisioning
- Java Authorization Contract for Containers
4.其他相關(guān)技術(shù)(Other J2EE Technologies)
- JDBC
- Java Data Objects (JDO)
- CORBA (Java IDL and Java RMI-IIOP)
- JavaMail
- Transactions
如此之多的技術(shù)難免使初學(xué)者無所適從,望而卻步。即使是一位經(jīng)驗(yàn)豐富的J2EE 開發(fā)者,又有幾個(gè)人敢說J2EE相關(guān)的技術(shù)我都熟練掌握了。不過作為一名普通J2EE應(yīng)用程序的開發(fā)者來說,我們只需要重點(diǎn)學(xué)習(xí)其中的一部分技術(shù)就可以了,對(duì)于其他部分只要做到心中有數(shù),哪天需要用到了知道跑哪里去找到資料就行了。以我個(gè)人的觀點(diǎn),下面這些技術(shù)是一般J2EE應(yīng)用開發(fā)人員所必須熟練掌握的。Java Server Page, Java Servlet, Enterprise JavaBean, JDBC, Transactions. 還有JAXP等XML相關(guān)技術(shù),Java Message Service, Java Mail, JDO等等是最好應(yīng)該掌握的。其他Management Technologies,Connector Architecture等等主要是給容器提供商中間件提供商參考的,應(yīng)用開發(fā)者不需要怎么關(guān)心,等用到了再去學(xué)習(xí)也不遲.
語言學(xué)習(xí)篇
首先是J2SE基礎(chǔ).學(xué)習(xí)一門新技術(shù),無外乎閱讀和實(shí)踐了. 而一本好的參考書對(duì)于初學(xué)者來說顯得格外重要. 現(xiàn)在市面上的 Java書籍可以說是鋪天蓋地, 質(zhì)量也是良莠不齊, 令初學(xué)者無所適從. 所以還是先推薦幾本書籍吧. 目前對(duì)于 Java基礎(chǔ)知識(shí),大家一般都比較推薦兩本書, <<Thinking In Java>> 和 << Core Java(TM) 2, Volume I?Fundamentals >>. 第一本書不必多說了, Bruce Eckel 的大作, Jolt獲獎(jiǎng)書籍. 內(nèi)容比較全面, 基本涵蓋了java語言的方方面面. 這本書提供了相當(dāng)豐富的例子, 非常有利于對(duì)學(xué)習(xí)內(nèi)容的了解. 另外書中第一部分對(duì)于OO基本書籍的介紹, 我覺得對(duì)于剛接觸OO的人來說幫助會(huì)很大. 而且此書是Open Source的, 可以從作者網(wǎng)上下載http://www.mindview.net/Books/TIJ/而對(duì)于習(xí)慣于讀中文版的學(xué)習(xí)者來說, 侯捷翻譯的中文版是不錯(cuò)的選擇. 要說這本說的缺點(diǎn)可能就是對(duì)于初學(xué)者來說厚了一點(diǎn), 這也是一些人并不推薦此書作為初學(xué)者學(xué)習(xí)用書的原因吧. 后面一本<<Core Java(TM) 2, Volume I?Fundamentals>>, 目前已經(jīng)是第七版了, 單從它出版的次數(shù)來看也可以看出此書受歡迎的程度, 這本書特點(diǎn)也是講述比較全面系統(tǒng), 基本上一路啃下來的話Java語言基礎(chǔ)應(yīng)該算過關(guān)了. 缺點(diǎn)也是太厚了, 有點(diǎn)像參考手冊, 前面部分花了不少篇幅講 Swing和Applet,可能對(duì)初學(xué)者不是很有用. 還有一些像<< Java in a nutshell>>也是比較不錯(cuò)的基礎(chǔ)書籍.
學(xué)習(xí)了基本的語言基礎(chǔ),別忘了最重要也是最有用的資料還是JDK文檔. 從你學(xué)習(xí)java的第一天開始JDK文檔應(yīng)該是常備手頭了. 如果你碰到問題首先想到的是到論壇上去提問而不是查閱Jdk文檔, 那先別繼續(xù)往下學(xué)習(xí)了,學(xué)會(huì)查JDK文檔先. 不夸張的說在我們的初學(xué)者論壇中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給下載回來. 安裝完后有一點(diǎn)我想提一下, 安裝路徑下有一個(gè)src.zip(有些jdk版本是src.jar), 好東西啊---JDK源代碼, 老是有人在論壇上問哪里有JDK源代碼下載, 你說東西就放在你家里還到處找. 有了這個(gè)有些問題就需要在論壇上跟人家爭來爭去了,翻開源代碼瞧一下什么疑問都沒有了. 幾個(gè)最重要的命令行工具是
javac : 編譯源文件到class文件
java: 運(yùn)行class
jar : 打包工具.
Javadoc : 生成java doc的工具.
對(duì)于初學(xué)java的人來說, 我不推薦使用IDE而 直接用文本編輯器, 然后用命令行編譯運(yùn)行. 這樣有利于理解CLASSPATH, PATH這些最基本概念. CLASSPATH是初學(xué)者比較容易感覺迷惑的地方.現(xiàn)在的 IDE太聰明了, 給個(gè)名字就給你自動(dòng)生成java source code, 自動(dòng)編譯. 可能你運(yùn)行完了你的第一個(gè)Hello World 程序, 還不知道java 和 javac是用來做什么的. 至于實(shí)際的項(xiàng)目開發(fā), 一款合適的IDE還是十分重要的, 我們稍后再對(duì)java 開發(fā)工具做一些介紹.
J2EE 基礎(chǔ)和Java語言進(jìn)階
學(xué)習(xí)完語言基礎(chǔ), 就可以比較自然地轉(zhuǎn)入J2EE實(shí)際技術(shù)的學(xué)習(xí)了. J2EE實(shí)在是比較龐雜, 而EJB, Servlet , 這些核心技術(shù)是作為每一個(gè)J2EE開發(fā)人員所需要掌握的. 關(guān)于servlet, 我比較推薦<<Core Servlet and JSP 2Edition>>和<<More Servlets and Java Server Pages>>, 第一本是Sun推薦的Servlet教材. 第二本是當(dāng)年Amazon最暢銷Java書籍, 五星級(jí)書籍. 這本書機(jī)械工業(yè)出版社有中文版叫<<Servlet 與JSP權(quán)威指南>>,感覺翻譯得還可以, 第二版好像還沒有看到有中文版. 兩本書都全面系統(tǒng)地介紹了JSP和Sevlet知識(shí), 從web服務(wù)器配置, JSP, Servlet基本編程, 標(biāo)記庫(Tag Lib), 過濾器, 事件框架都有很好地描述. 提供地例子也比較實(shí)用. 對(duì)于EJB學(xué)習(xí), 比較著名有兩本書, << Enterprise JavaBeans, 3nd Edition>> 和<< Mastering Enterprise Java Beans Third Edition>>, 兩位作者Richard Monson, Ed Roman都是屬于業(yè)界重量級(jí)人物.而Richard Monson本身就是EJB規(guī)范專家組成員.對(duì)我來說, 兩本書難分優(yōu)劣, 第二本書有個(gè)好處就是可以免費(fèi)下載http://www.theserverside.com/books/wiley/masteringEJB/index.tss.
還是那句話,不能光說不練, 不過J2EE 的練習(xí)做起來有一點(diǎn)麻煩, 應(yīng)用服務(wù)器是不可少的, 最好還得準(zhǔn)備個(gè)輕量級(jí)的數(shù)據(jù)庫. 下面簡單介紹一下這些工具.
web服務(wù)器(Servlet Container)方面有.
Tomcat. http://jakarta.apache.org/tomcat/
Jetty: http://jetty.mortbay.org/jetty/
應(yīng)用服務(wù)器常用的有,
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服務(wù)器中的老大級(jí)人物, 價(jià)格也不菲. 不過對(duì)于開發(fā)者有免費(fèi)的試用版下載.
如果單單只是學(xué)習(xí)Servlet, 推薦使用Tomcat, 它是Sun官方指定的Servlet, JSP規(guī)范的參考實(shí)現(xiàn).. 對(duì)初學(xué)者最重要的是它使用比較簡單, 自帶文檔比較齊全, 使用者眾多, 有什么問題容易在論壇上面得到幫助. 如果學(xué)習(xí)EJB的話, 推薦使用Jboss, 不僅僅是因?yàn)樗荗pen Source的,主要是配置比較簡單, 使用方便. 比如說對(duì)于連接數(shù)據(jù)庫, 對(duì)于常用的MySQL, Oracle , MS SQL等等都提供了Sample Config文件, 直接拿過來做些小改動(dòng)扔到Deploy目錄下就可以用 DataSource了, 部署J2EE應(yīng)用也簡單, 把整個(gè) .ear或者.war扔到deploy下就可以了. 唯一不方便的地方是從 Jboss3.0開始, 它的文檔開始收費(fèi)了. 但是對(duì)于一些基本的配置, 在網(wǎng)上還是非常容易找到的, 畢竟它太流行了. 至于 Weblogic, 也比較容易使用, 不過比起Jboss來個(gè)頭大了很多, 通過強(qiáng)大的管理界面使得一些常用的配置工作變得十分簡單. 和Jboss比起來它的文檔就太多了, 簡直是有點(diǎn)羅里八嗦, 比如要部署一個(gè).ear文件, 一般我們也就是直接扔到domain下的applications目錄下就會(huì)自動(dòng)deploy了, 但是要看它的文檔可是長篇大論, 容易嚇著初學(xué)者, 以為這又是什么高深的學(xué)問. 至于WebSphere, 個(gè)人不推薦初學(xué)者使用, 相比前倆個(gè)Server比較難使, 而且狂吃內(nèi)存.不過在企業(yè)級(jí)市場這個(gè)家伙表現(xiàn)不俗, 畢竟是出生于IBM這樣的豪門.
數(shù)據(jù)庫方面, 目前常見的主要有PostgreSQL, MySQL, Oracle, MS SQL, DB2等等.前面兩個(gè)是開源數(shù)據(jù)庫, 后面幾個(gè)基本上壟斷著大部分的數(shù)據(jù)庫市場. 對(duì)于初學(xué)者用來做做EJB, JDBC的練習(xí), 我推薦MySQL, 理由還是很簡單, 開源軟件不要錢, 個(gè)頭小使用方面, 用戶眾多文檔齊全. 下載地址http://www.mysql.com/products/mysql/. PostgreSQL也可以考慮, 不過國內(nèi)使用者遠(yuǎn)不如MySQL多, 所以要在論壇上問起問題來就少方便一些了, 下載地址這個(gè)階段, 在看書的同時(shí), 可以結(jié)合著學(xué)習(xí)一些優(yōu)秀的開源項(xiàng)目的源代碼. 這些開源項(xiàng)目的代碼風(fēng)格, 注釋都是值得借鑒的. 實(shí)在太懶也別忘了手頭上還有個(gè)Jdk的源代碼. 其實(shí)也不用刻意去找源代碼, 在實(shí)際的J2EE項(xiàng)目開發(fā)中, 基本上都會(huì)用到一些優(yōu)秀的開源項(xiàng)目. Framework可能會(huì)用到Spring, Struts, Log機(jī)制基本上都會(huì)JarkartaCommons Log或者Log4j, 單元測試會(huì)大多會(huì)用Junit, 結(jié)合項(xiàng)目閱讀一下其中的一些源代碼, 既可以提高自己又對(duì)項(xiàng)目會(huì)有所幫助, 說不定因此而得到PM的賞識(shí)呢. 一舉兩得, 何樂而不為呢. 呵呵, 有點(diǎn)扯遠(yuǎn)了. 過了初學(xué)者階段,該學(xué)會(huì)如何找到適合自己的Java書籍了. 歷經(jīng)數(shù)十載, 今天的Java技術(shù)已經(jīng)變的如此之龐雜, 我相信即使窮凈一個(gè)人畢生之精力也不可能把Java所有的相關(guān)技術(shù)都學(xué)通, 何況新技術(shù)還在層出不窮地推出, 3年之前誰會(huì)知道Struts會(huì)成為Web框架事實(shí)上的工業(yè)標(biāo)準(zhǔn). 2年之前誰會(huì)知道Hibernate會(huì)在今天獨(dú)領(lǐng)風(fēng)騷. 既然已經(jīng)不能指望一次性把java技術(shù)的方方面面都學(xué)個(gè)通, 在實(shí)際中也只能是需要什么技術(shù)再學(xué)習(xí)什么技術(shù)了. 而能否選擇一本好的參考書籍帶來的就是事半功倍和事倍工半 的效果. 所以我覺得花點(diǎn)時(shí)間放在選擇書籍上面還是很值得的, 否則你在后面只會(huì)花更多的時(shí)間. 下面我談?wù)勛约哼x擇書籍的一些經(jīng)驗(yàn), 不一定正確. 首先看作者, 像上面提到的那些書的作者, 都是業(yè)界鼎鼎大名的, 選擇他們的書一般錯(cuò)不了. 大家看的書多了, 自己胸中自然也會(huì)有一個(gè)list, 哪些作者是信得過的.二看出版社, 計(jì)算機(jī)書籍方面, Oreilly, Addison-Wesley都是公認(rèn)比較好的出版社. 對(duì)于目前比較流行的Java技術(shù), Oreilly的<<XXXX in Action>>系列是不錯(cuò)的選擇. 另外我還會(huì)去看看Amazon網(wǎng)站(http://www.amazon.com/)的書評(píng), 一般小于3星級(jí)的書我都不會(huì)考慮. 還有一個(gè)好去處theserverside,http://www.theserverside.com/的書評(píng), 這里的書評(píng)比較有趣,往往都有很激烈的爭論, 里面經(jīng)常會(huì)看到一些名人在發(fā)言.我要向所有Java 學(xué)習(xí)者推薦, 如果我的收藏夾里面只能存放兩個(gè)網(wǎng)站,我會(huì)選擇java.sun 和theserverside. 在這里你可以了解最新的Java動(dòng)態(tài), 可以學(xué)習(xí)第一手的Java資料, 可以看到Java高手們(里面不乏業(yè)界大腕)激烈辯論.
到此階段, Java Developer的基本功底應(yīng)該算是打好了吧,往后就是不斷學(xué)習(xí)嘍. 結(jié)束這一段之前,最后再介紹一本書Oreilly 的<<Java Threads, Second Edition >>, 因?yàn)槲矣X得多線程編程屬于 Java基本功, 每一個(gè)想學(xué)好Java的人都應(yīng)該好好掌握.
提高篇
在這個(gè)階段應(yīng)該從軟件架構(gòu), Framework層次上來學(xué)習(xí)了. 作為面向?qū)ο蟮氖ソ?jīng)<<Design Patterns>>, 這本書是不得不推薦的. 不用再多說了, 這本在面向?qū)ο箢I(lǐng)域地位完全是屬于教父級(jí)別的. 不管你學(xué)習(xí)的是什么OO語言, 不管你現(xiàn)在是用.Net還是J2EE開發(fā), 這本書都是你進(jìn)階之路上的必讀之書. 而<<Core J2EE Patterns>>則專門針對(duì)于J2EE來討論設(shè)計(jì)模式, 書中Sun Java Center的資深設(shè)計(jì)師描述了J2EE關(guān)鍵技術(shù)的模式. 最佳實(shí)踐,設(shè)計(jì)策略和經(jīng)過驗(yàn)證的解決方案. 對(duì)于每一個(gè)希望成為J2EE 架構(gòu)師或者設(shè)計(jì)師, 這本書值得一讀. 學(xué)習(xí)設(shè)計(jì)模式的時(shí)候,建議是結(jié)合實(shí)際的源代碼來看, 比如看看Junit源代碼, 你可以看到很多設(shè)計(jì)模式優(yōu)雅的實(shí)現(xiàn), 作者之一Erich Gamma本身 就是<<Design Patterns>>的作者. 至于J2EE的設(shè)計(jì)模式, Sun還開辟了專門的空間http://java.sun.com/blueprints/patterns/, 里面有對(duì)常用模式的討論又提供了詳細(xì)的源代碼樣例. 正如Grady Booch所說, 模式對(duì)于普遍問題提供了通用的解決方案, 利用模式就等于擁有一個(gè)強(qiáng)大的專家隊(duì)伍. 如果你還沒有學(xué)習(xí), 現(xiàn)在就開始吧. 此外對(duì)于面向?qū)ο蠓椒ㄕ? 極限編程的思想也應(yīng)該有所了解http://www.extremeprogramming.org/ . 對(duì)于J2EE項(xiàng)目的具體實(shí)施, Rod Johnson的<<Expert One-on-One J2EE Design and Development (Programmer to Programmer)>>也很有價(jià)值, 該書以作者豐富的實(shí)戰(zhàn)經(jīng)驗(yàn)向我們展示如何用盡可能簡單的解決方案構(gòu)建J2EE 應(yīng)用, 書中作者第一次提出這樣的觀點(diǎn), 很多時(shí)候, J2EE應(yīng)用完全沒有必要用到EJB, 對(duì)于言必稱EJB的廣大J2EE開發(fā)者來說, 怎么說也有點(diǎn)驚世咳俗的味道. 當(dāng)然, 作為Servlet和JDO兩個(gè)專家組的成員, 這可不是作者信口胡騶的. 今天風(fēng)靡Java世界的Spring 框架最初便是源于此書, 而IOC, AOP等概念更是被時(shí)下的java開發(fā)者掛在嘴邊. 最后, 作為對(duì)Java的深入學(xué)習(xí), Java技術(shù)的各個(gè)Specification也有必要一讀. 暫時(shí)就寫到這里吧.