一個牛人給JAVA初學者的建議

給初學者之一:淺談java及應用

學java不知不覺也已經三年了,從不知java爲何物到現在一個小小的j2ee項目經理。雖說不上此道高手,大概也算有點斤兩了吧,每次上網,泡bbs逛論壇,沒少去java相關的版面,總體感覺初學者多,高手少,精通的更少。由於我國高等教育制度教材陳舊,加上java自身發展不過十年左右的時間,還有一個很重要的原因就是java這門語言更適合商業應用,所以高校裏大部分博士老師們對此語言的瞭解甚至不比本科生多。在這種環境下,很多人對java感到茫然,不知所措,不懂java能做什麼,即便知道了java很有用,也不清楚該從哪裏入手,所以就有了 java入門難這一說法。ok,那我們就從java到底能做什麼聊起。
最後,如果大家如果在自學遇到困難,想找一個java的學習環境,可以加入我們的java學習圈,點擊我加入吧,會節約很多時間,減少很多在學習中遇到的難題。
一個牛人給JAVA初學者的建議

先說什麼是java,java是一種面嚮對象語言,真正的面向對象,任何函數和變量都以類(class)封裝起來。

至於什麼是對象什麼是類,我就不廢話了。關於這兩個概念的解釋任何一本面嚮對象語言的教材裏面都有。

知道了什麼是java,那自然就會對java能幹什麼感興趣。在說java能做什麼之前,先說java作爲一個真正面嚮對象語言的優點。首先第一個,既然是真正的面向對象,那就要做到徹底的封裝。這是java和c++最大的不同,java所有的源碼以及編譯後的文件都以類的形式存在。java沒有所謂的類外部定義,所有的函數(方法)以及變量(屬性)都必須在類內部定義。這樣就不會出現一個類被切割成這裏一塊那裏一塊的情況,c++就可以,不是麼?這樣做使得整個程序的結構異常清晰,明瞭。其次第二個,最讓人歡呼雀躍的是完全屏蔽了指針,同時引入了垃圾回收機制(GC),任何一個寫過c/c++代碼的人,都會對內存管理深惡痛絕。因爲這使得我們不能把主要精力放在我們關心的事情上,而需要考慮計算機內部的一些事情,作爲一個軟件工程師,我想沒有一個人願意把大量的時間花在內存管理上,畢竟我們不是電子工程師,此時java的優勢體現出來了,它完全屏蔽了內存管理。也就是說,如果你用java寫程序,寫出來的任何一個程序內存上的開銷,都不受你控制。乍一看,似乎你受到了束縛,但實際上不是這樣,因爲雖然你的程序無法對內存進行管理,降低了一定的速度,但你的程序會非常非常的安全,因爲你無法調用一個空指針

而不像以前寫c的時候那樣,成天因爲空指針而擔驚受怕。當然,如果你深入瞭解這一行,就會發現java其實也無法保證程序不去調用空的指針,但是它會在最大程度上避免空指針的調用。這已經很好了,安全,這是java的最突出的優點。第三個,虛擬機跨平臺,這是java最大的特點,跨平臺,可能所有人都知道windows,但是不是所有人都知道unix和java一樣,很多人都不知道unix這種操作系統幹什麼用,我不想多說unix的應用,這不是主要,但是我要說,大部分小型機,工作站,都跑在unix一族的操作系統上,比如linux/solaris,unix比起windows有一個最顯著的特點,穩定,這就好比思科和華爲,思科的機器慢但穩定,華爲的機器快但不穩定,作爲服務器這一端來說,unix在服務器端還是非常有市場的,而且很重要的windows不安全,在ms的宣傳中我想所有人都很少看到安全二字,因爲windows操作系統針對的是pc用戶,pc死機就死機咯,大不了重啓,瘟95最經常冒出來的就是藍屏,在服務器這一端上因爲ms沒有自己的芯片,所以要做系統有些力不從心啊。扯遠了,那麼java可以做到在windows上編譯

然後在unix上運行,這是c/c++做不到的。那麼說到這裏,java能做什麼逐漸清晰起來。剛纔說到了,java程序有一個的特點是安全。這個安全是針對你的系統來說得,系統在跑了java程序之後會特別地穩定,而且還能跨平臺,那麼很明顯,java主要應用於除了windows操作系統以外所有的平臺,比如手機,服務器。想想看,如果你寫的程序要跑在手機上,而手機有多少款用的是windows?就算有,那如果你用c/c++,是不是要針對每一款手機寫一套程序呢?累死,那跨平臺的java就不用,做到編譯一次,隨時運行。同樣,在服務器這一端,如果我想給一個網絡門戶站點,比如sina寫一個應用程序,pc的性能肯定無法滿足sina這樣大站點併發數量的要求,那麼它就需要買服務器,那麼服務器ms沒有市場,而且windows很不安全

那麼十之八九會買一個sun/ibm的機器,或者hp,但不管是誰的機器,它裝的操作系統也不會是windows,因爲windows太不安全了,而且多核的支持太差了。這個有空再說,那麼如果你要寫一個程序在這樣的機器上跑,難道我們就在這個機器上做開發麼?當然不可能,一般程序員開發用的都是pc,windows那麼該怎麼辦?寫一個程序,然後再拿到服務器上去編譯,去調試?肯定不可能,所以我們就希望找到一個語言,編譯完生成程序之後,在pc上調試,然後直接移植到服務器上去,那麼此時,我們就會毫不猶豫地選擇java,因爲在跨平臺以及安全性來說,java永遠是第一選擇。ok,

下面說java的缺點

一慢,這其實是一種誤區,這就好比goto語句一樣,java也拋棄了指針,雖然看上去似乎變慢了,但是在這個兩三年硬件性能就能翻番的年代,速度已經不是我們關心的問題了,而且對於企業級的應用來說,沒有什麼比安全穩定更重要的,換句話說,我們可以忍受慢,但是不能忍受死機和藍屏。而且越大型的應用,這種慢的劣勢體現得越模糊。因爲當系統項目越做越大,任何一個環節做不好都可能影響全局的情況下,安全尤其重要,而且就像goto語句一樣。這種過分追求速度的主張會給系統開發和糾錯以及維護帶來無可挽回甚至不可避免的損失,把內存交給計算機去管理吧,這種代價值得。我們做的不是pc遊戲,沒必要把內存的那一點點消耗當親爹。

二難看,又是一個誤區,很多人甚至拿出java swing控件畫出的界面來說,呵呵,其實java不是不能畫得好看,IDEA就是java寫的IDE,挺漂亮的。但爲什麼難看呢,是因爲swing控件它本身就是unix時代的產物,swing控件貼近unix界面,老外看unix界面其實挺順眼的,他們就是吃unix飯長大的,而unix又是吃百家飯的,不像ms那麼唯利是圖,所以不怎麼對中國人友好,加上我國又沒有公司在做操作系統,所以看上去是不怎麼順眼,其實玩過unix的人都知道,unix對中文的支持一直不怎麼好。

給初學者之二:從JDK說起

在知道了java有什麼優點,能做什麼之後,就該說一下java該如何去學了。在說java如何去學之前,有必要把java的幾個大方向做一個簡單說明,早在五年前,嗯,應該說是六年前,也就是99年的時候,sun公司做出了一個決定,將java應用平臺做一個劃分,畢竟在不同領域,語言應用特性是有區別的。針對不同領域內的應用,sun公司可以發佈相關高端標準來統一規範代碼,這三大塊就是J2SE,J2EE以及J2M。這個舉措今天看來無疑是非常了不起的,正是由於這次革命性的發展,使java從一種小打小鬧遊戲性的語言,發展成爲今天企業級應用的基礎。這裏要特別說明一下J2SE J2EE J2ME中2的意思,其實2就是英文單詞to的諧音,就是to的意思,而不是second edition,當然java 2本身版本號就是1.2,也有點2nd edition的味道。說點題外的,sun公司發佈的java版本很有意思,雖然總是寫是1.X但其實外界對這種版的說法也就是X.0,比如java 2,其實就是java 1.2,1.3其實就是3.0,1.4就是4.0,現在所說的5.0其實就是1.5,只是以前我們更習慣叫1.X而已。可能到了5.0以後,就全改叫X.0而不是1.X了,所以以後聽到別人說java 5.0,千萬別驚訝,其實就是1.5。在這三個J2*E中J2SE是基礎,就是java 2的標準版(java 2 standard edition),也就是最基礎的java語言部分,無論學什麼java技術,J2SE都是必須掌握的,要使用J2SE就必須安裝JDK(java development kit)。JDK在sun公司的主頁上可以免費下載,下載後需要安裝,具體安裝流程看教材。JDK包含有五個部分:核心API,集成API,用戶界面API,發佈技術還有java虛擬機(JVM)。先說運行環境,運行環境最主要要說的就是java虛擬機(JVM)

前面我們說過java是跨平臺的語言,那麼如何做到跨平臺呢?畢竟每種操作系統都是不同的,java的設計者們提出了一個虛擬機的概念,在操作系統之上建立一個統一的平臺,這個平臺必須實現某些功能以支持程序的運行。如下圖:


| program |


| JVM |


| UNIX | Windows | Linux | Solaris |..


程序員所寫的每一個程序都先運行在虛擬機上,所有操作都必須經過虛擬機才能和操作系統交互,這樣做不僅統一了所有操作系統,同時也保證了操作系統的安全。要死機的話,死的是虛擬機(JVM)而操作系統並不會受此影響,而我們所說的java運行環境指的主要是JVM,其他的不說了,省略。下面說說JDK(java development kit)的API,其實用JDK來包括運行環境以及開發工具,個人感覺是不恰當的,因爲這三個單詞僅能說明開發工具,也就是幾個標準的API,而沒有讓人感覺到有運行環境的意思在裏面,這是題外。那麼什麼是API?簡單地說就是Application Programming Interface,應用程序編程接口。在java裏面,就是一些已經寫好了的類打成的包,這又要解釋什麼是類什麼是包了,簡單說一下,包就是類的集合,一個包包含零個或多個類,嗯,具體的可以去看書,這些類是java的基礎類,常用的類,可以簡單理解成java的工具集。最後說一下JDK的發佈技術,其實按我的理解,講白了就是編譯器,將.java文件轉換成.class文件的一種技術。這三部分組成了JDK,有了JDK,就可以開發出J2SE應用軟件了,最原始的只要用一個記事本寫幾行代碼就可以了,但一般來說我們會使用效果比較好的開發工具,也就是IDE。在J2SE這一塊,特別推薦JCreator這款IDE sun公司的產品,與JDK結合得幾乎是天衣無縫,非常適合初學者使用。

教材方面中文的推薦電子工業出版社出版的《java教程》初級與高級篇各一本;還有就是《21天學通java》雖然有人說21天系列是爛書,但個人感覺對於j2se,這本書翻譯得已經很不錯了,基本沒有什麼語法錯誤,語句也很通順;最後要說的就是《thinking in java》,這本書自然很經典,說得比較細,只是我覺得不太適合初學者,其實也不難,初學者直接看也不成問題,但個人感覺還是找本教材也就是前面推薦的兩款來看比較好。基本概念的理解還是用教材的,畢竟thinking in java有的版本翻譯得很爛,而且個人建議還是看原版比較好。當然這幾本都看最好了,但如果沒時間,至少精讀其中一本,然後再看其他兩本就可以,其實三本書內容也差不多,但看問題的角度方式以及面向的讀者也都不同,嗯,怎麼說呢,找適合自己的吧。最後要說的是,由於虛擬機的存在,J2SE的大多數軟件的使用會比一般桌面軟件慢一些,效果不盡如人意,現在大概只有swing控件還在使用吧,其它沒怎麼聽說。J2EE&J2ME,這是java應用的重中之重,如果想拿高薪,最好把J2EE學好,記得以前在csdn上看過一個調查,月薪上萬的程序員主要從事哪方面的工作,十個中有八個是做J2EE的,其他兩個一個做J2ME,還有一個做嵌入式,也許有些誇張,但也從某一方面說明J2EE人才的稀缺以及應用的廣泛。所以如果想學java,只精通j2se是永遠不夠的,至少還需要時間去了解其它兩個J2*E。

給初學者之三:java企業級應用之硬件篇

總算講到企業級應用了,內容開始逐漸有趣起來。java企業級應用分爲硬件篇和軟件篇,重點在軟件,硬件是外延,嚴格地說與java沒有必然聯繫。但是,由於java是網絡語言,不瞭解硬件的一些基礎知識,軟件知道再多也沒什麼用,不要上了戰場還不知道爲什麼而打仗。硬件是軟件的基礎,在這個前提下,有必要專門花一點點篇幅來聊一下硬件。硬件,簡單地說就是我們實際生活中看得見摸得着的東西,也就是那些冰冷的機器,比如服務器,個人電腦還有網絡交換機,路由器等等。那麼先拋開網絡設備不談,先來說說計算機電腦的歷史。在很早很早以前,人類創造了第一臺電腦,那時候的電腦只是一臺用來計算的機器,無比大,無比重,無比傻,除了算其它屁事不會做,沒有所謂的人工智能與計算機網絡。但是總算是誕生了,雖然以今天的眼光去看那時候的機器巨傻無比,只配叫做計算器而不是電腦,沒有邏輯思維能力,只會死算,但千里之行,始於足下,反正是造出來了 。然後隨着時間的推移,製造業發展發展發展,電腦性能逐漸得到提升,速度快了起來,成本也逐漸低了下來。於是人們造出了第二臺,第三臺,第四臺,第五臺……第n臺計算機,人們就造出了無數臺計算機並使其成爲一種產品,逐漸應用於許多複雜計算領域,不僅僅是科研,許多生產領域也開始出現計算機的影子。然後又隨着時間的推移,人們發現不可能把所有的計算機都做成一個樣子,因爲各行各業對計算機性能的要求各不相同,於是開始把計算機劃分檔次,最簡單地是按照計算機的大小劃分就是教科書上寫的大型機,中型機,小型機//個人感覺這樣分純粹扯淡,還以爲是小孩子玩球,分爲大球,中球和小球。但是不管怎樣,計算機不再是千篇一律一個樣子了。按照性能的不同,在不同領域,出現了滿足符合不同要求的計算機。幾乎在同時,人們也開始考慮計算機之間通訊問題。人們開始考慮將不同的計算機連接起來,於是網線出現了,網絡出現了。又隨着網絡的發展,出現了一下專門爲了尋址而存在的機器,這就是路由器和交換機。然後又出現了一些公益性的組織或團體

他們制定了一系列的標準來規範以及管理我們的網絡於是3w出現了,計算機的網絡時代來臨了。嗯,說到這裏,計算機發展到今天的歷史大概說完了。我們來詳細說說網絡時代的計算機以及各個硬件供應商之間的關係。前面說到了,計算機分爲大型機,中型機和小型機……但是現在市場上沒有人這樣分,要是出去買機器,對硬件供應商說,我要買一款中型機,或者說,我要買一款小型機,硬件供應商肯定會問問題

他們會問你買機器幹什麼用的?科學計算啊還是居家用,是作服務器啊還是圖形設計,但不管怎樣,簡單地說大中小型機已經沒有什麼意義了,我們按照使用範疇來劃分。簡單劃分爲服務器,工作站還有微機,服務器(server)。服務器涵蓋了幾乎所有的大型機以及大部分中型機甚至一些小型機,用通俗點話說24小時不間斷運行提供服務的機器。比如賣飛機票(中航信),比如酒店預定(攜程),比如提供門戶站點相關服務(sina),比如電子商務(ebay,amazon,阿里巴巴),這些服務對機器都有一些特定的要求,尤其強調安全和穩定。工作站(workstation),工作站其實是圖形工作站的簡稱,說白了,就是某種功能極其強大的計算機,用於特定領域,比如工程設計,動畫製作,科學研究等。個人電腦/微機(pc)

計算機網絡的最末端,這個應該不用我說太多了,網絡時代的pc已經普及到千家萬戶。說完了分類,我們就來說說各個硬件供應商,首先是服務器還有工作站,這兩類硬件供應商主要是以下三家Sun,IBM還有HP(惠普)。然後是PC,以前IBM還有PC事業部,現在被聯想吞併了(蛇吞象),現在國際市場上有聯想和DELL(戴爾),目前戴爾還是國際老大,還有HP康柏。然後是網絡,也就是路由器和交換機,這塊市場嘛,Cisco(思科)Brocade(博科)還有McDATA三足鼎立。內核(CPU),PC內核主要是AMD和Intel,前者最近與Sun公司合作,Sun也有一部分單雙核服務器用的是AMD的。服務器與工作站內核,這一塊與硬件廠商綁定,還是Sun,IBM,HP三家自己生產。題外,在一些大型主機應用市場,比如賣飛機票,德國的漢莎,中國的中航信,香港的國泰用的都是尤利(美國的公司,英文名我忘了),其它用的是IBM的機器,現在能做大型機的感覺似乎只有IBM可以,尤利已經快倒了,技術太落後了,現在他們的系統還是fortran寫的,連c都不支持。要特別說明的是,一個超大型主機然後多個小終端/pc的結構現在越來越沒市場了。將來的趨勢是用一整個包含多個服務器的分佈式操作系統來取代這些大型主機。因爲大型主機更新換代極其困難,一旦數據量超過了主機的處理能力,那麼就要換主機,這個成本是極大的,但是如果用分佈式操作系統,那就只需要增加小服務器就行了。硬件就大概說到這裏,與大多數人沒什麼關係,因爲大多數人壓根不可能進入這些硬件領域,除非做銷售。說了這麼多,只是爲了給軟件部分打基礎而已。//做嵌入式的除外。

給初學者之四:java企業級應用之軟件篇

嗯,說過了硬件就該是軟件了,這篇是這個系列的重中之重。首先我們來說說什麼是軟件,統一一下概念。

所謂軟件通俗地說就是一套計算機程序,實現了某些功能的計算機程序。

在很早很早以前,一臺計算機的軟件是不分層次結構的。一臺計算機只有一個系統,這個系統既是操作系統又是應用軟件,與硬件緊密綁定。後來經過許多年的發展發展發展,人們把一些與硬件緊密相連的又經常用到必不可少的功能做到一套程序中去,這一套程序就被人們稱做操作系統。另外一些可有可無的,不同工作適應不同環境的功能封裝到另外一套程序中去,而這一系列程序被人們稱作應用軟件。如下圖:


|應用軟件:falshgat/IE/realplayer/winamp..|


|操作系統:UNIX/Windows/Linux/Solaris... |


前一篇我們知道,硬件分爲服務器工作站與pc,其實無論哪種硬件的軟件,都有操作系統與應用軟件。 ok,那下面我們來談應用軟件。在現在企業級應用中,我們的應用軟件一般分爲三層,三層分別是表示層,業務邏輯層,數據持久層。


|表示層|業務邏輯層|數據持久層|


1.表示層

這一層一般在客戶端pc機上,最常見的是IE瀏覽器,這就是表示層的軟件。表示層是直接與使用者交互的軟件。

2.業務邏輯層

這一層一般在服務器端,顧名思義,所有業務邏輯處理都在這一層完成。最典型的是App Server,比如IBM的websphere,BEA的weblogic還有tomcat/jboss等。這一層也是三層中的重點,我們要說的大部分內容都是關於這一層的,這個等會再說,這一層就叫做中間層。

3.數據持久層

這一層典型的就是數據庫,一般也在服務器端。但該服務器一般與裝業務邏輯層軟件的服務器分開,當然你也可以用IO輸入輸出流往硬盤上寫東西,但沒人會建議你這麼做,因爲這樣做你的數據缺乏管理,不管怎樣,這一層要做的就是保存數據,業務邏輯層軟件一般不負責保留數據,或者說業務邏輯層只負責暫時儲存數據,一關機,業務邏輯層數據全部over了,那麼數據的持久化(也就是儲存數據)就必須要在這一層完成。下面放着這些概念不談,我們來說說將來的趨勢。趨勢一:

瘦客戶端,很早很早以前,當時C/S模式也就是client/server。客戶端軟件大行其道的年代,一個pc用戶,是採用一個傻終端連接到服務器上。然後進行相應的操作,最典型的就是我們上bbs經常用的c-term。這就是那個時代的產物,同樣還有我國現行的機票定座用的e-term。後來呢,瀏覽器變得非常流行,人們發現,瀏覽器也能傳遞一些數據,雖然這些數據並不像那些終端那樣準確,但應付大多數日常需求足夠了。於是人們就提出一個瘦客戶端概念,也就是說,將來表示層所有的其他軟件疾揮?我們唯一需要的就是一個網頁瀏覽器,然後通過瀏覽器輸入ip地址連接到服務器,然後進行相關的操作。由於網頁瀏覽器一般每個操作系統都有自帶一個。這樣做就達到了給我們客戶端瘦身的目的(不需要安裝額外軟件)。這樣模式被稱作B/S模式,也就是browser/server模式。但需要指出的是,雖然瘦客戶端是趨勢,但並不代表胖客戶端沒有市場。尤其是一些複雜的業務操作,還是瀏覽器這種簡單軟件無法勝任的。趨勢二:

傻數據庫,ok,首先,我承認,這個名詞是我發明的,但我實在無法找到一個更好的表達什麼是傻數據庫,如果誰對數據庫有所瞭解的話,就知道,以前的數據庫,有自己的一套管理體系,甚至有自己的客戶端,比如oracle,mysql,Sqlserver都有。在某個管理工具上寫什麼sql語句查詢數據庫是我們以前常做的事。那麼將來我們提倡的是:將所有的業務邏輯封裝到業務邏輯層去,管理的事情由軟件來做,由業務邏輯層的軟件來做,所謂傻數據庫就是說,將來的數據庫什麼事都不用做,只用把數據給我保存好就行了,那些複雜的業務邏輯什麼外鍵什麼關聯,都沒數據庫什麼事了,都交給業務邏輯層軟件來做,這樣做的好處就是:我們就不需要這些該死難懂又複雜的數據庫系列管理工具了,而且這些工具每個數據庫都有自己的工具,完全不一樣,亂七八糟,沒有人喜歡面對他們。除了數據庫維護人員,也就是DBA,我們是軟件工程師,維護的事讓他們去做,而且嚴禁數據庫維護人員改動數據庫的數據,他們只做備份,必要時候恢復一下就是了。瞭解了這兩個趨勢之後,是不是有種砍頭去尾保中間的感覺?沒錯,未來的趨勢就是中間件時代,中間件工程師將是未來計算機應用的主流。那再次統一一下概念,什麼是中間件?記得我上學的時候,看IBM的教材,看了半天中間件定義,就看懂記住一句話,中間件是做別人不願意去做的事情,現在想想,狗屁定義,呵呵。什麼是中間件,中間件是業務邏輯層的應用軟件,是處理業務數據與客戶端之間業務邏輯的一種應用軟件,一種提供網絡服務的服務器端應用軟件。舉個非常簡單的例子,網上銀行,某個人想用IE進入工行的賬戶,然後轉帳。在這個例子中,客戶端表示層顯然是IE,數據持久層顯然是銀行的核心數據庫。那麼中間件是什麼?中間件就是提供這種服務的系統。這三層的劃分如下


|表示層 |業務邏輯層 | 數據持久層 |


| IE | 網上銀行 | 數據庫 |


給初學者之五:企業級應用之中間件

前面一篇簡單介紹了一下應用軟件的分層,下面重點介紹一下中間件,也就是業務邏輯層的軟件結構 。從本系列第二篇我們知道,java程序是跑在虛擬機之上的,大致結構如下:


| grogram |


| 虛擬機 |


| 操作系統 |


也就是說操作系統先運行一個java虛擬機,然後再在虛擬機之上運行java程序,這樣做的好處前面也說過了,就是安全,一旦出現病毒或是其他什麼東西,掛掉的是虛擬機,操作系統並不會受多大影響 。這時候有人可能會問,爲什麼非要虛擬機?把操作系統當成虛擬機爲什麼不行?可以,當然可以,但是這樣做某一個應用軟件的bug就可能造成整個操作系統的死亡。比如說我們在某個服務器上安裝了一個收發電子郵件的軟件和java虛擬機,那麼一旦***通過收發電子郵件的軟件***系統,那麼操作系統就整個玩完。那麼如果***通過java程序進行***的話,那麼死的將會是虛擬機而不是操作系統,大不了虛擬機崩潰,而操作系統正常運行不受任何影響。 舉個簡單例子,比如說最常見的是將數據庫(DB)與中間件放在同一臺服務器上


| program | |

----------------------------------------------------------| DB |

| 虛擬機 | |


| 操作系統 |


那麼此時如果沒有虛擬機,***病毒***中間件系統,就有可能造成操作系統的死亡,那此時數據庫也有可能跟着一起玩完,那損失可就大咯 。那如果此時有虛擬機,那麼一旦被***,死的是虛擬機,操作系統與數據庫不受任何影響。嗯,回顧完虛擬機,再來介紹中間件 。在很早很早以前,任何一家企業,想要搭建一個局域網系統,他需要請許多個工程師。比如說我們想搭建一個網上銀行,客戶端用瀏覽器,後臺數據庫比如說用oracle。那麼搭建這樣一個網上銀行,可能需要用到多少個工程師,我們來算一算。首先,由於客戶端用的是瀏覽器,我們需要一些瞭解網絡通訊協議以及一些瀏覽器標準的網絡工程師。其次,由於後臺數據庫用的是oracle,那我們還需要請oracle的工程師,因爲數據庫這一層每個數據庫公司的接口什麼都不一樣。然後,我們還需要一些操作系統的工程師,因爲我們的系統需要跟操作系統直接交互。最後,我們需要一些設計網上銀行系統及其相關業務的工程師 。太多了太多了,這樣一箇中間件隊伍實在太龐大了,製作維護成本實在太高了。不僅如此,這樣一箇中間件就算做出來,他們所寫的代碼也只能滿足這一家公司使用。其它公司統統不能再用,代碼重用率極低,近乎不可能重用 。畢竟這個系統中改動任何一個部分都有可能涉及到整個系統的改動 。那麼如何降低成本?

我舉出了四組的工程師:

網絡工程師,數據庫工程師,操作系統工程師以及設計網上銀行系統的業務工程師

除了最後一組設計網上銀行的業務工程師之外,前面三組工程師是不是每一個項目都需要的?就算不是每一個項目都需要,至少也是絕大多數項目需要的吧? 哪個項目能夠脫離網絡,數據庫和操作系統?不可能,在這個時代已經很少很少了。好,那既然每個項目都需要,我們是不是可以用一個產品來取代這三組的工程師呢?我們的業務工程師只需要遵循這個產品所提供的接口,進行相應的開發就行了。人們提出了一種叫做App Server也就是應用服務器的東西,應用服務器是幹什麼的?按官方的說法,應用服務器是包括有多個容器的軟件服務器。那容器是什麼?容器(Container)到底是個什麼東西我想多數人還是不清楚。在說這個之前,先介紹一下組件 。什麼是組件,組件是什麼?組件其實就是一個應用程序塊 ,但是它們不是完整的應用程序,不能單獨運行。 就有如一輛汽車,車門是一個組件,車燈也是一個組件 。但是光有車燈,車門沒有用,它們不能跑上公路 ,在java中這些組件就叫做javabean,有點像微軟以前的com組件。要特別說明的是,由於任何一個java文件編譯以後都是以類的形式存在

所以javabean肯定也是一個類,這是毫無疑問的。好,那麼容器裏裝載的是什麼呢?就是這些組件。而容器之外的程序需要和這些組件交互必須通過容器 。舉個例子,IE發送了一個請求給容器,容器通過調用其中的一個組件進行相關處理之後。將結果反饋給IE,這種與客戶端軟件交互的組件就叫做Servlet。但是組件有很多種,那麼如何區分這些組件呢? 有多種管理辦法,比如同是同樣是SERVLET,有些是通過JSP生成的,而有些是開發人員自己寫的,那麼通過JSP生成的SERVLET集中放在一個地方,而開發人員自己寫的則需要在XML裏面配置一些基本的參數。同時,不同組件有可能還需要繼承一些特定的父類或者接口,這也是容器管理的需要.還有其他的一些組件,這裏就不一一說明舉例了 .那麼容器有很多種,按照他們裝載的組件類型劃分 ,比如有裝ejb的ejb容器,有裝Servlet與jsp還有靜態頁面的web容器等.//這種只含有web容器的應用服務器也被叫做web服務器.當表示層的應用軟件通過網絡向App Server發送一個請求的時候,App Server自動找到相應容器中的組件,執行組件中的程序塊,把得到結果返還給客戶.而我們要做的事就是寫組件也就是javabean,然後放到App Server裏面去就可以了.至於怎樣與IE通訊.怎樣截獲網絡上的請求,怎樣控制對象的數量等等.這些繁瑣而無味的工作我們都不管,都由App Server去做吧,把注意力集中在業務邏輯上.App Server與其他相關軟件的關係如下圖:


| 表示層 | 業務邏輯層 |數據持久層 |


| | ----------------- | |

| IE | | javabean | | |

| -> ----------------- -> DB |

| client <- App Server <- |

| |-------------------------| |

| | 虛擬機 | |

|--------------|-------------------------|------------|

| Windows | Linux/Saloris |LinuxSaloris|

|--------------|-------------------------|------------|

圖上可以看出:虛擬機負責處理中間件與操作系統之間的交互 ,App Server則負責組件的管理以及與其他兩層的業務交互. 要說明的是上圖中還包含有應用程序客戶端容器(Application client container),管理應用程序客戶端組件的運行,應用程序客戶端和它的容器運行在客戶機.這種情況比較複雜,一般說的是兩個 server之間的通訊,比如jsp/Servlet容器在一個服務器上,而ejb容器在另外一個服務器上等等。這是分佈式操作系統大面積應用的基礎。嗯,那麼話題再回到中間件上去,什麼是中間件? App Server就是所謂的中間件,但是中間件不僅有App Server,還有其他的東西,換句話說,App Server只是中間件的一種。而關於中間件有諸多規範以及遵循這些規範的模型最流行的規範無非兩種,一個是j2ee還有一個是.net。但是.net幾乎只有微軟在用,所以很多人把.net這個規範就當成是微軟的中間件產品。也不爲過,畢竟沒幾個公司喜歡跟着微軟屁股後面跑的。

給初學者之六:java企業級應用之綜合篇

我們知道中間件有很多種規範以及相關的模型,最流行的一個是j2ee還有一個是.net。那麼各大公司關於這兩套規範各有什麼產品以及周邊呢?

一。j2ee: 黃金組合

操作系統:Solaris 應用服務器:Weblogic 數據庫:Oracle 開發工具:JBuilider/IntelliJ IDEA

優點:性能一級棒,大企業大公司做系統的首選,世界五百強幾乎都是這套組合

缺點:極貴

超級組合,也是最安全最酷的黃金組合,硬件採用SUN公司的機器。但是SUN的服務器很貴,同等價格不如去買IBM的機器。SUN的服務器支持Solaris的效果自然不用說,Solaris號稱是世界上最安全的操作系統。Oracle也是世界上最安全,性能最優的數據庫,Weblogic是當今性能最優的App Server。JBuilder和IDEA各有所長,JBuilder是Borland公司的招牌之一,是當今世界上最流行的java IDE,用delphi寫的,但網絡上評價似乎不是很好。IDEA擁有插件功能,界面在所有java IDE中最爲漂亮,東歐人開發的產品。東歐人嚴謹的作風在這個產品上體現得尤爲突出,用java寫的。IDEA甚至號稱自己被業界公認爲是最好的IDE//個人保留意見,沒有最好只有更好。但我用JBuilder的時候發現了不少bug,而至今還沒有在IDEA上發現什麼bug

個人推薦IDEA

價格方面,Solaris開源,但是SUN的服務器比較貴,Weblogic最高是34萬。oracle標準版要18.6萬,企業版要49萬,JBuilder要2.7萬左右。IDEA零售價大概是500美金,也就是5000多元。另外,雖然理論上這些產品的綜合性能要高於其他選擇,但是必須看到 ,由於產商之間的利益衝突,比如oracle也有自己的App Server,但是性能不怎樣,使得這幾種產品之間協作的性能要比預想中的要差一點點 .

二。開源系列

操作系統:- 應用服務器:JBoss 數據庫:MySql 開發工具:Netbeans

優點:便宜,性能未必最佳,但是對付中小企業足夠了

缺點:出了問題自己抗吧

嗯,這是java陣營最大的特色,免費免費,還有在開發工具這一欄Eclipse也是免費的。但後面要說,算了,換個有代表性的開源產品來 。tomcat僅有web容器而沒有ejb容器,而jboss已經集成了tomcat

也就是說下載了jboss之後,啓動的同時也就啓動了tomcat,jboss在tomcat基礎之上多加了一個ejb容器,使得jboss+tomcat成爲和weblogic,websphere之外又一個得到廣泛應用的App Server 。現在大概是這樣,中小型企業多用jboss,如果應用小一點就用tomcat,只有給那些大型企業做的項目,纔會花錢去上一個weblogic或者websphere。mysql也是開源的數據庫,做得非常不錯,如果系統對數據庫要求不高,或者安全要求不是非常嚴格,mysql是一個非常不錯的選擇。開發工具方面,netbeans是sun公司極力推廣的一種IDE,聽說在北美市場使用量已經超過eclipse了。操作系統,軟件再不用錢,服務器也要錢,看這臺機器上跑什麼操作系統就用什麼了。

三。IBM套餐

操作系統:Linux 應用服務器:Websphere 數據庫:DB2 開發工具:Eclipse/WebSphere Studio

優點:服務好,IBM可以提供全套服務,也可以替客戶承擔風險

缺點:把機器數據全部交給IBM,安全什麼的都由不得你了

呵呵,IBM全套產品,甚至包括硬件設備IBM的服務器,由於是一個公司的產品,各產品之間的協作自然不錯 。價格方面,Linux,DB2,Eclipse都是開源產品,Websphere目前零售價是33.8萬人民幣,IBM服務器不錯,可以考慮 。

四。微軟陣營

操作系統:Windows 應用服務器:.net應用服務器(好像叫IIS) 數據庫:SqlServer 開發工具:MS Visual Studio

優點:客戶端的用戶體驗良好,和客戶端諸多微軟產品的兼容性強

缺點:離開了微軟,寸步難行,和其他任何一家公司的產品都不兼容

微軟的東西,怎麼說呢,太專橫了 。微軟所有的東西都是圍繞着windows來做的,.net其實已經可以實現跨平臺了,但是微軟出於自身商業考慮 ,在其應用服務器跨平臺的實現上設置了種種障礙 ,而且針對windows,微軟做了大量的優化,可以這麼看,.net就是與windows捆綁的一套產品。所以有些人說,微軟的產品離開了windows,就是渣。而且.net開源選擇也少,安全性方面考慮,windows本身就有一堆補丁要打了。Sqlserver也不安全,至於.net到底安全不安全我不清楚,畢竟我沒怎麼用過.但整體考慮,感覺.net不是大企業的首選,鑑於其濃厚的商業背景,也不是中小企業的首選,但是必須看到 ,客戶端也就是微機pc市場已經完全被windows所壟斷,所以在一些快速開發,還有和微軟產品兼容性要求較高的領域,.net還是比較有市場的.最後一個visual studio對它之前的版本兼容,且支持c,c++,c#,vb等語言

在其傳統領域,比如寫一些桌面軟件等客戶端應用上,.net還是第一選擇.最後要說明的是 ,這些組合不是固定不變的 ,由於J2EE得到了絕大多數IT企業的支持以及JAVA跨平臺的特性,我們可以自由地定製個性化的組合 .比如我可以選擇windows+jboss+eclipse+oracle,也可以選擇solaris+websphere+IDEA+mysql等等,這些自由組合都是可以的,但是有一點必須說明 ,微軟的東西,一般來說離開了windows就不能用。比如你選擇了.net應用服務器,那操作系統就必須是windows

你選擇了Sqlserver,那就必須在windows上用。還有就是遵循j2ee規範的所有的組件都可以在不同的應用服務器上互相移植,比如你可以在測試的時候用jboss ,而在正式投產上線的時候使用websphere,只需要在配置文件中作相應改動即可。

給初學者之七:java企業級應用之術語篇

在瞭解完J2ee的相關周邊產品之後需要深入J2ee規範內部去了解一下到底這些規範

這裏介紹幾個最常用的規範,再繼續說下去之前有必要說幾個常識。Java的誕生,Java之父James Gosling早年從cmu畢業之後,從事了一段時間的開發工作,後來意外碰到一個項目,這個項目要求他用C++開發,但可愛的JG是天才,凡是天才在某方面特別突出的同時,必然有一些天生的缺陷,恩,或說共性,比如說懶,急躁和傲慢。JG既然是天才,那就必然具備這些共性,JG懶,以至於他學不好C++。不僅他學不好,當年開發出Java的那個團隊也都學不好C++。他們急噪,以至於他們中有人甚至威脅以辭職的方式離開這個需要使用CPP開發的項目。他們傲慢,所以他們決定開發出一種新的語言來取代那個該死的CPP。更可愛的是,他們一開始居然給這門語言起名C++++--//沒錯,我沒敲錯,叫什麼C加加 加加減減,意思是加上一些好東西,減去一些壞東西,天才的設定,有時候你會發現天才和傻瓜真的只有一線之隔。還好這個可愛的名字沒有被繼承下來,這些天才們給他們的產物起名叫Oak//橡樹。只是後來當他們去註冊這個名字的時候,發現這個名字已經被註冊了。於是在Sun公司的一個女職員//mm就是心細(這個說法也是我們公司mm告訴我的)的提議下,把這個可愛的語言起名爲Java,就是他們當時喝的咖啡的名字。所以我們看到Java的標誌就是一杯冒着熱氣的咖啡。JavaBean 瞭解完Java之後,再來說說什麼是JavaBean//華爲面試題JavaBean是什麼? 咖啡豆

ja,更爲科學點的解釋是,用java語言編寫的可重用的軟件組件//組件的定義前面說過了,不再重複。很形象不是麼? 將javabean放入杯子//容器,還記得容器的概念麼?web容器,ejb容器。就可以沖泡//編譯成咖啡,供客人們品嚐//運行。完美的服務。下面進入正題,再談容器。前面介紹過容器,我覺得有必要再補充一點,容器從某種意義上說其實就是一個可運行的java寫的應用程序。猶如c++/c編譯後生成的.exe文件,不同的是java編譯後的文件需要用命令行或者腳本啓動執行。由於容器是由java寫的,所以容器都能夠跨平臺。雖說如此,似乎大部分容器都針對不同的操作系統提供了不同的版本。但可以肯定的一點是,相同容器間的移植組件不需要重新編譯。。

Servlet web容器組件

Servlet確切地說,就是web容器運行的java組件,與普通javabean不同的是,Servlet定義了一系列方法//比如init()和destroy()供容器調用,調用的主要目的是爲了管理。當一個request請求被web容器截獲之後,容器分析該請求地址,然後通過一個配置文件中的映射表//web.xml。調用相應的Servlet組件處理後將結果返還給客戶端。

JSP//Java Server Page,

web容器組件。Servlet出現了之後,人們發現幾乎沒有辦法用一個非常直觀的方式去編寫頁面,畢竟頁面是html語言編寫的,而讓我們用一種流程式的處理方式去逐行教計算機如何寫html代碼太困難。在這種情況下JSP應運而生,JSP將java代碼嵌入html代碼內部,然後存成.jsp文件,再由計算機編譯生成Servlet儲存起來//注意這個過程,所以JSP和Servlet對於web容器來說其實是一種東西,雖然它們編寫遵循的標準有所不同,極大地簡化了代碼同時增加了代碼的可讀性,生產維護成本下降。值得一提的是,在制定JSP規範的過程中,借鑑了ASP的很多規範。寫過ASP並熟悉Java語言的人應該能很快掌握JSP。

EJB//Enterprise JavaBean

ejb容器組件,隨着時間的推移,人們發現普通的JavaBean似乎並不能滿足企業級應用的需要,最典型的就是虛擬機提供的垃圾回收收集機制也就是GC不夠完善。可以優化的餘地極大,在這種情況下,EJB應運而生。EJB和其它組件一樣,不過遵循了某些規範而已,但是這些規範更多的是爲充分利用機器並提高性能爲主要目的的。舉個簡單例子,比如某個web服務器有100個用戶同時連接上,由於網絡連接是瞬時連接,所以很多時候併發數並沒有100那麼大,前一秒有可能有30個請求被髮送過來並被處理,後一秒可以只有10個請求被髮送過來並被處理 ,只有在非常非常極端的情況下才有可能發生100個請求同時被髮送過來並被處理的情況 ,那麼我們是否需要保留100個那麼多個對象在服務器的內存裏面去處理這些請求呢? 很顯然,不需要,大多數時候//甚至可以說是所有時候,我不相信有那麼極端的情況 ,我們只需要保存其中的10-30%就夠了,那麼什麼時候需要20%,什麼時候需要50% ,甚至100%,這個過程就交給容器去管理,這就是ejb容器每天在乾的事 ,管理內存中活躍的對象。 恩,必須強調的一點是,由於使用的不成熟 ,我們經常把規範以及具體的應用兩個名詞混用 。舉個簡單例子,我們說Servlet,極有可能說的是Servlet規範 ,也有可能說的是一個具體的Servlet,這個就要看情況而定了 ,EJB,JSP也是如此。

JDBC

和數據庫的連接,這個嚴格說來是數據庫產商需要關心的事 ,關於AppServer如何與數據庫的連接

但是也需要開發人員做一點事,因爲AppServer不知道什麼時候組件需要用到數據庫 ,同時也需要開發人員告訴AppServer他們使用的是什麼數據庫,ip地址等等 。JDBC就是關於這一套東東的規範 ,包括數據庫的產商應提供什麼樣的接口 ,AppServer應用服務器應該如何去連接 ,開發人員應該如何去配置這些連接等等 ,還有一些數據源,連接池等概念參考相關數據在此就不再贅述 。其它的規範比如JMX等確切地說與開發人員關聯並不大了 。這類高級應用只對AppServer應用服務器產商重要 ,也不再羅嗦了 。記得聽說過這樣一種說法 ,大一時候不知道自己不知道 ,大二時候知道自己不知道 ,大三時候不知道自己知道 ,大四時候知道自己知道 。爲什麼呢,因爲大一時候剛進大學,什麼都不懂,很正常,大家都一樣 ,大二或者大三時候開始接觸知識,雖然還是不懂,但慢慢地開始學習,開始積累。過了一段時間,知道自己知道了//也就是前一種說法的大四,後一種說法的大三 。開始屁癲,開始拽得不得了,覺得自己懷才不遇,千里馬難尋伯樂的那種感覺 。有些人是大四畢業了以後開始拽,悟性高一點的,大三就開始拽,因人而異 ,這幾乎是每一個初學者經過一段時間學習後的必然階段 。不管如何,總之開始入門了,這也不是壞事 ,但最後每個人都會知道自己不知道的,也就是後一種說法的大四階段 。//前一種說法裏面的那些傢伙估計要到工作以後才能明白 ,因爲任何一門學科都博大精深,要是能在兩三年之內就統統搞懂 。那不是在吹牛就是坐井觀天,java如此,c如此,c++也是如此。 那麼到了本系列的第七集,可愛的讀者應該處在什麼階段呢? 恭喜,在看完這篇文章之後,你就基本處於知道自己不知道的那種階段 ,離拽起來還有那麼一段距離,因爲你們畢竟還沒有學習和積累一定的基礎知識 。但是騙騙外行,濛濛國企那些吃閒飯的管理人員問題不大。

給初學者之八:java高級應用之框架篇

沒錯,我沒敲錯,之所以不再聲稱是企業級應用而稱之爲高級應用是因爲下面要講的東西屬於純民間性質

是java具體應用的上層建築,可用可不用,沒有人強迫你用。首先給框架//framework 下一個定義,我想讀者你可能聽說過.net framework這個概念,沒錯,我們將要說的framework也和這個framework差不多,所不同的是.net framework的競爭對象是j2ee那一系列標準,而我們將要說到的幾個框架則應用在j2ee的不同層面。單就單個框架而言,沒有.net framework管得那麼多,但是卻要比它精專多了,而且總量加起來,也遠比微軟那一套框架要廣泛得多。回到正題,框架是什麼? 軟件工程之所以被叫做軟件工程就是因爲有那麼一批人覺得可以用工程學裏面,那些管理Project的方法來管理軟件從開發到維護這一系列流程。那麼在建築工程裏面框架是什麼? 現在建築多采用鋼筋混凝土結構,注意裏面一個很重要的詞彙:鋼筋 。託福閱讀中曾有一題聽力就是關於鋼筋結構的誕生,在美國 。恩,現代建築中多在建築起來之前,先用鋼筋搭建出一個框架出來 ,然後往鋼筋中間填入混凝土,從而形成一個完成的建築。而今天要說到的框架就是這麼一個東西在每一個軟件中間的實現 。框架就是那麼一個通過預先寫好代碼從而幫我們建立起一個軟件結構的這麼一個東西。這裏提一下框架與規範//主要指J2ee規範也就是官方標準的區別

從某種意義上說,J2ee規範本身就是一個框架,無論是web容器也好,還是ejb容器也好,它們都開發了一部分通用的代碼,並且幫助我們搭建起來了一個軟件結構,我們要做的就是往裏面填入組件。比如ejb/Servlet/jsp等等。沒錯,要這麼理解也沒錯,但是爲了避免混亂,我們還是嚴格區分開來 。本文中將要提到的框架如無特別說明,就是指的是非官方標準的框架 。規範是規範,而框架是建立在規範之上的一種東西 。可以說是標準的延續,或者說是民間的嘗試,總之是這麼一個非官方的東西。說到這裏順便提一下JCP組織也就是Java Community Process/Java社區,當初Sun公司在java發佈之初,爲了提倡開源和共項,同時也出於一個提出合理的標準的目的,而讓廣大的開發者參與標準的制定,而成立了這樣一個社區,現在還健在,網址是jcp.org 。每一個新的規範發佈之前都會在這個社區廣泛討論,最終對規範的制定產生巨大的影響,其中就包括企業級的參與者,相當有名的JBoss以及我國的金碟公司都是其中的成員。下面介紹一下幾個相當著名的框架,必須要指出的是,雖然框架大多開源但並不代表所有的框架都開源,比如.net framework,但是java框架大多數開源。言歸正傳

Struts

表示層框架,名字來源於飛機的金屬框架 。可能有讀者會提問了 ,表示層不是客戶端麼? 沒錯,但是語言這東西,衆口爍金,別人都這麼說你就不好不這麼說了 。最早表示層說的是客戶端,後來隨着時間的發展 ,人們也把服務器端直接與客戶端//比如IE,打交道的那部分也稱爲表示層//JSP+Servlet 。那麼表示層框架是幹什麼的呢? 早先大規模應用JSP的時候,人們發現,JSP裏面充斥着邏輯代碼與數據,可讀性極差,於是人們借用很早很早以前的MVC模式的思想,把表示層組件分爲V-Viewer,也就是JSP M-Model模型,一般來說是一個JavaBean ,C-Controller控制器,一般來說是一個Servlet 。所有人通過JSP和服務器打交道,發送請求,Viewer把這個請求轉發給Controller。Controller通過調用一個Model來處理該請求,然後返回數據到Viewer,這麼一個過程,從而達到數據與邏輯的剝離,增強代碼可讀性,降低維護成本。而幫助人們實現這一系列東西的就是Struts框架,就是這麼一個東西,Struts的競爭對手主要是產商們極力倡導的JSF也就是Java Server Faces。但是由於Struts出道時間早,所以應用比較多。JSF則是產商們大力支持,前景看好 ,對於這一層來說,在JSP的html代碼中出現的java語句越少越好,因爲java代碼越少說明頁面處理的業務邏輯越少,也越合理。這也是Struts最初的目的,記住這話。

Spring

大名鼎鼎的Spring框架,有人曾說2005年一片叫春之聲,指的就是該框架。Spring起源於Rod Johnson的《Expert One-on-One J2EE Design and Development》一書。Rod Johnson認爲,J2ee裏面的那一套//尤其是ejb,太重了,對於單機的系統來說,沒有必要使用那麼複雜的東西 。於是就開始設計並引導Spring小組開發出這樣一個構架,不能不說他是個天才,因爲的的確確不是所有的系統都是跨多服務器的 。沒有必要把一個簡單的系統設計得那麼複雜//天才的那幾個共性又體現出來了,Spring從誕生之日起就是針對EJB的,力爭在不少應用上取代EJB,而它也確實達到了這個目的 ,現在包括WebLogic等主流應用服務器還有主流IDE都開始逐漸接受該框架,並提供相應支持 ,提到Spring就不能不說控制反轉Ioc//Inversion of Control和依賴注射DI//Dependency Injection 。什麼叫控制反轉呢?套用好萊塢的一句名言就是:你呆着別動,到時我會找你。什麼意思呢?就好比一個皇帝和太監 ,有一天皇帝想幸某個美女,於是跟太監說,今夜我要寵幸美女 ,皇帝往往不會告訴太監,今晚幾點會回宮,會回哪張龍牀,他只會告訴太監他要哪位美女,其它一切都交由太監去安排,到了晚上皇帝回宮時,自然會有美女出現在皇帝的龍牀上,這就是控制反轉。而把美女送到皇帝的寢宮裏面去就是注射 ,太監就是是框架裏面的注射控制器類BeanFactory,負責找到美女並送到龍牀上去。整個後宮可以看成是Spring框架,美女就是Spring控制下的JavaBean。而傳統的模式就是一個飢渴男去找××× ,找領班,幫助給介紹一個云云,於是領班就開始給他張羅 ,介紹一個合適的給他,完事後,再把×××還給領班,下次再來 。這個過程中,領班就是查詢上下文Context,領班的一個職能就是給客戶找到他們所要的×××,這就是lookup()方法,領班手中的×××名錄就是JNDI//Java Naming and Directory Interface。×××就是EJB,飢渴男是客戶端,青樓是EJB容器,看到區別了麼?飢渴男去找×××很麻煩,不僅得找,用完後還得把×××給還回去,而皇帝爽翻了,什麼都不用管,交給太監去處理,控制權轉移到太監手中去了,而不是皇帝,必要時候由太監給注射進去就可以了 。看到Spring的美妙了吧,Spring還提供了與多個主流框架的支持

可以和其它開源框架集成 。

Hibernate

名字取材自ORM最早的一句玩笑話//ORM就是OR-Mapping,說用了ORM之後,程序員就可以去冬眠了,而不需要操心那麼多事。這裏不得不說的是,該框架由於做得太好,以至於被J2ee招安,成爲EJB3.0的一部分,替代原有EJB2.X裏面關於Entity Bean而成爲EJB ORM的工具。這裏解釋一下,ORM//OR-Mapping 中文名對象關係映射 ,什麼意思呢?我們知道傳統的數據庫都是關係型的 ,一條條記錄以表格的形式儲存,而表與表之間充斥着是關係/關聯。比如說一個人,名字zhaoce,性別男,年齡23,那麼數據庫中是這麼儲存的。姓名性別年齡 zhaoce m 23 某女 f 22,而實際應用服務器中的實體都是以對象的形式存在,一個個對象 ,zhaoce是以這種形式存在的

Human human=new Human();

human.setName("zhaoce")

human.setSex("m");

human.setAge(23);

這樣的,那麼我們知道,傳統的JDBC是通過一個二維字符串將數據取出,需要我們自己將其包裝成對象,在存入的時候,我們還需要將對象拆開 ,放入sql語句中

//Insert into Huamn values('zhaoce','m',23)

然後執行該sql語句,太麻煩太麻煩,ORM理念的提出改變了這一切,ORM認爲,這些東西應該由框架來做,而不是程序員,程序員做他該做的,不要爲這種破事分心,還測試半天 ,於是就出現了Hibernate,JDO,TopLink等等,甚至.net裏面也有ADO.net。過去一段時間是Hibernate和JDO爭風,現在看來Hibernate逐漸成爲主流並被官方接納,成爲規範標準之一,替代掉原來EJB2.X的ORM EntityBean,TopLink則是Oracle公司推出和Oracle數據庫結合的一種ORM,商業用軟件,貴且複雜,不過正在逐漸開放 ,而像表示層一樣,這一種專門面對數據層的代碼也被稱爲數據持久層 ,所以數據持久層這一概念有時不僅僅指代數據庫 。關於ORM,最高的境界應該是在java代碼中不出現任何一句的sql語句,注意,是不包括sql語句,Hibernate的hql以及ejb的ejb-ql不算在內。至於出現不出現hql/ejb-ql等替代ql,這要視具體情況而定,不過最好也是不出現,當然最後所說的過分理想的情況往往不現實,總之一句話 ,以sql爲代表的ql/還有hql,ejbql等/語句在代碼中出現得越少越好。記住這話,現在未必能夠理解,學了以後就懂了。這三個是目前最爲常用的框架而目前光已公佈的框架就>500 ,還在不停增加中,不可能一一列舉,有興趣的可以去看相應文檔要指出的是框架不是應用程序,只是一堆組件的有序複合,應用時不能脫離於應用服務器單獨存在。

給初學者之九:收尾

最後一篇介紹幾個常見的概念,

設計模式

這可不僅是java獨有,我看的書就是c++和smalltalk例子的。先說說什麼是設計模式。模式是什麼?模式是經驗的總結,潛規則的抽象 。什麼意思呢?比如說我們坐飛機,上飛機前需要經過幾個步驟 ,什麼安檢領取登機牌之類的,這一套流程能不能改呢? 可以,但爲什麼幾乎全世界的航空公司登機前都是這一套流程呢? 因爲航空公司經過長期實踐之後得出了一堆結論和經驗 ,並認爲這樣做纔是最安全,或說是最有效率的 ,這就是模式。模式是編程高手之間交流的橋樑 ,兩個編程高手通過統一命名的模式瞭解對方的思想 。當然不借助模式可不可以?當然可以,只是模式無處不在,你不知道而已。又比如吃飯,每吃一口飯,我們要先端碗,拿筷子,張嘴,塞飯入口,咀嚼最後吞嚥,這就是一套模式,我們給這套模式命名爲吃飯。

那麼當老爸叫吃飯的時候,我們就能明白什麼意思 。而不用老爸進來囈囈啊啊並比畫上半天,啞語也不是這麼用的 ,這就是模式,已知的模式有400多種。//好象更多,不記得了。比如數據庫有數據庫的設計模式,編程有編程的模式等等。 面向對象有常用的21種模式,需要掌握,主要分爲創建,行爲,結構三類。

J2ee有J2ee的模式,Sun公司出了一本書叫《J2EE核心模式》可以拿來看看。必需要指明的是,模式不是規範,比如吃飯模式 ,沒有人規定你吃飯非得要那麼吃,你可以端碗,上拋,張嘴在下落後連碗一起吞嚥,這也可以,只要你願意,同樣,只要你願意,你就可以不遵循模式 。模式之外還有反模式,學模式不可定勢,不要學死,活學活用,無招勝有招纔是最高境界。

JavaDoc 文檔工具,極其好用 ,可以根據註釋自動生成HTML文檔。

Ant 98年,有一位程序員在從歐洲飛回美國的飛機上想到了這麼一個東西 ,從而改變了整個世界,他的名字叫James Duncan Davidson組織管理工具,可以這麼描述它 。比如你想在編譯之後自動再次生成JavaDoc ,那麼你只需要編輯Ant腳本//對,就像Windows腳本那樣,然後批處理就可以了,不過現在Ant已經廣泛集成到IDE中去,不需要自己手動編寫,不過如果想要炫炫,據說此招百試不爽 。

JUnit 測試工具,Unit家族可不只有JUnit,還有其它版本的,這個不細說,具體實踐一下就明白了。

POJO //Plain Old Java Object 就是傳統的Java對象,也就是一個JavaBean,由虛擬機來掌握其生死 。常用的兩個管理構架/規範是Spring和EJB容器,命名由來是某人//名字我忘了,覺得我們使用了太多的規範,以至於我們都忘記了純粹的java對象,以至於我們都忽略了它的存在,所以叫了這麼一個名字 ,以喚醒人們的記憶,這個意義上來說EJB其實不能算是POJO,畢竟遵循了一堆的接口,但是不管怎樣,接口歸接口,還是沒有繼承類 ,沒有被強加什麼。//遵循可以寫空方法假遵循,所以說還是POJO也對。但是由於這種東西缺乏管理,不象Servlet有專門的容器管理並繼承了一定的類。而沒有管理的對象在虛擬機中是很危險的,因爲垃圾回收機制各個虛擬機不同。而且也不怎樣,極有可能長時間不回收,這樣在企業級的應用中呢 ,就有可能造成內存大量被佔用從而死機,毫無疑問,這種機制需要優化 。這種優化就是通過EJB容器或者Spring構架來實現。這麼做還有一個好處就是迫使程序員對每一個類做封裝

強迫他做管理,以達到防止內存泄露的目的,內存泄露最經常出現的錯誤就是引用未釋放,引用最典型體現在new這個關鍵字上,new得越多引用得越多,隨着時間地增長,有可能導致循環,不停new new new new new.....其中哪怕只要有一個new處理不當,虛擬機無法回收內存,那就極有可能完蛋,而且這種小bug越是在大的項目越是難以找到,有可能因爲一個人而影響整個項目組,所以不妨記住我的一條經驗,

好的系統框架不應該在業務邏輯流程中出現new關鍵字。現在不理解也無所謂,將來有一天會明白的 。

SOA 面向服務的構架 ,不說太多,這個屬於上上層建築 。不過不妨記住我的一句話,可以幫助理解這個概念 ,面向什麼就是對什麼做封裝 ,面向對象就是對對象做封裝 ,面向服務類似,剩下的靠悟性 。

反射 1.4新增功能,非常強大 通過反射,程序可以解析出類本身的屬性也就是變量//注意這裏說的屬性不是.net裏面的屬性,我不喜歡微軟造的新名詞,亂。還有行爲也就是方法,然後通過invoke()方法調用該方法,甚至可以新增對象等,java首創,本是其它語言所沒有的。後來被微軟抄了去,利用該功能,開源框架廣泛受益並大量採用,近乎瘋狂地使用,具體就不說了,最後要指出的是,有一種說法是利用反射會降低效率 。在早期的時候的確是,現在不會了,放心使用 。

容器 5.0以後的版本在J2SE中都出現了容器,各位甚至可以自己嘗試用標準庫去使用容器 。

推薦網站

www.javaeye.com //java視線論壇,Hibernate國內的權威

dev2dev.bea.com //bea的dev2dev社區,用WebLogic首選的好去處

www-128.ibm.com/developerworks //ibm developer works社區,ibm產品的老家

www.jdon.com //j道,Jboss國內相對討論會多一點的地方,有自己的框架

www.matrix.org.cn //matrix,有自己的框架,很清新的論壇

jcp.org //JCP,前面說到過了

sourceforge.net //開源的東西幾乎這裏都可以找到,除java外還有遊戲共享等

saloon.javaranch.com //我常去,人氣不錯

www.apache.org //阿帕奇老家

www.jboss.com //Jboss和Hibernate老家

www.springframework.org //Spring老家

www.wiki.org //非常好的百科站點,可惜國內被封,創始人加入了Eclipse zone

www.google.com //你要的這裏有,不信?輸入關鍵字再按一下那個靠左的白色按鈕試試

書籍

《Thinking in Java》 //實話說,一般,尤其是翻譯後的版本,原版還行

《Java教程》 //電子工業出版社出版的那本,上下冊,很厚,但翻譯得不錯

《21天學通Java》 //入門極好,但是《21天學通j2ee》極爛,不要買

《Mastering EJB》 //翻譯過的書質量我不清楚,估計不怎樣,請看原版書籍

《精通Hibernate》 //看清楚作者,孫衛琴,其它人的別買

其它的可以不用了,網絡上的遠比書上來得多,來得好,雖然也來得雜

最後的建議

一,不要做一個浮躁的人

二,學好英語,很重要

三,閱讀源代碼和文檔

四,共享源代碼,不要做一個功利的人

五,熱愛Java

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章