第一篇:java的建議
假設(shè)你是正在開發(fā)和維護(hù)一個(gè)包含2000個(gè)類并使用了很多框架的Java開發(fā)人員。你要如何理解這些代碼?在一個(gè)典型的Java企業(yè)項(xiàng)目小組中,大 部分能夠幫你的高級(jí)工程師看起來都很忙。文檔也很少。你需要盡快交付成果,并向項(xiàng)目組證明自己的能力。你會(huì)如何處理這種狀況?這篇文字為開始一個(gè)新項(xiàng)目的 Java開發(fā)者提供了一些建議。
0.不要試圖一下子搞懂整個(gè)項(xiàng)目
好好考慮一下,為什么理解項(xiàng)目代碼是第一位的?大部分情況是你被要求修復(fù)一個(gè)bug或者加強(qiáng)系統(tǒng)已有功能。你要做的第一件事情不是理解整個(gè)項(xiàng)目的架構(gòu)。當(dāng)對(duì)項(xiàng)目進(jìn)行維護(hù)時(shí),這樣(理解整個(gè)項(xiàng)目架構(gòu))可能會(huì)對(duì)你造成巨大的壓力。
即便是有著10年可靠編程經(jīng)驗(yàn)的Java開發(fā)者可能也沒有理解項(xiàng)目的核心工作機(jī)制,盡管他們可能已經(jīng)在這個(gè)項(xiàng)目工作超過一年(假設(shè)他們并非原始開發(fā)人員)。比如,對(duì)于認(rèn)證機(jī)制或事務(wù)管理機(jī)制。
他們是怎么做的?他們對(duì)于自己負(fù)責(zé)的部分非常了解,并且能夠交付價(jià)值給小組。每天的交付價(jià)值遠(yuǎn)比了解一些以后還不確定有沒有的東西重要的多。
1.關(guān)注于盡快交付價(jià)值
那我是否定了你對(duì)于項(xiàng)目架構(gòu)理解的熱情了么?完全不。我只是要求你盡早的交付價(jià)值,一旦你開始一個(gè)項(xiàng)目,搭建了開發(fā)環(huán)境,你就不應(yīng)該花一兩周時(shí)間才交付什么,無論他的規(guī)模大小。假如你是一個(gè)有經(jīng)驗(yàn)的程序員卻兩周都沒有任何交付,你的經(jīng)理怎么會(huì)知道你是真的在工作還是在看新聞。
所以交付可以使大家都輕松起來。不要認(rèn)為你能夠做有價(jià)值的交付前必須理解整個(gè)項(xiàng)目。這是完全錯(cuò)誤的。加一段javascript的驗(yàn)證代碼對(duì)業(yè)務(wù)就很有價(jià)值,經(jīng)理能夠通過你的交付達(dá)到對(duì)你的信任。這樣能夠向上級(jí)領(lǐng)導(dǎo)證明你的貢獻(xiàn)以及員工價(jià)值。
日復(fù)一日,在你不斷修復(fù)bug及增強(qiáng)功能之后,就能夠慢慢開始理解項(xiàng)目架構(gòu)。不要低估對(duì)系統(tǒng)方方面面理解時(shí)需要花費(fèi)的時(shí)間。花3-4天理解認(rèn)證機(jī) 制,2-3天理解事物管理。這些都是依靠之前的相似項(xiàng)目的經(jīng)歷,但關(guān)鍵還是要花時(shí)間才能透徹的理解。要在日常工作中擠出時(shí)間,不要向經(jīng)理要求特定的時(shí)間來 做這些。
找找項(xiàng)目是否有一些不斷維護(hù)的單元測(cè)試用例。有效的單元測(cè)試用例是理解大型項(xiàng)目代碼的很好途徑。單元測(cè)試能夠幫助理解代碼片段,包括一個(gè)單元的外部接口(單元如何被調(diào)用以及返回內(nèi)容)及其內(nèi)部實(shí)現(xiàn)(調(diào)試單元測(cè)試比調(diào)試整個(gè)實(shí)際用例簡(jiǎn)單許多)。
你如果能夠很好的理解一些內(nèi)容,寫一些筆記,或者畫一些類圖、時(shí)序圖、數(shù)據(jù)模型圖,以便你或日后其他的開發(fā)者維護(hù)。
2.維護(hù)大型項(xiàng)目所必須的技能
你能從事當(dāng)前的工作,必然已經(jīng)具有良好的java技術(shù)。我們來談?wù)勀軌蜃屇阍谛马?xiàng)目中良好表現(xiàn)的其他技能。大部分時(shí)間,你在項(xiàng)目中的任務(wù)是修復(fù)bug和增強(qiáng)功能。
有兩項(xiàng)很重要的技能能夠協(xié)助你維護(hù)大型項(xiàng)目代碼。
2.1 能夠迅速發(fā)現(xiàn)需要的類
在任何維護(hù)活動(dòng)中,無論是修復(fù)bug或增強(qiáng)功能,第一個(gè)動(dòng)作就是識(shí)別出當(dāng)前修復(fù)或增強(qiáng)的用例中調(diào)用的類。當(dāng)你定位到需要修復(fù)或增強(qiáng)的類/方法,就已經(jīng)完工了一半。
2.2 能夠分析變更的影響
當(dāng)你在完成必要的修改或增強(qiáng)工作后,最重要的就是要確認(rèn)你的修改沒有破壞代碼的其他部分。你要用你的java技術(shù)及對(duì)其他框架的理解找出變更可能影響的部分。下面有兩個(gè)簡(jiǎn)單的例子詳細(xì)描述了最后提及的情況:
a)當(dāng)類A的equals()方法變更后,調(diào)用一個(gè)保護(hù)A實(shí)例的List的contains()方法時(shí)就會(huì)被影響到。若Java知識(shí)不夠,很難考慮到這樣的影響。
b)在一個(gè)web項(xiàng)目中,我們假設(shè)“user id”保存在session中。一個(gè)新入程序員可能在“user id”中加入一些信息作為bug修復(fù)的方法,但是卻不知道會(huì)影響到那些關(guān)聯(lián)“user id”的用例。
當(dāng)你提高了如上兩個(gè)技能,盡管你對(duì)項(xiàng)目不是非常了解,但大部分的維護(hù)任務(wù)會(huì)變得簡(jiǎn)單很多。若你修復(fù)一個(gè)bug,你會(huì)定位并修復(fù)這個(gè)bug,并且保證變更不會(huì)破壞項(xiàng)目的其他部分。若你增強(qiáng)或加入一個(gè)特性,基本上你只需要模仿現(xiàn)有的特性使用相似的設(shè)計(jì)。
在一個(gè)在線銀行項(xiàng)目中,為什么“查看賬戶摘要”和“查看交易歷史”的設(shè)計(jì)需要巨大的差別呢?如果你理解了“查看賬戶摘要”的設(shè)計(jì),完全可以模仿開發(fā)出“查看交易歷史”的功能。
就修復(fù)bug和增強(qiáng)來說,你不必完全理解所有2000個(gè)類的工作內(nèi)容和代碼如何運(yùn)行來推動(dòng)系統(tǒng)。你若有上面的技能,就能很快定位需要修改的代碼的部分,使用良好的java和框架技能修復(fù),保證變更不會(huì)破壞項(xiàng)目的其他部分并交付,盡管你可能只知道一小部分項(xiàng)目的設(shè)計(jì)。
3.使用工具找到需要的變更內(nèi)容以及變更產(chǎn)生的影響
繼續(xù)我們盡快交付的主題,你應(yīng)當(dāng)尋找那些能夠通過盡量少的了解項(xiàng)目但能幫助你盡快實(shí)施交付的工具作為輔助。
3.1 迅速發(fā)現(xiàn)需要變更內(nèi)容的工具
無論是修復(fù)bug還是系統(tǒng)增強(qiáng),首先都要找到該用例調(diào)用的你需要修改的類及方法。基本有
兩種方式理解一個(gè)用例的工作方式,靜態(tài)代碼分析和運(yùn)行時(shí)分析。
源碼分析統(tǒng)計(jì)掃描所有代碼并且展示類之間的關(guān)系。市場(chǎng)上有很多設(shè)備與工具。比如:Architexa,AgileJ,UModel,Poseidon等。
所有的靜態(tài)代碼分析工具缺點(diǎn)在于無法確切展示用例中類或方法的運(yùn)行時(shí)調(diào)用情況。因此Java新加入了特性,如回調(diào)機(jī)制(callback patterns)。如靜態(tài)分析工具無法推斷出當(dāng)頁面提交按鈕被點(diǎn)擊時(shí)哪個(gè)Servlet被調(diào)用了。
運(yùn)行時(shí)分析工具能夠展示類和方法在用例運(yùn)行時(shí)的狀態(tài)。工具包括:MaintainJ,Diver,jSonde,Java Call Tracer等。這些工具可以捕獲運(yùn)行時(shí)的堆棧狀態(tài),并以此為一個(gè)用例生成序列圖和類圖。
序列圖展示了該用例在運(yùn)行時(shí)所有調(diào)用的方法。若你在修復(fù)一個(gè)bug,那這個(gè)bug很可能就是這些被調(diào)用的方法之一。
若你在增強(qiáng)已有功能,利用序列圖理解調(diào)用流程然后再修改。可能是新增一個(gè)驗(yàn)證,修改DAO等。
若你在新增功能,找到一些相似的特性,利用序列圖理解調(diào)用流程然后模仿開發(fā)新功能。
要小心挑選運(yùn)行時(shí)分析工具。信息過多是這類工具的主要問題。選擇一些提供簡(jiǎn)單過濾無效信息并能夠方便的查看各種視圖的工具。
3.2 迅速發(fā)現(xiàn)需要變更內(nèi)容的工具
若單元測(cè)試有效,可以通過運(yùn)行單元測(cè)試發(fā)現(xiàn)變更有沒有破壞其他測(cè)試用例。有效維護(hù)并且覆蓋大型企業(yè)應(yīng)用的單元測(cè)試還是比較少的。下面有一些針對(duì)該情況的工具。
仍然是有兩種技術(shù)靜態(tài)代碼分析和運(yùn)行時(shí)分析可以使用。市場(chǎng)中有很多靜態(tài)代碼分析工具可用。如:Lattix, Structure101, Coverity, nWire and IntelliJ’s DSM。
給定一個(gè)變更后的類,上述工具均可識(shí)別對(duì)該類存在依賴的類的集合。開發(fā)者需要根據(jù)這些信息“猜測(cè)”可能產(chǎn)生影響的用例,因?yàn)檫@些工具無法展示運(yùn)行時(shí)類之間的調(diào)用關(guān)系。
市場(chǎng)上的可以用于運(yùn)行時(shí)影響分析的工具并不多,除了MaintainJ。MaintainJ先捕獲在一個(gè)用例中調(diào)用的所有類和方法。當(dāng)所有用例的上 述信息都被捕獲之后,就很容易發(fā)現(xiàn)類的變更對(duì)用例的影響。MaintainJ能夠有效工作的前置條件就是項(xiàng)目的所有用例都應(yīng)當(dāng)先運(yùn)行一遍,以便能夠獲得運(yùn) 行時(shí)的依賴關(guān)系。
總之,目前你在迅速準(zhǔn)確分析變更影響方面,還是可以從工具中獲得有限的幫助。首先根據(jù)需要實(shí)施一些影響分析,然后根據(jù)自己或小組其他高級(jí)成員評(píng)審來判斷變更的影響。你可能需要上面提到的工具對(duì)你的判斷進(jìn)行反復(fù)確認(rèn)。
4.對(duì)上述內(nèi)容的兩個(gè)忠告
4.1 不要降低代碼質(zhì)量
為了快速交付,所以沒有全盤理解架構(gòu),但絕不能以降低代碼質(zhì)量為條件。下面是一些你可能因?yàn)橹豢紤]快速交付而引發(fā)的代碼質(zhì)量問題。
因?yàn)樾薷拇a涉及到很多的依賴,所以新增代碼相對(duì)而言風(fēng)險(xiǎn)較小。例如,有5個(gè)用例都調(diào)用了某個(gè)方法。為了改進(jìn)某個(gè)用例,你需要修改這個(gè)方法的實(shí)現(xiàn)。最簡(jiǎn)單的做法就是復(fù)制這個(gè)方法,重命名,然后在改進(jìn)的用例中調(diào)用新方法。千萬不要這么做。代碼冗余絕對(duì)是非常有害的。嘗試對(duì)方法進(jìn)行包裝或者重寫,甚至是 直接修改,然后重新測(cè)試所有用例,通常停下來想一想,然后親手去實(shí)施,是一個(gè)比較好的方式。
(伯樂在線配圖)
另一個(gè)例子是將“private”方法改為“public”,使得別的類也可以調(diào)用。盡量不要將非必須的部分暴露出來。假如為了更好的設(shè)計(jì)需要重構(gòu),就應(yīng)當(dāng)著手去做。
大部分應(yīng)用都有確定的結(jié)構(gòu)和模式來實(shí)施。修復(fù)或增強(qiáng)程序時(shí),確認(rèn)你沒有偏離這樣的模式。若對(duì)約定不確定,請(qǐng)其他的高級(jí)開發(fā)者來審核你的變更。若你必須做一些違背約定的實(shí)施,盡量放置于一個(gè)規(guī)模較小的類中(一個(gè)200行代碼的類中的私有函數(shù)應(yīng)當(dāng)不會(huì)影響應(yīng)用的整體設(shè)計(jì))
4.2 不要停止深入理解項(xiàng)目架構(gòu)
按照文章列出的方式,假設(shè)你能夠在對(duì)項(xiàng)目了解較少的情況下進(jìn)行交付并以此持續(xù)下去,可能你會(huì)停止對(duì)項(xiàng)目架構(gòu)的深入了解。這樣從長(zhǎng)遠(yuǎn)角度來說對(duì)你的職 業(yè)生涯沒有幫助。當(dāng)你的經(jīng)驗(yàn)增加時(shí),你應(yīng)當(dāng)承擔(dān)比較大的模塊任務(wù)。如構(gòu)建一個(gè)完整的新特性或者修改項(xiàng)目的一些基礎(chǔ)設(shè)計(jì)等較大的改進(jìn)。當(dāng)你能夠做這些改進(jìn) 時(shí),你對(duì)項(xiàng)目的整體架構(gòu)應(yīng)該相當(dāng)了解。文中列舉的方法是讓你在最短的時(shí)間內(nèi)提升自己,而不是阻止你完整理解整個(gè)項(xiàng)目。
5.結(jié)論
整篇文章集中在對(duì)項(xiàng)目進(jìn)行必要了解的前提下進(jìn)行快速交付。你可以在不降低代碼質(zhì)量的前提下這么做。
若修復(fù)一個(gè)bug,迅速定位并修復(fù)。有必要可以使用運(yùn)行時(shí)分析工具。若新增一個(gè)特寫,可以尋找相似特寫,理解流程(有必要使用工具)并編寫。
或許這些聽起來很簡(jiǎn)單,但是實(shí)用嗎?當(dāng)然。但前提是你有良好的java技術(shù)以及對(duì)框架足
夠了解才能先修改代碼,然后對(duì)變更影響進(jìn)行分析。對(duì)變更影響的分析比實(shí)施變更需要更多的技巧。你可能需要高級(jí)開發(fā)人員協(xié)助你分析變更影響。
大約有50%的IT可操作預(yù)算用于簡(jiǎn)單的bug修復(fù)和功能增強(qiáng)。根據(jù)文中的建議,對(duì)于維護(hù)活動(dòng)中的經(jīng)費(fèi)的節(jié)省應(yīng)當(dāng)還是很有幫助的。
第二篇:牛人對(duì)初學(xué)者學(xué)Java的建議
一個(gè)牛人給java初學(xué)者的建議 給初學(xué)者之一:淺談java及應(yīng)用 學(xué)java不知不覺也已經(jīng)三年了
從不知java為何物到現(xiàn)在一個(gè)小小的j2ee項(xiàng)目經(jīng)理
雖說不上此道高手,大概也算有點(diǎn)斤兩了吧
每次上網(wǎng),泡bbs逛論壇,沒少去java相關(guān)的版面
總體感覺初學(xué)者多,高手少,精通的更少
由于我國(guó)高等教育制度教材陳舊,加上java自身發(fā)展不過十年左右的時(shí)間
還有一個(gè)很重要的原因就是java這門語言更適合商業(yè)應(yīng)用
所以高校里大部分博士老師們對(duì)此語言的了解甚至不比本科生多
在這種環(huán)境下,很多人對(duì)java感到茫然,不知所措,不懂java能做什么
即便知道了java很有用,也不清楚該從哪里入手
所以就有了 java入門難 這一說法
ok,那我們就從java到底能做什么聊起
先說什么是java
java是一種面向?qū)ο笳Z言,真正的面向?qū)ο螅魏魏瘮?shù)和變量都以類(class)封裝起來
至于什么是對(duì)象什么是類,我就不廢話了
關(guān)于這兩個(gè)概念的解釋任何一本面向?qū)ο笳Z言的教材里面都有
知道了什么是java,那自然就會(huì)對(duì)java能干什么感興趣
在說java能做什么之前,先說java作為一個(gè)真正面向?qū)ο笳Z言的優(yōu)點(diǎn)
首先第一個(gè),既然是真正的面向?qū)ο螅蔷鸵龅綇氐椎姆庋b
這是java和c++最大的不同,java所有的源碼以及編譯后的文件都以類的形式存在
java沒有所謂的類外部定義,所有的函數(shù)(方法)以及變量(屬性)都必須在類內(nèi)部定義
這樣就不會(huì)出現(xiàn)一個(gè)類被切割成這里一塊那里一塊的情況,c++就可以,不是么?
這樣做使得整個(gè)程序的結(jié)構(gòu)異常清晰,明了
其次第二個(gè),最讓人歡呼雀躍的是完全屏蔽了指針,同時(shí)引入了垃圾回收機(jī)制
任何一個(gè)寫過c/c++代碼的人,都會(huì)對(duì)內(nèi)存管理深惡痛絕
因?yàn)檫@使得我們不能把主要精力放在我們關(guān)心的事情上
而需要考慮計(jì)算機(jī)內(nèi)部的一些事情,作為一個(gè)軟件工程師
我想沒有一個(gè)人愿意把大量的時(shí)間花在內(nèi)存管理上,畢竟我們不是電子工程師
此時(shí)java的優(yōu)勢(shì)體現(xiàn)出來了,它完全屏蔽了內(nèi)存管理
也就是說,如果你用java寫程序,寫出來的任何一個(gè)程序內(nèi)存上的開銷,都不受你控制
乍一看,似乎你受到了束縛,但實(shí)際上不是這樣
因?yàn)殡m然你的程序無法對(duì)內(nèi)存進(jìn)行管理,降低了一定的速度
但你的程序會(huì)非常非常的安全,因?yàn)槟銦o法調(diào)用一個(gè)空指針
而不像以前寫c的時(shí)候那樣,成天因?yàn)榭罩羔樁鴵?dān)驚受怕
當(dāng)然,如果你深入了解這一行,就會(huì)發(fā)現(xiàn)java其實(shí)也無法保證程序不去調(diào)用空的指針
但是它會(huì)在最大程度上避免空指針的調(diào)用
這已經(jīng)很好了,安全,這是java的最突出的優(yōu)點(diǎn)
第三個(gè),虛擬機(jī)跨平臺(tái),這是java最大的特點(diǎn),跨平臺(tái)
可能所有人都知道windows,但是不是所有人都知道unix
和java一樣,很多人都不知道unix這種操作系統(tǒng)干什么用
我不想多說unix的應(yīng)用,這不是主要,但是我要說,大部分小型機(jī)
工作站,都跑在unix一族的操作系統(tǒng)上,比如linux/solaris
unix比起windows有一個(gè)最顯著的特點(diǎn),穩(wěn)定,這就好比思科和華為
思科的機(jī)器慢但穩(wěn)定,華為的機(jī)器快但不穩(wěn)定,作為服務(wù)器這一端來說
要的皇怯卸囁歟俏榷ǎ評(píng)nix在服務(wù)器端還是非常有市場(chǎng)的
而且很重要的windows不安全,在ms的宣傳中我想所有人都很少看到安全二字
因?yàn)閣indows操作系統(tǒng)針對(duì)的是pc用戶,pc死機(jī)就死機(jī)咯,大不了重啟
瘟95最經(jīng)常冒出來的就是藍(lán)屏,在服務(wù)器這一端上因?yàn)閙s沒有自己的芯片
所以要做系統(tǒng)有些力不從心啊。扯遠(yuǎn)了,那么java可以做到在windows上編譯
然后在unix上運(yùn)行,這是c/c++做不到的那么說到這里,java能做什么逐漸清晰起來
剛才說到了,java程序有一個(gè)的特點(diǎn)是安全
這個(gè)安全是針對(duì)你的系統(tǒng)來說得,系統(tǒng)在跑了java程序之后會(huì)特別地穩(wěn)定
而且還能跨平臺(tái),那么很明顯,java主要應(yīng)用于除了windows操作系統(tǒng)以外所有的平臺(tái)
比如手機(jī),服務(wù)器
想想看,如果你寫的程序要跑在手機(jī)上,而手機(jī)有多少款用的是windows?
就算有,那如果你用c/c++,是不是要針對(duì)每一款手機(jī)寫一套程序呢? 累死,那跨平臺(tái)的java就不用,做到編譯一次,隨時(shí)運(yùn)行
同樣,在服務(wù)器這一端,如果我想給一個(gè)網(wǎng)絡(luò)門戶站點(diǎn),比如sina
寫一個(gè)應(yīng)用程序,pc的性能肯定無法滿足sina這樣大站點(diǎn)并發(fā)數(shù)量的要求
那么它就需要買服務(wù)器,那么服務(wù)器ms沒有市場(chǎng),而且windows很不安全
那么十之八九會(huì)買一個(gè)sun/ibm的機(jī)器,或者h(yuǎn)p,但不管是誰的機(jī)器
它裝的操作系統(tǒng)也不會(huì)是windows,因?yàn)閣indows太不安全了,而且多核的支持太差了
這個(gè)有空再說,那么如果你要寫一個(gè)程序在這樣的機(jī)器上跑
難道我們就在這個(gè)機(jī)器上做開發(fā)么?當(dāng)然不可能,一般程序員開發(fā)用的都是pc,windows
那么該怎么辦?寫一個(gè)程序,然后再拿到服務(wù)器上去編譯,去調(diào)試?
肯定不可能,所以我們就希望找到一個(gè)語言,編譯完生成程序之后
在pc上調(diào)試,然后直接移植到服務(wù)器上去,那么此時(shí),我們就會(huì)毫不猶豫地選擇java
因?yàn)樵诳缙脚_(tái)以及安全性來說,java永遠(yuǎn)是第一選擇
ok,下面說java的缺點(diǎn)
一慢,這其實(shí)是一種誤區(qū),這就好比goto語句一樣
java也拋棄了指針,雖然看上去似乎變慢了,但是在這個(gè)兩三年硬件性能就能翻番的年代
速度已經(jīng)不是我們關(guān)心的問題了,而且對(duì)于企業(yè)級(jí)的應(yīng)用來說
沒有什么比安全穩(wěn)定更重要的,換句話說,我們可以忍受慢,但是不能忍受死機(jī)和藍(lán)屏
而且越大型的應(yīng)用,這種慢的劣勢(shì)體現(xiàn)得越模糊
因?yàn)楫?dāng)系統(tǒng)項(xiàng)目越做越大,任何一個(gè)環(huán)節(jié)做不好都可能影響全局的情況下
安全尤其重要,而且就像goto語句一樣 這種過分追求速度的主張會(huì)給系統(tǒng)開發(fā)和糾錯(cuò)以及維護(hù)帶來無可挽回甚至不可避免的損失
把內(nèi)存交給計(jì)算機(jī)去管理吧,這種代價(jià)值得
我們做的不是pc游戲,沒必要把內(nèi)存的那一點(diǎn)點(diǎn)消耗當(dāng)親爹
二難看,又是一個(gè)誤區(qū),很多人甚至拿出java swing控件畫出的界面來說
呵呵,其實(shí)java不是不能畫得好看,IDEA就是java寫的IDE,挺漂亮的
但為什么難看呢,是因?yàn)閟wing控件它本身就是unix時(shí)代的產(chǎn)物,swing控件貼近unix界面
老外看unix界面其實(shí)挺順眼的,他們就是吃u(píng)nix飯長(zhǎng)大的
而unix又是吃百家飯的,不像ms那么唯利是圖,所以不怎么對(duì)中國(guó)人友好
加上我國(guó)又沒有公司在做操作系統(tǒng),所以看上去是不怎么順眼
其實(shí)玩過unix的人都知道,unix對(duì)中文的支持一直不怎么好
三我還沒想到,其他人補(bǔ)充
給初學(xué)者之二:從JDK說起
在知道了java有什么優(yōu)點(diǎn),能做什么之后
就該說一下java該如何去學(xué)了
在說java如何去學(xué)之前,有必要把java的幾個(gè)大方向做一個(gè)簡(jiǎn)單說明
早在五年前,嗯,應(yīng)該說是六年前,也就是99年的時(shí)候
sun公司做出了一個(gè)決定,將java應(yīng)用平臺(tái)做一個(gè)劃分
畢竟在不同領(lǐng)域,語言應(yīng)用特性是有區(qū)別的 針對(duì)不同領(lǐng)域內(nèi)的應(yīng)用,sun公司可以發(fā)布相關(guān)高端標(biāo)準(zhǔn)來統(tǒng)一規(guī)范代碼
這三大塊就是J2SE,J2EE以及J2ME
這個(gè)舉措今天看來無疑是非常了不起的
正是由于這次革命性的發(fā)展,使java從一種小打小鬧游戲性的語言
發(fā)展成為今天企業(yè)級(jí)應(yīng)用的基礎(chǔ)
這里要特別說明一下J2SE J2EE J2ME中2的意思
其實(shí)2就是英文單詞to的諧音,就是to的意思
而不是second edition,當(dāng)然java 2本身版本號(hào)就是1.2,也有點(diǎn)2nd edition的味道
說點(diǎn)題外的,sun公司發(fā)布的java版本很有意思
雖然總是寫是1.X但其實(shí)外界對(duì)這種版的說法也就是X.0
比如java 2,其實(shí)就是java 1.2
1.3其實(shí)就是3.0,1.4就是4.0,現(xiàn)在所說的5.0 其實(shí)就是1.5
只是以前我們更習(xí)慣叫1.X而已
可能到了5.0以后,就全改叫X.0而不是1.X了
所以以后聽到別人說java 5.0,千萬別驚訝,其實(shí)就是1.5
在這三個(gè)J2*E中J2SE是基礎(chǔ),就是java 2的標(biāo)準(zhǔn)版(java 2 standard edition)
也就是最基礎(chǔ)的java語言部分,無論學(xué)什么java技術(shù),J2SE都是必須掌握的
要使用J2SE就必須安裝JDK(java development kit)
JDK在sun公司的主頁上可以免費(fèi)下載,下載后需要安裝,具體安裝流程看教材 JDK包含有五個(gè)部分:核心API,集成API,用戶界面API,發(fā)布技術(shù)還有java虛擬機(jī)(JVM)
先說運(yùn)行環(huán)境,運(yùn)行環(huán)境最主要要說的就是java虛擬機(jī)(JVM)
前面我們說過java是跨平臺(tái)的語言,那么如何做到跨平臺(tái)呢?畢竟每種操作系統(tǒng)都是不同的
java的設(shè)計(jì)者們提出了一個(gè)虛擬機(jī)的概念
在操作系統(tǒng)之上建立一個(gè)統(tǒng)一的平臺(tái),這個(gè)平臺(tái)必須實(shí)現(xiàn)某些功能以支持程序的運(yùn)行
如下圖:
------
|
program
|
------
|
JVM
|
------
| UNIX | Windows | Linux | Solaris |..------
程序員所寫的每一個(gè)程序都先運(yùn)行在虛擬機(jī)上
所有操作都必須經(jīng)過虛擬機(jī)才能和操作系統(tǒng)交互
這樣做不僅統(tǒng)一了所有操作系統(tǒng),同時(shí)也保證了操作系統(tǒng)的安全
要死機(jī)的話,死的是虛擬機(jī)(JVM)而操作系統(tǒng)并不會(huì)受此影響
而我們所說的java運(yùn)行環(huán)境指的主要是JVM,其他的不說了,省略
下面說說JDK(java development kit)的API,其實(shí)用JDK來包括運(yùn)行環(huán)境以及開發(fā)工具
個(gè)人感覺是不恰當(dāng)?shù)模驗(yàn)檫@三個(gè)單詞僅能說明開發(fā)工具,也就是幾個(gè)標(biāo)準(zhǔn)的API
而沒有讓人感覺到有運(yùn)行環(huán)境的意思在里面,這是題外
那么什么是API?
簡(jiǎn)單地說就是Application Programming Interface,應(yīng)用程序編程接口
在java里面,就是一些已經(jīng)寫好了的類打成的包
這又要解釋什么是類什么是包了,簡(jiǎn)單說一下,包就是類的集合
一個(gè)包包含零個(gè)或多個(gè)類,嗯,具體的可以去看書
這些類是java的基礎(chǔ)類,常用的類,可以簡(jiǎn)單理解成java的工具集
最后說一下JDK的發(fā)布技術(shù),其實(shí)按我的理解,講白了就是編譯器
將.java文件轉(zhuǎn)換成.class文件的一種技術(shù)
這三部分組成了JDK,有了JDK,就可以開發(fā)出J2SE應(yīng)用軟件了
最原始的只要用一個(gè)記事本寫幾行代碼就可以了
但一般來說我們會(huì)使用效果比較好的開發(fā)工具,也就是IDE
在J2SE這一塊,特別推薦JCreator這款I(lǐng)DE
sun公司的產(chǎn)品,與JDK結(jié)合得幾乎是天衣無縫,非常適合初學(xué)者使用
教材方面中文的推薦電子工業(yè)出版社出版的《java教程》初級(jí)與高級(jí)篇各一本
還有就是《21天學(xué)通java》雖然有人說21天系列是爛書,但個(gè)人感覺
對(duì)于j2se,這本書翻譯得已經(jīng)很不錯(cuò)了,基本沒有什么語法錯(cuò)誤,語句也很通順
最后要說的就是《thinking in java》
這本書自然很經(jīng)典,說得比較細(xì),只是我覺得不太適合初學(xué)者,其實(shí)也不難
初學(xué)者直接看也不成問題,但個(gè)人感覺還是找本教材也就是前面推薦的兩款來看比較好
基本概念的理解還是用教材的,畢竟thinking in java有的版本翻譯得很爛
而且個(gè)人建議還是看原版比較好,當(dāng)然這幾本都看最好了,但如果沒時(shí)間
至少精讀其中一本,然后再看其他兩本就可以,其實(shí)三本書內(nèi)容也差不多
但看問題的角度方式以及面向的讀者也都不同,嗯,怎么說呢,找適合自己的吧
最后要說的是
由于虛擬機(jī)的存在,J2SE的大多數(shù)軟件的使用會(huì)比一般桌面軟件慢一些
效果不盡如人意,現(xiàn)在大概只有swing控件還在使用吧,其它沒怎么聽說
J2EE&J2ME
這是java應(yīng)用的重中之重,如果想拿高薪,最好把J2EE學(xué)好
記得以前在csdn上看過一個(gè)調(diào)查,上萬的程序員主要從事哪方面的工作
十個(gè)中有八個(gè)是做J2EE的,其他兩個(gè)一個(gè)做J2ME,還有一個(gè)做嵌入式
也許有些夸張,但也從某一方面說明J2EE人才的稀缺以及應(yīng)用的廣泛
所以如果想學(xué)java,只精通j2se是永遠(yuǎn)不夠的,至少還需要時(shí)間去了解其它兩個(gè)J2*E
給初學(xué)者之三:java企業(yè)級(jí)應(yīng)用之硬件篇 總算講到企業(yè)級(jí)應(yīng)用了,內(nèi)容開始逐漸有趣起來
java企業(yè)級(jí)應(yīng)用分為硬件篇和軟件篇
重點(diǎn)在軟件,硬件是外延,嚴(yán)格地說與java沒有必然聯(lián)系
但是,由于java是網(wǎng)絡(luò)語言,不了解硬件的一些基礎(chǔ)知識(shí)
軟件知道再多也沒什么用,不要上了戰(zhàn)場(chǎng)還不知道為什么而打仗 硬件是軟件的基礎(chǔ),在這個(gè)前提下,有必要專門花一點(diǎn)點(diǎn)篇幅來聊一下硬件
硬件,簡(jiǎn)單地說就是我們實(shí)際生活中看得見摸得著的東西
也就是那些冰冷的機(jī)器,比如服務(wù)器,個(gè)人電腦還有網(wǎng)絡(luò)交換機(jī),路由器等等
那么先拋開網(wǎng)絡(luò)設(shè)備不談,先來說說計(jì)算機(jī)電腦的歷史
在很早很早以前,人類創(chuàng)造了第一臺(tái)電腦,那時(shí)候的電腦只是一臺(tái)用來計(jì)算的機(jī)器
無比大,無比重,無比傻,除了算其它屁事不會(huì)做,沒有所謂的人工智能與計(jì)算機(jī)網(wǎng)絡(luò)
但是總算是誕生了,雖然以今天的眼光去看那時(shí)候的機(jī)器巨傻無比
只配叫做計(jì)算器而不是電腦,沒有邏輯思維能力,只會(huì)死算
但千里之行,始于足下,反正是造出來了
然后隨著時(shí)間的推移,制造業(yè)發(fā)展發(fā)展發(fā)展
電腦性能逐漸得到提升,速度快了起來,成本也逐漸低了下來
于是人們?cè)斐隽说诙_(tái),第三臺(tái),第四臺(tái),第五臺(tái)……第n臺(tái)計(jì)算機(jī)
人們就造出了無數(shù)臺(tái)計(jì)算機(jī)并使其成為一種產(chǎn)品
逐漸應(yīng)用于許多復(fù)雜計(jì)算領(lǐng)域,不僅僅是科研,許多生產(chǎn)領(lǐng)域也開始出現(xiàn)計(jì)算機(jī)的影子
然后又隨著時(shí)間的推移,人們發(fā)現(xiàn)不可能把所有的計(jì)算機(jī)都做成一個(gè)樣子
因?yàn)楦餍懈鳂I(yè)對(duì)計(jì)算機(jī)性能的要求各不相同
于是開始把計(jì)算機(jī)劃分檔次,最簡(jiǎn)單地是按照計(jì)算機(jī)的大小劃分 就是教科書上寫的大型機(jī),中型機(jī),小型機(jī)
//個(gè)人感覺這樣分純粹扯淡,還以為是小孩子玩球,分為大球,中球和小球
但是不管怎樣,計(jì)算機(jī)不再是千篇一律一個(gè)樣子了
按照性能的不同,在不同領(lǐng)域,出現(xiàn)了滿足符合不同要求的計(jì)算機(jī)
幾乎在同時(shí),人們也開始考慮計(jì)算機(jī)之間通訊問題
人們開始考慮將不同的計(jì)算機(jī)連接起來,于是網(wǎng)線出現(xiàn)了,網(wǎng)絡(luò)出現(xiàn)了
又隨著網(wǎng)絡(luò)的發(fā)展,出現(xiàn)了一下專門為了尋址而存在的機(jī)器
這就是路由器和交換機(jī),然后又出現(xiàn)了一些公益性的組織或團(tuán)體
他們制定了一系列的標(biāo)準(zhǔn)來規(guī)范以及管理我們的網(wǎng)絡(luò)
于是3w出現(xiàn)了,計(jì)算機(jī)的網(wǎng)絡(luò)時(shí)代來臨了
嗯,說到這里,計(jì)算機(jī)發(fā)展到今天的歷史大概說完了
我們來詳細(xì)說說網(wǎng)絡(luò)時(shí)代的計(jì)算機(jī)以及各個(gè)硬件供應(yīng)商之間的關(guān)系
前面說到了,計(jì)算機(jī)分為大型機(jī),中型機(jī)和小型機(jī)……
但是現(xiàn)在市場(chǎng)上沒有人這樣分,要是出去買機(jī)器,對(duì)硬件供應(yīng)商說
我要買一款中型機(jī),或者說,我要買一款小型機(jī),硬件供應(yīng)商肯定會(huì)問問題
他們會(huì)問你買機(jī)器干什么用的?科學(xué)計(jì)算啊還是居家用,是作服務(wù)器啊還是圖形設(shè)計(jì)
但不管怎樣,簡(jiǎn)單地說大中小型機(jī)已經(jīng)沒有什么意義了
我們按照使用范疇來劃分
簡(jiǎn)單劃分為 服務(wù)器,工作站還有微機(jī)
服務(wù)器(server)
服務(wù)器涵蓋了幾乎所有的大型機(jī)以及大部分中型機(jī)甚至一些小型機(jī)
用通俗點(diǎn)話說衿骶褪悄掣齬?4小時(shí)不間斷運(yùn)行提供服務(wù)的機(jī)器
比如賣飛機(jī)票(中航信),比如酒店預(yù)定(攜程)
比如提供門戶站點(diǎn)相關(guān)服務(wù)(sina),比如電子商務(wù)(ebay,amazon,阿里巴巴)
這些服務(wù)對(duì)機(jī)器都有一些特定的要求,尤其強(qiáng)調(diào)安全和穩(wěn)定
工作站(workstation)
工作站其實(shí)是圖形工作站的簡(jiǎn)稱,說白了,就是某種功能極其強(qiáng)大的計(jì)算機(jī)
用于特定領(lǐng)域,比如工程設(shè)計(jì),動(dòng)畫制作,科學(xué)研究等
個(gè)人電腦/微機(jī)(pc)
計(jì)算機(jī)網(wǎng)絡(luò)的最末端,這個(gè)應(yīng)該不用我說太多了
網(wǎng)絡(luò)時(shí)代的pc已經(jīng)普及到千家萬戶
說完了分類,我們就來說說各個(gè)硬件供應(yīng)商
首先是服務(wù)器還有工作站
這兩類硬件供應(yīng)商主要是以下三家
Sun,IBM還有HP(惠普)
然后是PC
以前IBM還有PC事業(yè)部,現(xiàn)在被聯(lián)想吞并了(蛇吞象)
現(xiàn)在國(guó)際市場(chǎng)上有聯(lián)想和DELL(戴爾),目前戴爾還是國(guó)際老大
還有HP康柏
然后是網(wǎng)絡(luò),也就是路由器和交換機(jī)
這塊市場(chǎng)嘛,Cisco(思科)Brocade(博科)還有McDATA三足鼎立
內(nèi)核(CPU)
PC內(nèi)核
主要是AMD和Intel,前者最近與Sun公司合作,Sun也有一部分單雙核服務(wù)器用的是AMD的
服務(wù)器與工作站內(nèi)核
這一塊與硬件廠商綁定
還是Sun,IBM,HP三家自己生產(chǎn)
題外
在一些大型主機(jī)應(yīng)用市場(chǎng),比如賣飛機(jī)票
德國(guó)的漢莎,中國(guó)的中航信,香港的國(guó)泰用的都是尤利(美國(guó)的公司,英文名我忘了)
其它用的是IBM的機(jī)器,現(xiàn)在能做大型機(jī)的感覺似乎只有IBM可以
尤利已經(jīng)快倒了,技術(shù)太落后了,現(xiàn)在他們的系統(tǒng)還是fortran寫的,連c都不支持
要特別說明的是,一個(gè)超大型主機(jī)然后多個(gè)小終端/pc的結(jié)構(gòu)現(xiàn)在越來越?jīng)]市場(chǎng)了
將來的趨勢(shì)是用一整個(gè)包含多個(gè)服務(wù)器的分布式操作系統(tǒng)來取代這些大型主機(jī)
因?yàn)榇笮椭鳈C(jī)更新?lián)Q代極其困難,一旦數(shù)據(jù)量超過了主機(jī)的處理能力
那么就要換主機(jī),這個(gè)成本是極大的,但是如果用分布式操作系統(tǒng)
那就只需要增加小服務(wù)器就行了
硬件就大概說到這里,與大多數(shù)人沒什么關(guān)系
因?yàn)榇蠖鄶?shù)人壓根不可能進(jìn)入這些硬件領(lǐng)域,除非做銷售
說了這么多,只是為了給軟件部分打基礎(chǔ)而已
//做嵌入式的除外
給初學(xué)者之四:java企業(yè)級(jí)應(yīng)用之軟件篇 嗯,說過了硬件就該是軟件了
這篇是這個(gè)系列的重中之重
首先我們來說說什么是軟件,統(tǒng)一一下概念
所謂軟件通俗地說就是一套計(jì)算機(jī)程序
實(shí)現(xiàn)了某些功能的計(jì)算機(jī)程序
在很早很早以前,一臺(tái)計(jì)算機(jī)的軟件是不分層次結(jié)構(gòu)的
一臺(tái)計(jì)算機(jī)只有一個(gè)系統(tǒng),這個(gè)系統(tǒng)既是操作系統(tǒng)又是應(yīng)用軟件,與硬件緊密綁定
后來經(jīng)過許多年的發(fā)展發(fā)展發(fā)展
人們把一些與硬件緊密相連的又經(jīng)常用到必不可少的功能做到一套程序中去
這一套程序就被人們稱做操作系統(tǒng) 另外一些可有可無的,不同工作適應(yīng)不同環(huán)境的功能封裝到另外一套程序中去
而這一系列程序被人們稱作應(yīng)用軟件
如下圖:
------------
|應(yīng)用軟件:falshgat/IE/realplayer/winamp..|
------------
|操作系統(tǒng):UNIX/Windows/Linux/Solaris...|
------------
前一篇我們知道,硬件分為服務(wù)器工作站與pc
其實(shí)無論哪種硬件的軟件,都有操作系統(tǒng)與應(yīng)用軟件
ok,那下面我們來談應(yīng)用軟件
在現(xiàn)在企業(yè)級(jí)應(yīng)用中,我們的應(yīng)用軟件一般分為三層
三層分別是表示層,業(yè)務(wù)邏輯層,數(shù)據(jù)持久層
------------------------------
|表示層|業(yè)務(wù)邏輯層|數(shù)據(jù)持久層|
------------------------------
我們來說說三層中的代表軟件
表示層
這一層一般在客戶端pc機(jī)上,最常見的是IE瀏覽器,這就是表示層的軟件
表示層是直接與使用者交互的軟件
業(yè)務(wù)邏輯層 這一層一般在服務(wù)器端,顧名思義,所有業(yè)務(wù)邏輯處理都在這一層完成
最典型的是appserver,比如IBM的websphere,BEA的weblogic還有tomcat/jboss等
這一層也是三層中的重點(diǎn),我們要說的大部分內(nèi)容都是關(guān)于這一層的,這個(gè)等會(huì)再說
這一層就叫做中間層
數(shù)據(jù)持久層
這一層典型的就是數(shù)據(jù)庫,一般也在服務(wù)器端
但該服務(wù)器一般與裝業(yè)務(wù)邏輯層軟件的服務(wù)器分開
當(dāng)然你也可以用IO輸入輸出流往硬盤上寫東西
但沒人會(huì)建議你這么做,因?yàn)檫@樣做你的數(shù)據(jù)缺乏管理,不管怎樣
這一層要做的就是保存數(shù)據(jù),業(yè)務(wù)邏輯層軟件一般不負(fù)責(zé)保留數(shù)據(jù)
或者說業(yè)務(wù)邏輯層只負(fù)責(zé)暫時(shí)儲(chǔ)存數(shù)據(jù),一關(guān)機(jī),業(yè)務(wù)邏輯層數(shù)據(jù)全部over了
那么數(shù)據(jù)的持久化(也就是儲(chǔ)存數(shù)據(jù))就必須要在這一層完成下面放著這些概念不談,我們來說說將來的趨勢(shì)
趨勢(shì)一:
瘦客戶端,很早很早以前,當(dāng)時(shí)C/S模式也就是client/server
客戶端軟件大行其道的年代,一個(gè)pc用戶,是采用一個(gè)傻終端連接到服務(wù)器上
然后進(jìn)行相應(yīng)的操作,最典型的就是我們上bbs經(jīng)常用的c-term
這就是那個(gè)時(shí)代的產(chǎn)物,同樣還有我國(guó)現(xiàn)行的機(jī)票定座用的e-term
后來呢,瀏覽器變得非常流行,人們發(fā)現(xiàn),瀏覽器也能傳遞一些數(shù)據(jù)
雖然這些數(shù)據(jù)并不像那些終端那樣準(zhǔn)確,但應(yīng)付大多數(shù)日常需求足夠了
于是人們就提出一個(gè)瘦客戶端概念,也就是說,將來表示層所有的其他軟件疾揮? 我們唯一需要的就是一個(gè)網(wǎng)頁瀏覽器,然后通過瀏覽器輸入ip地址連接到服務(wù)器
然后進(jìn)行相關(guān)的操作,由于網(wǎng)頁瀏覽器一般每個(gè)操作系統(tǒng)都有自帶一個(gè)
這樣做就達(dá)到了給我們客戶端瘦身的目的(不需要安裝額外軟件)
這樣模式被稱作B/S模式,也就是browser/server模式
但需要指出的是,雖然瘦客戶端是趨勢(shì),但并不代表胖客戶端沒有市場(chǎng)
尤其是一些復(fù)雜的業(yè)務(wù)操作,還是瀏覽器這種簡(jiǎn)單軟件無法勝任的
趨勢(shì)二:
傻數(shù)據(jù)庫,ok,首先,我承認(rèn),這個(gè)名詞是我發(fā)明的,但我實(shí)在無法找到一個(gè)更好的表達(dá)
什么是傻數(shù)據(jù)庫,如果誰對(duì)數(shù)據(jù)庫有所了解的話,就知道,以前的數(shù)據(jù)庫
有自己的一套管理體系,甚至有自己的客戶端,比如oracle,mysql,sqlserver都有
在某個(gè)管理工具上寫什么sql語句查詢數(shù)據(jù)庫是我們以前常做的事
那么將來我們提倡的是:將所有的業(yè)務(wù)邏輯封裝到業(yè)務(wù)邏輯層去
管理的事情由軟件來做,由業(yè)務(wù)邏輯層的軟件來做
所謂傻數(shù)據(jù)庫就是說,將來的數(shù)據(jù)庫什么事都不用做
只用把數(shù)據(jù)給我保存好就行了,那些復(fù)雜的業(yè)務(wù)邏輯什么外鍵什么關(guān)聯(lián)
都沒數(shù)據(jù)庫什么事了,都交給業(yè)務(wù)邏輯層軟件來做
這樣做的好處就是:我們就不需要這些該死難懂又復(fù)雜的數(shù)據(jù)庫系列管理工具了
而且這些工具每個(gè)數(shù)據(jù)庫都有自己的工具,完全不一樣,亂七八糟,沒有人喜歡面對(duì)他們
除了數(shù)據(jù)庫維護(hù)人員,也就是DBA,我們是軟件工程師,維護(hù)的事讓他們?nèi)プ?/p>
而且嚴(yán)禁數(shù)據(jù)庫維護(hù)人員改動(dòng)數(shù)據(jù)庫的數(shù)據(jù),他們只做備份,必要時(shí)候恢復(fù)一下就是了
了解了這兩個(gè)趨勢(shì)之后,是不是有種砍頭去尾保中間的感覺?
沒錯(cuò),未來的趨勢(shì)就是中間件時(shí)代,中間件工程師將是未來計(jì)算機(jī)應(yīng)用的主流
那再次統(tǒng)一一下概念,什么是中間件?
記得我上學(xué)的時(shí)候,看ibm的教材,看了半天中間件定義,就看懂記住一句話
中間件是做別人不愿意去做的事情,現(xiàn)在想想,狗屁定義,呵呵
什么是中間件,中間件是業(yè)務(wù)邏輯層的應(yīng)用軟件
是處理業(yè)務(wù)數(shù)據(jù)與客戶端之間業(yè)務(wù)邏輯的一種應(yīng)用軟件
一種提供網(wǎng)絡(luò)服務(wù)的服務(wù)器端應(yīng)用軟件
舉個(gè)非常簡(jiǎn)單的例子,網(wǎng)上銀行,某個(gè)人想用IE進(jìn)入工行的賬戶,然后轉(zhuǎn)帳
在這個(gè)例子中,客戶端表示層顯然是IE,數(shù)據(jù)持久層顯然是銀行的核心數(shù)據(jù)庫
那么中間件是什么?中間件就是提供這種服務(wù)的系統(tǒng)
這三層的劃分如下
------------------------------
|表示層 | 業(yè)務(wù)邏輯層 | 數(shù)據(jù)持久層 |
------------------------------
| IE | 網(wǎng)上銀行
| 數(shù)據(jù)庫
|
------------------------------
給初學(xué)者之五:企業(yè)級(jí)應(yīng)用之中間件
前面一篇簡(jiǎn)單介紹了一下應(yīng)用軟件的分層
下面重點(diǎn)介紹一下中間件,也就是業(yè)務(wù)邏輯層的軟件結(jié)構(gòu) 從本系列第二篇我們知道,java程序是跑在虛擬機(jī)之上的 大致結(jié)構(gòu)如下:------------| grogram |------------| 虛擬機(jī)
|------------| 操作系統(tǒng) |------------也就是說操作系統(tǒng)先運(yùn)行一個(gè)java虛擬機(jī),然后再在虛擬機(jī)之上運(yùn)行java程序 這樣做的好處前面也說過了,就是安全,一旦出現(xiàn)病毒或是其他什么東西 掛掉的是虛擬機(jī),操作系統(tǒng)并不會(huì)受多大影響
這時(shí)候有人可能會(huì)問,為什么非要虛擬機(jī)?把操作系統(tǒng)當(dāng)成虛擬機(jī)為什么不行? 可以,當(dāng)然可以,但是這樣做某一個(gè)應(yīng)用軟件的bug就可能造成整個(gè)操作系統(tǒng)的死亡 比如說我們?cè)谀硞€(gè)服務(wù)器上安裝了一個(gè)收發(fā)電子郵件的軟件和java虛擬機(jī)
那么一旦黑客通過收發(fā)電子郵件的軟件入侵系統(tǒng),那么操作系統(tǒng)就整個(gè)玩完
那么如果黑客通過java程序進(jìn)行攻擊的話,那么死的將會(huì)是虛擬機(jī)而不是操作系統(tǒng) 大不了虛擬機(jī)崩潰,而操作系統(tǒng)正常運(yùn)行不受任何影響
舉個(gè)簡(jiǎn)單例子,比如說最常見的是將數(shù)據(jù)庫(DB)與中間件放在同一臺(tái)服務(wù)器上------------------------| program |
|-----------|
DB
| | 虛擬機(jī)
|
|------------------------|
操作系統(tǒng)
|------------------------那么此時(shí)如果沒有虛擬機(jī),黑客病毒攻擊中間件系統(tǒng),就有可能造成操作系統(tǒng)的死亡 那此時(shí)數(shù)據(jù)庫也有可能跟著一起玩完,那損失可就大咯
那如果此時(shí)有虛擬機(jī),那么一旦被攻擊,死的是虛擬機(jī),操作系統(tǒng)與數(shù)據(jù)庫不受任何影響
嗯,回顧完虛擬機(jī),再來介紹中間件
在很早很早以前,任何一家企業(yè),想要搭建一個(gè)局域網(wǎng)系統(tǒng),他需要請(qǐng)?jiān)S多個(gè)工程師 比如說我們想搭建一個(gè)網(wǎng)上銀行,客戶端用瀏覽器,后臺(tái)數(shù)據(jù)庫比如說用oracle
那么搭建這樣一個(gè)網(wǎng)上銀行,可能需要用到多少個(gè)工程師,我們來算一算
首先,由于客戶端用的是瀏覽器,我們需要一些了解網(wǎng)絡(luò)通訊協(xié)議以及一些瀏覽器標(biāo)準(zhǔn)的網(wǎng)絡(luò)工程師
其次,由于后臺(tái)數(shù)據(jù)庫用的是oracle,那我們還需要請(qǐng)oracle的工程師,因?yàn)閿?shù)據(jù)庫這一層每個(gè)數(shù)據(jù)庫公司的接口什么都不一樣
然后,我們還需要一些操作系統(tǒng)的工程師,因?yàn)槲覀兊南到y(tǒng)需要跟操作系統(tǒng)直接交互 最后,我們需要一些設(shè)計(jì)網(wǎng)上銀行系統(tǒng)及其相關(guān)業(yè)務(wù)的工程師 太多了太多了,這樣一個(gè)中間件隊(duì)伍實(shí)在太龐大了,制作維護(hù)成本實(shí)在太高了 不僅如此,這樣一個(gè)中間件就算做出來,他們所寫的代碼也只能滿足這一家公司使用 其它公司統(tǒng)統(tǒng)不能再用,代碼重用率極低,近乎不可能重用
畢竟這個(gè)系統(tǒng)中改動(dòng)任何一個(gè)部分都有可能涉及到整個(gè)系統(tǒng)的改動(dòng)
那么如何降低成本?
我舉出了四組的工程師:
網(wǎng)絡(luò)工程師,數(shù)據(jù)庫工程師,操作系統(tǒng)工程師以及設(shè)計(jì)網(wǎng)上銀行系統(tǒng)的業(yè)務(wù)工程師 除了最后一組設(shè)計(jì)網(wǎng)上銀行的業(yè)務(wù)工程師之外,前面三組工程師是不是每一個(gè)項(xiàng)目都需要的?
就算不是每一個(gè)項(xiàng)目都需要,至少也是絕大多數(shù)項(xiàng)目需要的吧?
哪個(gè)項(xiàng)目能夠脫離網(wǎng)絡(luò),數(shù)據(jù)庫和操作系統(tǒng)?不可能,在這個(gè)時(shí)代已經(jīng)很少很少了 好,那既然每個(gè)項(xiàng)目都需要,我們是不是可以用一個(gè)產(chǎn)品來取代這三組的工程師呢? 我們的業(yè)務(wù)工程師只需要遵循這個(gè)產(chǎn)品所提供的接口,進(jìn)行相應(yīng)的開發(fā)就行了 人們提出了一種叫做appserver也就是應(yīng)用服務(wù)器的東西
應(yīng)用服務(wù)器是干什么的?按官方的說法,應(yīng)用服務(wù)器是包括有多個(gè)容器的軟件服務(wù)器 那容器是什么?容器(Container)到底是個(gè)什么東西我想多數(shù)人還是不清楚
在說這個(gè)之前,先介紹一下組件
什么是組件,組件是什么?組件其實(shí)就是一個(gè)應(yīng)用程序塊 但是它們不是完整的應(yīng)用程序,不能單獨(dú)運(yùn)行
就有如一輛汽車,車門是一個(gè)組件,車燈也是一個(gè)組件 但是光有車燈車門沒有用,它們不能跑上公路
在java中這些組件就叫做javabean,有點(diǎn)像微軟以前的com組件 要特別說明的是,由于任何一個(gè)java文件編譯以后都是以類的形式存在 所以javabean肯定也是一個(gè)類,這是毫無疑問的
好,那么容器里裝載的是什么呢?就是這些組件
而容器之外的程序需要和這些組件交互必須通過容器
舉個(gè)例子,IE發(fā)送了一個(gè)請(qǐng)求給容器,容器通過調(diào)用其中的一個(gè)組件進(jìn)行相關(guān)處理之后 將結(jié)果反饋給IE,這種與客戶端軟件交互的組件就叫做servlet
但是組件有很多種,那么如何區(qū)分這些組件呢?
有多種管理辦法,比如同是同樣是servlet,有些是通過jsp生成的
而有些是開發(fā)人員自己寫的,那么通過jsp生成的servlet集中放在一個(gè)地方 而開發(fā)人員自己寫的則需要在xml里面配置一些基本的參數(shù)
同時(shí),不同組件有可能還需要繼承一些特定的父類或者接口,這也是容器管理的需要 還有其他的一些組件,這里就不一一說明舉例了
那么容器有很多種,按照他們裝載的組件類型劃分
比如有裝ejb的ejb容器,有裝servlet與jsp還有靜態(tài)頁面的web容器等等 //這種只含有web容器的應(yīng)用服務(wù)器也被叫做web服務(wù)器 當(dāng)表示層的應(yīng)用軟件通過網(wǎng)絡(luò)向appserver發(fā)送一個(gè)請(qǐng)求的時(shí)候
appserver自動(dòng)找到相應(yīng)容器中的組件,執(zhí)行組件中的程序塊,把得到結(jié)果返還給客戶 而我們要做的事就是寫組件也就是javabean,然后放到appserver里面去就可以了 至于怎樣與IE通訊,怎樣截獲網(wǎng)絡(luò)上的請(qǐng)求,怎樣控制對(duì)象的數(shù)量等等
這些繁瑣而無味的工作我們都不管,都由appserver去做吧,把注意力集中在業(yè)務(wù)邏輯上
appserver與其他相關(guān)軟件的關(guān)系如下圖:
------------------------|
表示層
|
業(yè)務(wù)邏輯層
| 數(shù)據(jù)持久層 |------------------------|
|
-----------------
|
| |
IE
|
|
javabean
|
|
| |
->
-----------------
->
DB
| |
client
<-
appserver <-
| |
|-------------------------|
| |
|
虛擬機(jī)
|
| |--------------|-------------------------|------------| |
Windows
|
Linux/Saloris
|LinuxSaloris| |--------------|-------------------------|------------| 圖上可以看出:虛擬機(jī)負(fù)責(zé)處理中間件與操作系統(tǒng)之間的交互 appserver則負(fù)責(zé)組件的管理以及與其他兩層的業(yè)務(wù)交互 附圖: image002.gif(76463 字節(jié))
要說明的是上圖中還包含有應(yīng)用程序客戶端容器(Application client container)管理應(yīng)用程序客戶端組件的運(yùn)行,應(yīng)用程序客戶端和它的容器運(yùn)行在客戶機(jī) 這種情況比較復(fù)雜一般說的是兩個(gè)server之間的通訊
比如jsp/servlet容器在一個(gè)服務(wù)器上,而ejb容器在另外一個(gè)服務(wù)器上等等 這是分布式操作系統(tǒng)大面積應(yīng)用的基礎(chǔ),這個(gè)以后再說 下面這張相對(duì)簡(jiǎn)單: 2 附圖: j2ee.gif(8226 字節(jié))
嗯,那么話題再回到中間件上去,什么是中間件?
appserver就是所謂的中間件,但是中間件不僅有appserver,還有其他的東西 換句話說,appserver只是中間件的一種
而關(guān)于中間件有諸多規(guī)范以及遵循這些規(guī)范的模型 最流行的規(guī)范無非兩種,一個(gè)是j2ee還有一個(gè)是.net 但是.net幾乎只有微軟在用,所以很多人把.net這個(gè)規(guī)范就當(dāng)成是微軟的中間件產(chǎn)品 也不為過,畢竟沒幾個(gè)公司喜歡跟著微軟屁股后面跑的
給初學(xué)者之六:java企業(yè)級(jí)應(yīng)用之綜合篇
我們知道中間件有很多種規(guī)范以及相關(guān)的模型 最流行的一個(gè)是j2ee還有一個(gè)是.net 那么各大公司關(guān)于這兩套規(guī)范各有什么產(chǎn)品以及周邊呢?
j2ee:
黃金組合
操作系統(tǒng):Solaris 應(yīng)用服務(wù)器:Weblogic 數(shù)據(jù)庫:Oracle 開發(fā)工具:JBuilider/IntelliJ IDEA 優(yōu)點(diǎn):性能一級(jí)棒,大企業(yè)大公司做系統(tǒng)的首選,世界五百強(qiáng)幾乎都是這套組合 缺點(diǎn):極貴
超級(jí)組合,也是最安全最酷的黃金組合,硬件采用SUN公司的機(jī)器
但是SUN的服務(wù)器很貴,同等價(jià)格不如去買IBM的機(jī)器
SUN的服務(wù)器支持Solaris的效果自然不用說,Solaris號(hào)稱是世界上最安全的操作系統(tǒng) Oracle也是世界上最安全,性能最優(yōu)的數(shù)據(jù)庫,Weblogic是當(dāng)今性能最優(yōu)的appserver JBuilder和IDEA各有所長(zhǎng),JBuilder是Borland公司的招牌之一
是當(dāng)今世界上最流行的java IDE,用delphi寫的,但網(wǎng)絡(luò)上評(píng)價(jià)似乎不是很好 IDEA擁有插件功能,界面在所有java IDE中最為漂亮,東歐人開發(fā)的產(chǎn)品 東歐人嚴(yán)謹(jǐn)?shù)淖黠L(fēng)在這個(gè)產(chǎn)品上體現(xiàn)得尤為突出,用java寫的
IDEA甚至號(hào)稱自己被業(yè)界公認(rèn)為是最好的IDE//個(gè)人保留意見,沒有最好只有更好 但我用JBuilder的時(shí)候發(fā)現(xiàn)了不少bug,而至今還沒有在IDEA上發(fā)現(xiàn)什么bug 個(gè)人推薦IDEA 價(jià)格方面,Solaris開源,但是SUN的服務(wù)器比較貴,Weblogic最高是34萬 oracle標(biāo)準(zhǔn)版要18.6萬,企業(yè)版要49萬,JBuilder要2.7萬左右 IDEA零售價(jià)大概是500美金,也就是5000多元
另外,雖然理論上這些產(chǎn)品的綜合性能要高于其他選擇,但是必須看到
由于產(chǎn)商之間的利益沖突,比如oracle也有自己的appserver,但是性能不怎樣 使得這幾種產(chǎn)品之間協(xié)作的性能要比預(yù)想中的要差一點(diǎn)點(diǎn)--開源系列
操作系統(tǒng):-應(yīng)用服務(wù)器:JBoss 數(shù)據(jù)庫:MySql 開發(fā)工具:Netbeans 優(yōu)點(diǎn):便宜,性能未必最佳,但是對(duì)付中小企業(yè)足夠了 缺點(diǎn):出了問題自己抗吧
嗯,這是java陣營(yíng)最大的特色,免費(fèi)免費(fèi),還有在開發(fā)工具這一欄Eclipse也是免費(fèi)的 但后面要說,算了,換個(gè)有代表性的開源產(chǎn)品來
tomcat僅有web容器而沒有ejb容器,而jboss已經(jīng)集成了tomcat 也就是說下載了jboss之后,啟動(dòng)的同時(shí)也就啟動(dòng)了tomcat jboss在tomcat基礎(chǔ)之上多加了一個(gè)ejb容器,使得jboss+tomcat成為和weblogic websphere之外又一個(gè)得到廣泛應(yīng)用的appserver 現(xiàn)在大概是這樣,中小型企業(yè)多用jboss,如果應(yīng)用小一點(diǎn)就用tomcat 只有給那些大型企業(yè)做的項(xiàng)目,才會(huì)花錢去上一個(gè)weblogic或者websphere mysql也是開源的數(shù)據(jù)庫,做得非常不錯(cuò),如果系統(tǒng)對(duì)數(shù)據(jù)庫要求不高 或者安全要求不是非常嚴(yán)格,mysql是一個(gè)非常不錯(cuò)的選擇 開發(fā)工具方面,netbeans是sun公司極力推廣的一種IDE 聽說在北美市場(chǎng)使用量已經(jīng)超過eclipse了
操作系統(tǒng),軟件再不用錢,服務(wù)器也要錢,看這臺(tái)機(jī)器上跑什么操作系統(tǒng)就用什么了--IBM套餐
操作系統(tǒng):Linux 應(yīng)用服務(wù)器:Websphere 數(shù)據(jù)庫:DB2 開發(fā)工具:Eclipse/WebSphere Studio 優(yōu)點(diǎn):服務(wù)好,IBM可以提供全套服務(wù),也可以替客戶承擔(dān)風(fēng)險(xiǎn) 缺點(diǎn):把機(jī)器數(shù)據(jù)全部交給IBM,安全什么的都由不得你了
呵呵,IBM全套產(chǎn)品,甚至包括硬件設(shè)備IBM的服務(wù)器
由于是一個(gè)公司的產(chǎn)品,各產(chǎn)品之間的協(xié)作自然不錯(cuò)
價(jià)格方面,Linux,DB2,Eclipse都是開源產(chǎn)品,Websphere目前零售價(jià)是33.8萬人民幣 IBM服務(wù)器不錯(cuò),可以考慮--.net:
微軟陣營(yíng)
操作系統(tǒng):Windows 應(yīng)用服務(wù)器:.net應(yīng)用服務(wù)器(好像叫IIS)數(shù)據(jù)庫:SqlServer 開發(fā)工具:MS Visual Studio 優(yōu)點(diǎn):客戶端的用戶體驗(yàn)良好,和客戶端諸多微軟產(chǎn)品的兼容性強(qiáng) 缺點(diǎn):離開了微軟,寸步難行,和其他任何一家公司的產(chǎn)品都不兼容
微軟的東西,怎么說呢,太專橫了
微軟所有的東西都是圍繞著windows來做的
.net其實(shí)已經(jīng)可以實(shí)現(xiàn)跨平臺(tái)了,但是微軟出于自身商業(yè)考慮 在其應(yīng)用服務(wù)器跨平臺(tái)的實(shí)現(xiàn)上設(shè)置了種種障礙 而且針對(duì)windows,微軟做了大量的優(yōu)化,可以這么看.net就是與windows捆綁的一套產(chǎn)品
所以有些人說,微軟的產(chǎn)品離開了windows,就是渣
而且.net開源選擇也少,安全性方面考慮,windows本身就有一堆補(bǔ)丁要打了 sqlserver也不安全,至于.net到底安全不安全我不清楚,畢竟我沒怎么用過 但整體考慮,感覺.net不是大企業(yè)的首選,鑒于其濃厚的商業(yè)背景 也不是中小企業(yè)的首選,但是必須看到
客戶端也就是微機(jī)pc市場(chǎng)已經(jīng)完全被windows所壟斷
所以在一些快速開發(fā),還有和微軟產(chǎn)品兼容性要求較高的領(lǐng)域,.net還是比較有市場(chǎng)的 最后一個(gè)visual studio對(duì)它之前的版本兼容,且支持c,c++,c#,vb等語言 在其傳統(tǒng)領(lǐng)域,比如寫一些桌面軟件等客戶端應(yīng)用上,.net還是第一選擇--最后要說明的是
這些組合不是固定不變的
由于J2EE得到了絕大多數(shù)IT企業(yè)的支持以及JAVA跨平臺(tái)的特性 我們可以自由地定制個(gè)性化的組合
比如我可以選擇windows+jboss+eclipse+oracle 也可以選擇solaris+websphere+IDEA+mysql 等等,這些自由組合都是可以的,但是有一點(diǎn)必須說明 微軟的東西,一般來說離開了windows就不能用
比如你選擇了.net應(yīng)用服務(wù)器,那操作系統(tǒng)就必須是windows 你選擇了sqlserver,那就必須在windows上用
還有就是遵循j2ee規(guī)范的所有的組件都可以在不同的應(yīng)用服務(wù)器上互相移植 比如你可以在測(cè)試的時(shí)候用jboss 而在正式投產(chǎn)上線的時(shí)候使用websphere,只需要在配置文件中作相應(yīng)改動(dòng)即可
給初學(xué)者之七:java企業(yè)級(jí)應(yīng)用之術(shù)語篇
在了解完J2ee的相關(guān)周邊產(chǎn)品之后需要深入J2ee規(guī)范內(nèi)部去了解一下到底這些規(guī)范 這里介紹幾個(gè)最常用的規(guī)范
再繼續(xù)說下去之前有必要說幾個(gè)常識(shí)
Java的誕生
Java之父James Gosling早年從cmu畢業(yè)之后
從事了一段時(shí)間的開發(fā)工作,后來意外碰到一個(gè)項(xiàng)目
這個(gè)項(xiàng)目要求他用C++開發(fā),但可愛的JG是天才,凡是天才在某方面特別突出的同時(shí) 必然有一些天生的缺陷,恩,或說共性,比如說懶,急躁和傲慢
JG既然是天才,那就必然具備這些共性,JG懶,以至于他學(xué)不好C++ 不僅他學(xué)不好,當(dāng)年開發(fā)出Java的那個(gè)團(tuán)隊(duì)也都學(xué)不好C++ 他們急噪,以至于他們中有人甚至威脅以辭職的方式離開這個(gè)需要使用CPP開發(fā)的項(xiàng)目 他們傲慢,所以他們決定開發(fā)出一種新的語言來取代那個(gè)該死的CPP 更可愛的是,他們一開始居然給這門語言起名C++++--//沒錯(cuò),我沒敲錯(cuò) 叫什么C加加 加加減減,意思是加上一些好東西,減去一些壞東西
天才的設(shè)定,有時(shí)候你會(huì)發(fā)現(xiàn)天才和傻瓜真的只有一線之隔
還好這個(gè)可愛的名字沒有被繼承下來,這些天才們給他們的產(chǎn)物起名叫Oak//橡樹 只是后來當(dāng)他們?nèi)プ?cè)這個(gè)名字的時(shí)候,發(fā)現(xiàn)這個(gè)名字已經(jīng)被注冊(cè)了
于是在Sun公司的一個(gè)女職員//mm就是心細(xì),這個(gè)說法也是我們公司mm告訴我的 的提議下,把這個(gè)可愛的語言起名為Java,就是他們當(dāng)時(shí)喝的咖啡的名字 所以我們看到Java的標(biāo)志就是一杯冒著熱氣的咖啡
JavaBean 了解完Java之后,再來說說什么是JavaBean//華為面試題 JavaBean是什么? 咖啡豆
ja,更為科學(xué)點(diǎn)的解釋是
用java語言編寫的可重用的軟件組件//組件的定義前面說過了,不再重復(fù)
很形象不是么? 將javabean放入杯子//容器,還記得容器的概念么?web容器,ejb容器 就可以沖泡//編譯 成咖啡,供客人們品嘗//運(yùn)行 完美的服務(wù)
下面進(jìn)入正題 再談容器
前面介紹過容器,我覺得有必要再補(bǔ)充一點(diǎn)
容器從某種意義上說其實(shí)就是一個(gè)可運(yùn)行的java寫的應(yīng)用程序 猶如c++/c編譯后生成的.exe文件
不同的是java編譯后的文件需要用命令行或者腳本啟動(dòng)執(zhí)行 由于容器是由java寫的,所以容器都能夠跨平臺(tái)
雖說如此,似乎大部分容器都針對(duì)不同的操作系統(tǒng)提供了不同的版本 但可以肯定的一點(diǎn)是,相同容器間的移植組件不需要重新編譯
Servlet web容器組件
Servlet確切地說,就是web容器運(yùn)行的java組件
與普通javabean不同的是,Servlet定義了一系列方法//比如init()和destroy()供容器調(diào)用,調(diào)用的主要目的是為了管理
當(dāng)一個(gè)request請(qǐng)求被web容器截獲之后,容器分析該請(qǐng)求地址 然后通過一個(gè)配置文件中的映射表//web.xml 調(diào)用相應(yīng)的Servlet組件處理后將結(jié)果返還給客戶端
JSP//Java Server Page web容器組件
Servlet出現(xiàn)了之后,人們發(fā)現(xiàn)幾乎沒有辦法用一個(gè)非常直觀的方式去編寫頁面 畢竟頁面是html語言編寫的
而讓我們用一種流程式的處理方式去逐行教計(jì)算機(jī)如何寫html代碼太困難 在這種情況下JSP應(yīng)運(yùn)而生,JSP將java代碼嵌入html代碼內(nèi)部
然后存成.jsp文件,再由計(jì)算機(jī)編譯生成Servlet儲(chǔ)存起來//注意這個(gè)過程
所以JSP和Servlet對(duì)于web容器來說其實(shí)是一種東西,雖然它們編寫遵循的標(biāo)準(zhǔn)有所不同 極大地簡(jiǎn)化了代碼同時(shí)增加了代碼的可讀性,生產(chǎn)維護(hù)成本下降 值得一提的是,在制定JSP規(guī)范的過程中,借鑒了ASP的很多規(guī)范 寫過ASP并熟悉Java語言的人應(yīng)該能很快掌握J(rèn)SP
EJB//Enterprise JavaBean ejb容器組件
隨著時(shí)間的推移,人們發(fā)現(xiàn)普通的JavaBean似乎并不能滿足企業(yè)級(jí)應(yīng)用的需要 最典型的就是虛擬機(jī)提供的垃圾回收收集機(jī)制也就是GC不夠完善 可以優(yōu)化的余地極大,在這種情況下,EJB應(yīng)運(yùn)而生
EJB和其它組件一樣,不過遵循了某些規(guī)范而已
但是這些規(guī)范更多的是為充分利用機(jī)器并提高性能為主要目的的 舉個(gè)簡(jiǎn)單例子
比如某個(gè)web服務(wù)器有100個(gè)用戶同時(shí)連接上
由于網(wǎng)絡(luò)連接是瞬時(shí)連接,所以很多時(shí)候并發(fā)數(shù)并沒有100那么大 前一秒有可能有30個(gè)請(qǐng)求被發(fā)送過來并被處理 后一秒可以只有10個(gè)請(qǐng)求被發(fā)送過來并被處理 只有在非常非常極端的情況下才有可能發(fā)生100個(gè)請(qǐng)求同時(shí)被發(fā)送過來并被處理的情況 那么我們是否需要保留100個(gè)那么多個(gè)對(duì)象在服務(wù)器的內(nèi)存里面去處理這些請(qǐng)求呢? 很顯然,不需要,大多數(shù)時(shí)候//甚至可以說是所有時(shí)候,我不相信有那么極端的情況 我們只需要保存其中的10-30%就夠了,那么什么時(shí)候需要20%,什么時(shí)候需要50% 甚至100%,這個(gè)過程就交給容器去管理,這就是ejb容器每天在干的事 管理內(nèi)存中活躍的對(duì)象
恩,必須強(qiáng)調(diào)的一點(diǎn)是,由于使用的不成熟 我們經(jīng)常把規(guī)范以及具體的應(yīng)用兩個(gè)名詞混用
舉個(gè)簡(jiǎn)單例子,我們說Servlet,極有可能說的是Servlet規(guī)范 也有可能說的是一個(gè)具體的Servlet,這個(gè)就要看情況而定了 EJB,JSP也是如此
JDBC 和數(shù)據(jù)庫的連接
這個(gè)嚴(yán)格說來是數(shù)據(jù)庫產(chǎn)商需要關(guān)心的事
關(guān)于AppServer如何與數(shù)據(jù)庫的連接
但是也需要開發(fā)人員做一點(diǎn)事,因?yàn)锳ppServer不知道什么時(shí)候組件需要用到數(shù)據(jù)庫 同時(shí)也需要開發(fā)人員告訴AppServer他們使用的是什么數(shù)據(jù)庫,ip地址等等 JDBC就是關(guān)于這一套東東的規(guī)范
包括數(shù)據(jù)庫的產(chǎn)商應(yīng)提供什么樣的接口
AppServer應(yīng)用服務(wù)器應(yīng)該如何去連接 開發(fā)人員應(yīng)該如何去配置這些連接等等
還有一些數(shù)據(jù)源,連接池等概念參考相關(guān)數(shù)據(jù)在此就不再贅述 其它的規(guī)范比如JMX等確切地說與開發(fā)人員關(guān)聯(lián)并不大了 這類高級(jí)應(yīng)用只對(duì)AppServer應(yīng)用服務(wù)器產(chǎn)商重要 也不再羅嗦了
---------記得聽說過這樣一種說法
大一時(shí)候不知道自己不知道 大二時(shí)候知道自己不知道 大三時(shí)候不知道自己知道 大四時(shí)候知道自己知道 為什么呢,因?yàn)榇笠粫r(shí)候剛進(jìn)大學(xué),什么都不懂,很正常,大家都一樣 大二或者大三時(shí)候開始接觸知識(shí),雖然還是不懂,但慢慢地開始學(xué)習(xí),開始積累 過了一段時(shí)間,知道自己知道了//也就是前一種說法的大四,后一種說法的大三 開始屁癲,開始拽得不得了,覺得自己懷才不遇,千里馬難尋伯樂的那種感覺 有些人是大四畢業(yè)了以后開始拽,悟性高一點(diǎn)的,大三就開始拽,因人而異 這幾乎是每一個(gè)初學(xué)者經(jīng)過一段時(shí)間學(xué)習(xí)后的必然階段 不管如何,總之開始入門了,這也不是壞事
但最后每個(gè)人都會(huì)知道自己不知道的,也就是后一種說法的大四階段 //前一種說法里面的那些家伙估計(jì)要到工作以后才能明白 因?yàn)槿魏我婚T學(xué)科都博大精深,要是能在兩三年之內(nèi)就統(tǒng)統(tǒng)搞懂 那不是在吹牛就是坐井觀天,java如此,c如此,c++也是如此
那么到了本系列的第七集,可愛的讀者應(yīng)該處在什么階段呢?
恭喜,在看完這篇文章之后,你就基本處于知道自己不知道的那種階段 離拽起來還有那么一段距離,因?yàn)槟銈儺吘惯€沒有學(xué)習(xí)和積累一定的基礎(chǔ)知識(shí) 但是騙騙外行,蒙蒙國(guó)企那些吃閑飯的管理人員問題不大
給初學(xué)者之八:java高級(jí)應(yīng)用之框架篇 沒錯(cuò),我沒敲錯(cuò)
之所以不再聲稱是企業(yè)級(jí)應(yīng)用而稱之為高級(jí)應(yīng)用 是因?yàn)橄旅嬉v的東西屬于純民間性質(zhì) 是java具體應(yīng)用的上層建筑,可用可不用,沒有人強(qiáng)迫你用
首先給框架//framework 下一個(gè)定義
我想讀者你可能聽說過.net framework這個(gè)概念
沒錯(cuò),我們將要說的framework也和這個(gè)framework差不多 所不同的是.net framework的競(jìng)爭(zhēng)對(duì)象是j2ee那一系列標(biāo)準(zhǔn) 而我們將要說到的幾個(gè)框架則應(yīng)用在j2ee的不同層面 單就單個(gè)框架而言,沒有.net framework管得那么多
但是卻要比它精專多了,而且總量加起來,也遠(yuǎn)比微軟那一套框架要廣泛得多 回到正題,框架是什么?
軟件工程之所以被叫做軟件工程就是因?yàn)橛心敲匆慌擞X得可以用工程學(xué)里面 那些管理Project的方法來管理軟件從開發(fā)到維護(hù)這一系列流程 那么在建筑工程里面框架是什么?
現(xiàn)在建筑多采用鋼筋混凝土結(jié)構(gòu),注意里面一個(gè)很重要的詞匯:鋼筋 托福閱讀中曾有一題聽力就是關(guān)于鋼筋結(jié)構(gòu)的誕生,在美國(guó)
恩,現(xiàn)代建筑中多在建筑起來之前,先用鋼筋搭建出一個(gè)框架出來 然后往鋼筋中間填入混凝土,從而形成一個(gè)完成的建筑
而今天要說到的框架就是這么一個(gè)東西在每一個(gè)軟件中間的實(shí)現(xiàn)
框架就是那么一個(gè)通過預(yù)先寫好代碼從而幫我們建立起一個(gè)軟件結(jié)構(gòu)的這么一個(gè)東西
這里提一下框架與規(guī)范//主要指J2ee規(guī)范也就是官方標(biāo)準(zhǔn)的區(qū)別
從某種意義上說,J2ee規(guī)范本身就是一個(gè)框架
無論是web容器也好,還是ejb容器也好,它們都開發(fā)了一部分通用的代碼 并且?guī)椭覀兇罱ㄆ饋砹艘粋€(gè)軟件結(jié)構(gòu),我們要做的就是往里面填入組件 比如ejb/servlet/jsp等等
沒錯(cuò),要這么理解也沒錯(cuò),但是為了避免混亂,我們還是嚴(yán)格區(qū)分開來 本文中將要提到的框架如無特別說明,就是指的是非官方標(biāo)準(zhǔn)的框架 規(guī)范是規(guī)范,而框架是建立在規(guī)范之上的一種東西
可以說是標(biāo)準(zhǔn)的延續(xù),或者說是民間的嘗試,總之是這么一個(gè)非官方的東西 說到這里順便提一下JCP組織也就是Java Community Process/Java社區(qū) 當(dāng)初Sun公司在java發(fā)布之初,為了提倡開源和共項(xiàng)
同時(shí)也出于一個(gè)提出合理的標(biāo)準(zhǔn)的目的,而讓廣大的開發(fā)者參與標(biāo)準(zhǔn)的制定 而成立了這樣一個(gè)社區(qū),現(xiàn)在還健在,網(wǎng)址是jcp.org 每一個(gè)新的規(guī)范發(fā)布之前都會(huì)在這個(gè)社區(qū)廣泛討論,最終對(duì)規(guī)范的制定產(chǎn)生巨大的影響 其中就包括企業(yè)級(jí)的參與者,相當(dāng)有名的JBoss以及我國(guó)的金碟公司都是其中的成員
下面介紹一下幾個(gè)相當(dāng)著名的框架,必須要指出的是,雖然框架大多開源 但并不代表所有的框架都開源,比如.net framework,但是java框架大多數(shù)開源 言歸正傳
Struts 表示層框架,名字來源于飛機(jī)的金屬框架 可能有讀者會(huì)提問了 表示層不是客戶端么?
沒錯(cuò),但是語言這東西,眾口爍金,別人都這么說你就不好不這么說了 最早表示層說的是客戶端,后來隨著時(shí)間的發(fā)展 人們也把服務(wù)器端直接與客戶端//比如IE 打交道的那部分也稱為表示層//JSP+Servlet 那么表示層框架是干什么的呢?
早先大規(guī)模應(yīng)用JSP的時(shí)候,人們發(fā)現(xiàn),JSP里面充斥著邏輯代碼與數(shù)據(jù) 可讀性極差,于是人們借用很早很早以前的MVC模式的思想 把表示層組件分為V-Viewer,也就是JSP M-Model模型,一般來說是一個(gè)JavaBean C-Controller控制器,一般來說是一個(gè)Servlet 所有人通過JSP和服務(wù)器打交道,發(fā)送請(qǐng)求,Viewer把這個(gè)請(qǐng)求轉(zhuǎn)發(fā)給Controller Controller通過調(diào)用一個(gè)Model來處理該請(qǐng)求,然后返回?cái)?shù)據(jù)到Viewer 這么一個(gè)過程,從而達(dá)到數(shù)據(jù)與邏輯的剝離,增強(qiáng)代碼可讀性,降低維護(hù)成本 而幫助人們實(shí)現(xiàn)這一系列東西的就是Struts框架,就是這么一個(gè)東西 Struts的競(jìng)爭(zhēng)對(duì)手主要是產(chǎn)商們極力倡導(dǎo)的JSF也就是Java Server Faces 但是由于Struts出道時(shí)間早,所以應(yīng)用比較多
JSF則是產(chǎn)商們大力支持,前景看好
對(duì)于這一層來說,在JSP的html代碼中出現(xiàn)的java語句越少越好 因?yàn)閖ava代碼越少說明頁面處理的業(yè)務(wù)邏輯越少,也越合理 這也是Struts最初的目的,記住這話
Spring 大名鼎鼎的Spring框架
有人曾說2005年一片叫春之聲,指的就是該框架
Spring起源于Rod Johnson的《Expert One-on-One J2EE Design and Development》一書 Rod Johnson認(rèn)為,J2ee里面的那一套//尤其是ejb 太重了,對(duì)于單機(jī)的系統(tǒng)來說,沒有必要使用那么復(fù)雜的東西 于是就開始設(shè)計(jì)并引導(dǎo)Spring小組開發(fā)出這樣一個(gè)構(gòu)架
不能不說他是個(gè)天才,因?yàn)榈牡拇_確不是所有的系統(tǒng)都是跨多服務(wù)器的
沒有必要把一個(gè)簡(jiǎn)單的系統(tǒng)設(shè)計(jì)得那么復(fù)雜//天才的那幾個(gè)共性又體現(xiàn)出來了 Spring從誕生之日起就是針對(duì)EJB的,力爭(zhēng)在不少應(yīng)用上取代EJB 而它也確實(shí)達(dá)到了這個(gè)目的
現(xiàn)在包括WebLogic等主流應(yīng)用服務(wù)器還有主流IDE都開始逐漸接受該框架 并提供相應(yīng)支持
提到Spring就不能不說控制反轉(zhuǎn)Ioc//Inversion of Control 和依賴注射DI//Dependency Injection 什么叫控制反轉(zhuǎn)呢?
套用好萊塢的一句名言就是:你呆著別動(dòng),到時(shí)我會(huì)找你。什么意思呢?就好比一個(gè)皇帝和太監(jiān)
有一天皇帝想幸某個(gè)美女,于是跟太監(jiān)說,今夜我要寵幸美女 皇帝往往不會(huì)告訴太監(jiān),今晚幾點(diǎn)會(huì)回宮,會(huì)回哪張龍床,他只會(huì)告訴太監(jiān)他要哪位美女 其它一切都交由太監(jiān)去安排,到了晚上皇帝回宮時(shí),自然會(huì)有美女出現(xiàn)在皇帝的龍床上 這就是控制反轉(zhuǎn),而把美女送到皇帝的寢宮里面去就是注射
太監(jiān)就是是框架里面的注射控制器類BeanFactory,負(fù)責(zé)找到美女并送到龍床上去 整個(gè)后宮可以看成是Spring框架,美女就是Spring控制下的JavaBean 而傳統(tǒng)的模式就是一個(gè)饑渴男去找小姐出臺(tái)
找領(lǐng)班,幫助給介紹一個(gè)云云,于是領(lǐng)班就開始給他張羅
介紹一個(gè)合適的給他,完事后,再把小姐還給領(lǐng)班,下次再來
這個(gè)過程中,領(lǐng)班就是查詢上下文Context,領(lǐng)班的一個(gè)職能就是給客戶找到他們所要的小姐
這就是lookup()方法,領(lǐng)班手中的小姐名錄就是JNDI//Java Naming and Directory Interface 小姐就是EJB,饑渴男是客戶端,青樓是EJB容器
看到區(qū)別了么?饑渴男去找小姐出臺(tái)很麻煩,不僅得找,用完后還得把小姐給還回去 而皇帝爽翻了,什么都不用管,交給太監(jiān)去處理,控制權(quán)轉(zhuǎn)移到太監(jiān)手中去了 而不是皇帝,必要時(shí)候由太監(jiān)給注射進(jìn)去就可以了
看到Spring的美妙了吧,Spring還提供了與多個(gè)主流框架的支持 可以和其它開源框架集成
Hibernate 名字取材自O(shè)RM最早的一句玩笑話//ORM就是OR-Mapping 說用了ORM之后,程序員就可以去冬眠了,而不需要操心那么多事
這里不得不說的是,該框架由于做得太好,以至于被J2ee招安,成為EJB3.0的一部分 替代原有EJB2.X里面關(guān)于Entity Bean而成為EJB ORM的工具 這里解釋一下ORM//OR-Mapping 中文名對(duì)象關(guān)系映射
什么意思呢?我們知道傳統(tǒng)的數(shù)據(jù)庫都是關(guān)系型的
一條條記錄以表格的形式儲(chǔ)存,而表與表之間充斥著是關(guān)系/關(guān)聯(lián)
比如說一個(gè)人,名字zhaoce,性別男,年齡23那么數(shù)據(jù)庫中是這么儲(chǔ)存的 姓名 性別 年齡 zhaoce m 23 某女
f 22 而實(shí)際應(yīng)用服務(wù)器中的實(shí)體都是以對(duì)象的形式存在,一個(gè)個(gè)對(duì)象 zhaoce是以這種形式存在的 Human human=new Human();human.setName(“zhaoce”)human.setSex(“m”);human.setAge(23);這樣的,那么我們知道,傳統(tǒng)的JDBC是通過一個(gè)二維字符串將數(shù)據(jù)取出 需要我們自己將其包裝成對(duì)象,在存入的時(shí)候,我們還需要將對(duì)象拆開 放入sql語句中//Insert into Huamn values('zhaoce','m',23)然后執(zhí)行該sql語句
太麻煩太麻煩,ORM理念的提出改變了這一切,ORM認(rèn)為,這些東西應(yīng)該由框架來做 而不是程序員,程序員做他該做的,不要為這種破事分心,還測(cè)試半天 于是就出現(xiàn)了Hibernate,JDO,TopLink等等,甚至.net里面也有ADO.net 過去一段時(shí)間是Hibernate和JDO爭(zhēng)風(fēng),現(xiàn)在看來Hibernate逐漸成為主流并被官方接納 成為規(guī)范標(biāo)準(zhǔn)之一,替代掉原來EJB2.X的ORM EntityBean TopLink則是Oracle公司推出和Oracle數(shù)據(jù)庫結(jié)合的一種ORM 商業(yè)用軟件,貴且復(fù)雜,不過正在逐漸開放
而象表示層一樣,這一種專門面對(duì)數(shù)據(jù)層的代碼也被稱為數(shù)據(jù)持久層 所以數(shù)據(jù)持久層這一概念有時(shí)不僅僅指代數(shù)據(jù)庫
關(guān)于ORM,最高的境界應(yīng)該是在java代碼中不出現(xiàn)任何一句的sql語句 注意,是不包括sql語句,Hibernate的hql以及ejb的ejb-ql不算在內(nèi)
至于出現(xiàn)不出現(xiàn)hql/ejb-ql等替代ql,這要視具體情況而定,不過最好也是不出現(xiàn) 當(dāng)然最后所說的過分理想的情況往往不現(xiàn)實(shí),總之一句話
以sql為代表的ql/*還有hql,ejbql等*/語句在代碼中出現(xiàn)得越少越好 記住這話,現(xiàn)在未必能夠理解,學(xué)了以后就懂了
這三個(gè)是目前最為常用的框架 而目前光已公布的框架就>500 還在不停增加中,不可能一一列舉,有興趣的可以去看相應(yīng)文檔 要指出的是框架不是應(yīng)用程序
只是一堆組件的有序復(fù)合,應(yīng)用時(shí)不能脫離于應(yīng)用服務(wù)器單獨(dú)存在
給初學(xué)者之九:收尾
最后一篇介紹幾個(gè)常見的概念
設(shè)計(jì)模式
這可不僅是java獨(dú)有
我看的書就是c++和smalltalk例子的
先說說什么是設(shè)計(jì)模式
模式是什么?模式是經(jīng)驗(yàn)的總結(jié),潛規(guī)則的抽象
什么意思呢?比如說我們坐飛機(jī),上飛機(jī)前需要經(jīng)過幾個(gè)步驟 什么安檢領(lǐng)取登機(jī)牌之類的,這一套流程能不能改呢?
可以,但為什么幾乎全世界的航空公司登機(jī)前都是這一套流程呢? 因?yàn)楹娇展窘?jīng)過長(zhǎng)期實(shí)踐之后得出了一堆結(jié)論和經(jīng)驗(yàn) 并認(rèn)為這樣做才是最安全,或說是最有效率的 這就是模式,模式是編程高手之間交流的橋梁
兩個(gè)編程高手通過統(tǒng)一命名的模式了解對(duì)方的思想
當(dāng)然不借助模式可不可以?當(dāng)然可以,只是模式無處不在,你不知道而已
又比如吃飯,每吃一口飯,我們要先端碗,拿筷子,張嘴,塞飯入口,咀嚼最后吞咽 這就是一套模式,我們給這套模式命名為吃飯
那么當(dāng)老爸叫吃飯的時(shí)候,我們就能明白什么意思
而不用老爸進(jìn)來囈囈啊啊并比畫上半天,啞語也不是這么用的 這就是模式,已知的模式有400多種//好象更多,不記得了 比如數(shù)據(jù)庫有數(shù)據(jù)庫的設(shè)計(jì)模式,編程有編程的模式等等
面向?qū)ο笥谐S玫?1種模式,需要掌握,主要分為創(chuàng)建,行為,結(jié)構(gòu)三類 J2ee有J2ee的模式,Sun公司出了一本書叫《J2EE核心模式》可以拿來看看 必需要指明的是,模式不是規(guī)范,比如吃飯模式
沒有人規(guī)定你吃飯非得要那么吃,你可以端碗,上拋,張嘴在下落后連碗一起吞咽 這也可以,只要你愿意,同樣,只要你愿意,你就可以不遵循模式
模式之外還有反模式,學(xué)模式不可定勢(shì),不要學(xué)死,活學(xué)活用,無招勝有招才是最高境界 JavaDoc 文檔工具,極其好用
可以根據(jù)注釋自動(dòng)生成HTML文檔
Ant 98年,有一位程序員在從歐洲飛回美國(guó)的飛機(jī)上想到了這么一個(gè)東西 從而改變了整個(gè)世界,他的名字叫James Duncan Davidson 組織管理工具,可以這么描述它
比如你想在編譯之后自動(dòng)再次生成JavaDoc 那么你只需要編輯Ant腳本//對(duì),就像Windows腳本那樣 然后批處理就可以了,不過現(xiàn)在Ant已經(jīng)廣泛集成到IDE中去 不需要自己手動(dòng)編寫,不過如果想要炫炫,據(jù)說此招百試不爽
JUnit 測(cè)試工具,Unit家族可不只有JUnit 還有其它版本的,這個(gè)不細(xì)說,具體實(shí)踐一下就明白了
POJO //Plain Old Java Object 就是傳統(tǒng)的Java對(duì)象,也就是一個(gè)JavaBean 由虛擬機(jī)來掌握其生死
常用的兩個(gè)管理構(gòu)架/規(guī)范是Spring和EJB容器 命名由來是某人//名字我忘了
覺得我們使用了太多的規(guī)范,以至于我們都忘記了純粹的java對(duì)象 以至于我們都忽略了它的存在,所以叫了這么一個(gè)名字
以喚醒人們的記憶,這個(gè)意義上來說EJB其實(shí)不能算是POJO 畢竟遵循了一堆的接口,但是不管怎樣,接口歸接口,還是沒有繼承類 沒有被強(qiáng)加什么//遵循可以寫空方法假遵循 所以說還是POJO也對(duì)
但是由于這種東西缺乏管理,不象Servlet有專門的容器管理并繼承了一定的類 而沒有管理的對(duì)象在虛擬機(jī)中是很危險(xiǎn)的,因?yàn)槔厥諜C(jī)制各個(gè)虛擬機(jī)不同 而且也不怎樣,極有可能長(zhǎng)時(shí)間不回收,這樣在企業(yè)級(jí)的應(yīng)用中呢 就有可能造成內(nèi)存大量被占用從而死機(jī),毫無疑問,這種機(jī)制需要優(yōu)化 這種優(yōu)化就是通過EJB容器或者Spring構(gòu)架來實(shí)現(xiàn)
這么做還有一個(gè)好處就是迫使程序員對(duì)每一個(gè)類做封裝
強(qiáng)迫他做管理,以達(dá)到防止內(nèi)存泄露的目的,內(nèi)存泄露最經(jīng)常出現(xiàn)的錯(cuò)誤就是 引用未釋放,引用最典型體現(xiàn)在new這個(gè)關(guān)鍵字上,new得越多引用得越多 隨著時(shí)間地增長(zhǎng),有可能導(dǎo)致循環(huán),不停new new new new new.....其中哪怕只要有一個(gè)new處理不當(dāng),虛擬機(jī)無法回收內(nèi)存 那就極有可能完
第三篇:學(xué)習(xí)Java后的感想與建議
學(xué)習(xí)Java后的感想與建議
一學(xué)期下來,我從來沒有逃過一節(jié)課,因?yàn)楫?dāng)初我是懷著興趣選上這門課程的,所以每次上課我都提前去教室占位子,盡量去坐在靠前面一點(diǎn),這樣一來也就好認(rèn)真聽講,不會(huì)受到別人的影響。我們的老師也很優(yōu)秀,他是一位男老師。他長(zhǎng)得有點(diǎn)瘦,個(gè)兒也不高,但是人有點(diǎn)帥。每次上課,他都能提前5到10分鐘到教室里來,而且還走到學(xué)生中間去收集一些問題,以及同學(xué)們的一些疑惑,然后再在講課的過程中給我們作出解答。他很少發(fā)脾氣,聲音總是很溫和,也沒有太肉麻在課堂上違反紀(jì)律,或許這就是溫和所帶來的感染力吧!
面向?qū)ο驤ava程序與設(shè)計(jì)這門選修課,說實(shí)話,我認(rèn)為的確是一門實(shí)用性很強(qiáng)的課程。但是要想上好這門課程,我們必須要有一定的基礎(chǔ),否則上這門課,你一定是聽不懂的,最后讓你失去興趣,在最后,一學(xué)期下來,我們可能一無所獲,就知道了老師口里經(jīng)常喊的“class”、“public”等等。
所以我建議,以后在開設(shè)這門課的時(shí)候,對(duì)想選這門課的同學(xué)必須設(shè)置一些門檻,只有那些具有一定編程基礎(chǔ)的同學(xué)才能夠選這門課。首先,有一定的編程基礎(chǔ)是聽懂學(xué)會(huì)這門課程的基礎(chǔ);其次,有一定基礎(chǔ)了還要選這門課程說明既有興趣又有這方面的需求。當(dāng)然,我本人是非常喜歡這門課程的,但是由于現(xiàn)在的基礎(chǔ)不夠(我們剛剛學(xué)C語言),所以確實(shí)有點(diǎn)聽不懂。不過,無論這個(gè)學(xué)期有沒有學(xué)到多少東西,但我還是會(huì)繼續(xù)保持對(duì)Java的興趣。
第四篇:給予Java初學(xué)者的學(xué)習(xí)路線建議
給Java初學(xué)者的學(xué)習(xí)路線建議
在校學(xué)生,務(wù)必要在學(xué)好基礎(chǔ)(比如計(jì)算機(jī)系統(tǒng)、算法、編譯原理等等)的前提下,再考慮去進(jìn)行下面的學(xué)習(xí)。第一部分:對(duì)于尚未做過Java工作的同學(xué),包括一些在校生以及剛準(zhǔn)備轉(zhuǎn)行Java的同學(xué)。
一、Java基礎(chǔ)首先去找一個(gè)Java的基礎(chǔ)教程學(xué)一下,或者你也可以去找相應(yīng)的視頻。學(xué)習(xí)Java基礎(chǔ)的時(shí)候,應(yīng)該盡量多動(dòng)手,很多時(shí)候,你想當(dāng)然的事情,等你寫出來運(yùn)行一下,你就會(huì)發(fā)現(xiàn)不是這么回事兒,不信你就試試。了解過以上內(nèi)容以后,你對(duì)Java就應(yīng)該有一個(gè)基本的了解了,你可以用Java語言寫出一些簡(jiǎn)單的程序,并且你用的是最簡(jiǎn)單的編輯器,比如記事本。這個(gè)時(shí)候,不要急于進(jìn)入下一部分,留下幾天好好寫一些程序,盡可能熟悉這些基礎(chǔ)內(nèi)容。
二、Web開發(fā)等你寫上幾天程序以后,你往往會(huì)比較迷茫,因?yàn)槟銓懙臇|西似乎看起來毫無用處,比如實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)算器,讀取一個(gè)文件等。這個(gè)時(shí)候你就應(yīng)該去學(xué)著寫一些讓你覺得有意思的東西了,所以你應(yīng)該學(xué)習(xí)更多的知識(shí)。這些內(nèi)容主要是Web開發(fā)相關(guān)的內(nèi)容,包括HTML/CSS/JS(前端頁面)、Servlet/JSP(J2EE)以及Mysql(數(shù)據(jù)庫)相關(guān)的知識(shí)。它們的學(xué)習(xí)順序應(yīng)該是從前到后,因此最先學(xué)習(xí)的應(yīng)該是HTML/CSS/JS(前端頁面),這部分內(nèi)容你可以去上面的那個(gè)runoob網(wǎng)站上找。
你可以試著自己寫一些頁面,當(dāng)然,你可以盡你最大的努力讓它變得最漂亮。這部分內(nèi)容對(duì)于后端Java來說,理論上不是特別重要,但至少要達(dá)到可以自己寫出一些簡(jiǎn)單頁面的水平。接下來,你需要學(xué)習(xí)的是Servlet/JSP(J2EE)部分,這部分是Java后端開發(fā)必須非常精通的部分,因此這部分是這三部分中最需要花精力的,而且這個(gè)時(shí)候,你要學(xué)會(huì)使用開發(fā)工具,而不能再使用記事本了,可以選擇eclipse。當(dāng)你下載安裝好eclipse以后,請(qǐng)視頻中的教程一步一步去學(xué)習(xí),一定要多動(dòng)手。關(guān)于Servlet/Jsp部分視頻的選擇,業(yè)界比較認(rèn)可馬士兵的視頻,因此推薦給大家。
當(dāng)然了,我本人并沒有看過他的視頻,所以不好說的太絕對(duì),如果大家自己有更好的選擇,可以堅(jiān)持自己的,不要被我干擾。最后一步,你需要學(xué)會(huì)使用數(shù)據(jù)庫,mysql是個(gè)不錯(cuò)的入門選擇,而且Java領(lǐng)域里主流的關(guān)系型數(shù)據(jù)庫就是mysql。這部分一般在你學(xué)習(xí)Servlet/Jsp的時(shí)候,就會(huì)接觸到的,其中的JDBC部分就是數(shù)據(jù)庫相關(guān)的部分。你不僅要學(xué)會(huì)使用JDBC操作數(shù)據(jù)庫,還要學(xué)會(huì)使用數(shù)據(jù)庫客戶端工具,比如navicat,sqlyog,二選一即可。
三、開發(fā)框架當(dāng)你學(xué)會(huì)以上內(nèi)容以后,這個(gè)時(shí)候你還不足以參加工作,你還需要繼續(xù)深造。公司里為了提高開發(fā)的效率,會(huì)使用一些Java Web框架,因此你還需要學(xué)習(xí)一些開發(fā)框架。目前比較主流的是SSM框架,即spring、springmvc、mybatis。你需要學(xué)會(huì)這三個(gè)框架的搭建,并用它們做出一個(gè)簡(jiǎn)單的增刪改查的Web項(xiàng)目。你可以不理解那些配置都是什么含義,以及為什么要這么做,這些留著后面你去了解。
但你一定要可以快速的利用它們?nèi)齻€(gè)搭建出一個(gè)Web框架,你可以記錄下你第一次搭建的過程,相信我,你一定會(huì)用到的。還要提一句的是,你在搭建SSM的過程中,可能會(huì)經(jīng)常接觸到一個(gè)叫maven的工具。這個(gè)工具也是你以后工作當(dāng)中幾乎是必須要使用的工具,所以你在搭建SSM的過程中,也可以順便了解一下maven的知識(shí)。在你目前這個(gè)階段,你只需要在網(wǎng)絡(luò)上了解一下maven基本的使用方法即可,一些高端的用法隨著你工作經(jīng)驗(yàn)的增加,會(huì)逐漸接觸到的。
四、找工作當(dāng)你完成開發(fā)框架的學(xué)習(xí)以后,你就該找工作了,在校的找實(shí)習(xí),畢業(yè)的找全職。與此同時(shí),在找工作的同時(shí),你不應(yīng)該停下你的學(xué)習(xí),準(zhǔn)確的說,是你在以后都不能停下學(xué)習(xí)。上面這些內(nèi)容你只是囫圇吞棗的學(xué)會(huì)了使用,你可以逐步嘗試著去了解更多的東西。
第二部分:對(duì)于參加工作一年以內(nèi)的同學(xué)。恭喜你,這個(gè)時(shí)候,你已經(jīng)擁有了一份Java的工作。這個(gè)階段是你成長(zhǎng)極快的階段,而且你可能會(huì)經(jīng)常加班。但是加班不代表你就可以松懈了,永遠(yuǎn)記得我說的那句話,從你入行那一刻起,你就要不停的學(xué)習(xí)。在這一年里,你至少需要看完《Java編程思想》這本書。這本書的內(nèi)容是幫助你對(duì)于Java有一個(gè)更加深入的了解,是Java基礎(chǔ)的升級(jí)版。這個(gè)階段的核心學(xué)習(xí)思想就是,在工作中實(shí)踐,并且更加深入的了解Java基礎(chǔ)。
第二部分:對(duì)于參加工作1年到2年的同學(xué)。這部分時(shí)間段的同學(xué),已經(jīng)對(duì)Java有了一個(gè)更加深入的了解。但是對(duì)于面向?qū)ο蟮捏w會(huì)可能還不夠深刻,編程的時(shí)候還停留在完成功能的層次,很少會(huì)去考慮設(shè)計(jì)的問題。于是這個(gè)時(shí)候,設(shè)計(jì)模式就來了。我推薦《大話設(shè)計(jì)模式》這本書,而設(shè)計(jì)模式就是你的開端。
請(qǐng)記住,我所提的基本都是最低要求,因此不要有任何松懈的心理,否則五年后,你不要去羨慕別人高于你的工資,也不要去羨慕別人進(jìn)入了某公司。這一年,你必須對(duì)于設(shè)計(jì)模式了如指掌,《大話設(shè)計(jì)模式》可以作為你的開端。此外,設(shè)計(jì)模式并不是你這一年唯一的任務(wù),你還需要看一些關(guān)于代碼編寫優(yōu)化的書。比如《重構(gòu) 改善既有代碼的設(shè)計(jì)》,《effective java》。總而言之,這個(gè)階段,你的核心任務(wù)就是提高你的代碼能力,要能寫出一手優(yōu)雅的代碼。
第三部分:對(duì)于參加工作2年到3年的同學(xué)有的同學(xué)在這個(gè)時(shí)候覺得自己已經(jīng)很牛逼了,于是忍不住開始慢慢松懈。請(qǐng)記住,你還嫩的多。這個(gè)階段,有一本書是你必須看的,它叫做《深入理解Java虛擬機(jī)》。這本書絕對(duì)是Java開發(fā)者最重要的書,沒有之一。在我眼里,這本書的重要性還要高于《Java編程思想》。這本書的內(nèi)容是幫助你全面的了解Java虛擬機(jī),在這個(gè)階段,你一定已經(jīng)知道Java是運(yùn)行在JVM之上的。所以,對(duì)于JVM,你沒有任何理由不了解它。
另外,在過去2年的工作當(dāng)中,你肯定或多或少接觸過并發(fā)。這個(gè)時(shí)候,你應(yīng)該去更加深入的了解并發(fā)相關(guān)的知識(shí),而這部分內(nèi)容,我比較推薦《Java并發(fā)編程實(shí)戰(zhàn)》這本書。只要你把這本書啃下來了,并發(fā)的部分基本已經(jīng)了解了十之六七。與此同時(shí),這個(gè)階段你要做的事情還遠(yuǎn)不止如此。這個(gè)時(shí)候,你應(yīng)該對(duì)于你所使用的框架應(yīng)該有了更深入的了解,對(duì)于Java的類庫也有了更深入的了解。
因此,你需要去看一些JDK中的類的源碼,也包括你所使用的框架的源碼。這些源碼能看懂的前提是,你必須對(duì)設(shè)計(jì)模式非常了解。否則的話,你看源碼的過程中,永遠(yuǎn)會(huì)有這樣那樣的疑問,這段代碼為什么要這么寫?為什么要定義這個(gè)接口,它看起來好像很多余?由此也可以看出,這些學(xué)習(xí)的過程是環(huán)環(huán)相扣的,如果你任何一個(gè)階段拉下來了,那么你就真的跟不上了,或者說是一步慢步步慢。而且我很負(fù)責(zé)的告訴你,我在這個(gè)階段的時(shí)候,所學(xué)習(xí)的東西遠(yuǎn)多于這里所羅列出來的。
因此千萬不要覺得你已經(jīng)學(xué)的很多了,我所說的這些都只是最低要求,不光是我,很多人在這個(gè)時(shí)間段所學(xué)習(xí)的內(nèi)容都遠(yuǎn)超本文的范圍。如果你不能跟上節(jié)奏的話,若干年后,如果不是程序猿市場(chǎng)還不錯(cuò)的話,你很可能不僅僅是工資比別人低,公司沒別人好,而是根本就找不到工作。總而言之,這個(gè)階段,你需要做的是深入了解Java底層和Java類庫(比如并發(fā)那本書就是Java并發(fā)包java.concurrent的內(nèi)容),也就是JVM和JDK的相關(guān)內(nèi)容。而且還要更深入的去了解你所使用的框架,方式比較推薦看源碼或者看官方文檔。另外,還有一種學(xué)習(xí)的方式,在2年這個(gè)階段,也應(yīng)該啟用了,那就是造輪子。不要聽信那套“不要重復(fù)造輪子”的論調(diào),那是公司為了節(jié)省時(shí)間成本編造出來的。重復(fù)造輪子或許對(duì)別人沒有價(jià)值,因?yàn)槟阍斓妮喿涌赡茉缇陀辛耍乙话闱闆r下你造出來的輪子還沒有現(xiàn)存的好。
但是對(duì)別人沒有價(jià)值,不代表對(duì)你自己沒有價(jià)值。一個(gè)造輪子的過程,是一個(gè)從無到有的過程。這個(gè)過程可以對(duì)你進(jìn)行系統(tǒng)的鍛煉,它不僅考察你的編碼能力,還考察你的框架設(shè)計(jì)能力,你需要讓你的輪子擁有足夠好的擴(kuò)展性、健壯性。而且在造輪子的過程中,你會(huì)遇到各種各樣的難題,這些難題往往又是你學(xué)習(xí)的契機(jī)。當(dāng)你把輪子造好的時(shí)候,你一定會(huì)發(fā)現(xiàn),其實(shí)你自己收獲了很多。所以,這個(gè)階段,除了上面提到的了解JVM、JDK和框架源碼以外,也請(qǐng)你根據(jù)別人優(yōu)秀的源碼,去造一個(gè)任何你能夠想象出來的輪子。
第四部分:參加工作3年到4年的同學(xué)這個(gè)階段的同學(xué),提升已經(jīng)是很難了,而且這個(gè)階段的學(xué)習(xí)往往會(huì)比較多樣化。因?yàn)樵谇?年的過程中,你肯定或多或少接觸過一些其它的技術(shù),比如大數(shù)據(jù)、分布式緩存、分布式消息服務(wù)、分布式計(jì)算、軟負(fù)載均衡等等。這些技術(shù),你能精通任何一項(xiàng),都將是你未來面試時(shí)巨大的優(yōu)勢(shì),因此如果你對(duì)某一項(xiàng)技術(shù)感興趣的話,這個(gè)時(shí)候可以深入去研究一下。這項(xiàng)技術(shù)不一定是你工作所用到的,但一定是相關(guān)的。而且在研究一門新技術(shù)時(shí),切忌朝三暮四。有的同學(xué)今天去整整大數(shù)據(jù),搞搞Hadoop、hbase一類的東西。過不了一段時(shí)間,就覺得沒意思,又去研究分布式緩存,比如redis。然后又過不了一段時(shí)間,又去研究分布式計(jì)算,比如整整Mapreduce或者storm。結(jié)果到最后,搞得自己好像什么都會(huì)一樣,在簡(jiǎn)歷上大言不慚的寫上大數(shù)據(jù)、分布式緩存、分布式計(jì)算都了解,其實(shí)任何一個(gè)都只是浮于表面。到時(shí)候面試官隨便一問,就把你給識(shí)破了。
一定要記住,作為一個(gè)程序猿,平日里所接觸的技術(shù)可能會(huì)很多,但是想要讓一門技術(shù)成為你的優(yōu)勢(shì),那么一定是你對(duì)這門技術(shù)的了解強(qiáng)過絕大多數(shù)人才行。因此在這個(gè)階段,你就不能再簡(jiǎn)單的去學(xué)習(xí)前3年的內(nèi)容了,雖然前面的學(xué)習(xí)如果還不夠深入的話依舊要繼續(xù),但這個(gè)時(shí)候你應(yīng)該更多的考慮建立你的優(yōu)勢(shì),也可以稱為差異性。差異性相信不難理解,就是讓你自己變得與眾不同。你前面三年的學(xué)習(xí)足夠你成為一名基本合格的Java開發(fā)者,但你離成為一名優(yōu)秀的Java開發(fā)者還有很大的距離。
所謂優(yōu)秀,即能別人所不能。而你前三年所學(xué)習(xí)的內(nèi)容,是很多做過幾年的Java開發(fā)都能夠掌握的。那么為了讓自己有差異性,你就需要另辟蹊徑,找一個(gè)方向深入研究下去,以期在將來,你能夠成為這個(gè)領(lǐng)域的專家,比如分布式計(jì)算領(lǐng)域的專家,大數(shù)據(jù)領(lǐng)域的專家,并發(fā)領(lǐng)域的專家等等。此外,你除了建立你的差異性之外,還要去彌補(bǔ)你基礎(chǔ)上的不足,直到現(xiàn)在,我都沒有提及基礎(chǔ)知識(shí)。原因是基礎(chǔ)是很枯燥無味的,學(xué)的太早不僅容易懵逼,而且懵逼的同時(shí)還容易產(chǎn)生心理陰影,以至于以后再不想去研究這些基礎(chǔ)。但基礎(chǔ)又是你深入研究一些領(lǐng)域時(shí)所必須掌握的,比如你去研究分布式計(jì)算,你不懂算法你玩?zhèn)€毛毛?比如你去做分布式緩存,你對(duì)計(jì)算機(jī)系統(tǒng)的內(nèi)存不了解,你如何去做緩存?
如果你的基礎(chǔ)本來就非常強(qiáng),那么恭喜你,相信你在之前的工作中已經(jīng)充分體會(huì)到了這些基礎(chǔ)對(duì)你的幫助。但我相信大部分人的基礎(chǔ)都很薄弱,哪怕是科班畢業(yè)的人,很多人也不敢說自己當(dāng)初的基礎(chǔ)學(xué)的多么強(qiáng)大,比如算法、計(jì)算機(jī)系統(tǒng)原理、編譯原理這些。但是每個(gè)人時(shí)間都是有限的,而且這些基礎(chǔ)的書籍每一本讀下來,沒個(gè)一年半載的,還真拿不下來,因此還是要有所抉擇的。雖然藝多不壓身,但問題是藝多是有代價(jià)的,是需要你付出時(shí)間和精力的,而我個(gè)人更贊成在同等代價(jià)的情況下獲取最大的收獲。
首先,我比較推崇的基礎(chǔ)書籍有三本,分別是《深入理解計(jì)算機(jī)系統(tǒng)》,《tcp/ip詳解 卷一、二、三》,《數(shù)據(jù)結(jié)構(gòu)與算法》。其中TCP/IP有三本書,但我們這里把這三本看成是一本大書。這三本分別適合三種人,《深入理解計(jì)算機(jī)系統(tǒng)》比較適合一直從事Java Web開發(fā)和APP后端開發(fā)工作的人群。《tcp/ip詳解 卷一、二、三》比較適合做網(wǎng)絡(luò)編程的人群,比如你使用netty去開發(fā)的話,那么就要對(duì)TCP/IP有更深入的了解。而《數(shù)據(jù)結(jié)構(gòu)與算法》這本書,則比較適合做計(jì)算研究工作的人,比如剛才提到的分布式計(jì)算。另外,我要強(qiáng)調(diào)的是,這里所說的適合,并不是其它兩本對(duì)你就沒有用。比如你做Java Web和APP后端開發(fā),《tcp/ip詳解 卷一、二、三》這本書對(duì)你的作用也是很大的。這里只是分出個(gè)主次關(guān)系而已,你要是時(shí)間足夠的話,能把三本都精讀那當(dāng)然最好不過了。
但如果時(shí)間有限的話,那么就先挑對(duì)你幫助最大的書去讀。理論上來講,這一年你能把這三本其中一本精讀下來,就已經(jīng)非常厲害了。有了基礎(chǔ),有了前面的工作經(jīng)驗(yàn),你就可以去開拓屬于你的領(lǐng)域了。在這一年里,一定要規(guī)劃好自己的領(lǐng)域,建立好自己的優(yōu)勢(shì),制造出差異性。如果你對(duì)自己的領(lǐng)域不夠清晰的話,隨著你工作的時(shí)間日益增多,你接觸的技術(shù)會(huì)越來越多,這個(gè)時(shí)候,你很容易被淹死在技術(shù)的海洋里,看似接觸的技術(shù)越來越多,會(huì)用的也越來越多,但你毫無優(yōu)勢(shì)。有的同學(xué)可能會(huì)問,“我,我也不知道我的領(lǐng)域是什么啊?怎么辦呢?”對(duì)于這種人,我只想說,“臥槽,這還問我?要不干脆我替你學(xué)習(xí)得了,好不好?”
第五部分:參加工作4年到5年的同學(xué)經(jīng)過前面一年的歷練,相信你在自己所鉆研的領(lǐng)域已經(jīng)有了自己一定的見解,這個(gè)時(shí)候,技術(shù)上你應(yīng)該已經(jīng)遇到瓶頸了。這個(gè)時(shí)候不要著急提高自己的技術(shù),已經(jīng)是時(shí)候提高你的影響力了,你可以嘗試去一些知名的公司去提高你的背景,你可以發(fā)表一些文章去影響更多的人。當(dāng)然,你也可以去Github創(chuàng)建一個(gè)屬于你的開源項(xiàng)目,去打造自己的產(chǎn)品。
技術(shù)學(xué)到這個(gè)階段,很容易遇到瓶頸,而且往往達(dá)到一定程度后,你再深入下去的收效就真的微乎其微了,除非你是專門搞學(xué)術(shù)研究的。然而很可惜,大部分程序猿做不到這一步,那是科學(xué)家做的事情。這個(gè)時(shí)候提高影響力不僅僅是因?yàn)榧夹g(shù)上容易遇到瓶頸,更多的是影響力可以給你創(chuàng)造更多的機(jī)會(huì)。程序猿在某種程度上和明星很像,一個(gè)好的電視劇和電影就可以成就一批明星,程序猿有的時(shí)候也是,一個(gè)好的項(xiàng)目就可以成就一群程序猿。比如國(guó)內(nèi)幾個(gè)膾炙人口的項(xiàng)目,像淘寶、支付寶、QQ、百度、微信等等。這每一個(gè)項(xiàng)目,都成就了一批程序猿。我敢說,這里面任何一個(gè)項(xiàng)目,如果你是它的核心開發(fā),光是這樣一個(gè)Title,就已經(jīng)是你非常大的優(yōu)勢(shì)。更何況還不止如此,Title說到底也是個(gè)名頭,更重要的是,這種項(xiàng)目在做的時(shí)候,對(duì)你的歷練一定也是非常給力的。
而你如果想要參與這樣的項(xiàng)目,除了靠運(yùn)氣之外,影響力也是很重要的一個(gè)手段。比如你在分布式計(jì)算領(lǐng)域有一定的影響力,那么如果有什么好的關(guān)于分布式計(jì)算的項(xiàng)目,對(duì)方就很可能會(huì)邀請(qǐng)你。就算人家不邀請(qǐng)你,你自己主動(dòng)去面試的時(shí)候,對(duì)方如果知道你在這個(gè)領(lǐng)域的影響力,也肯定會(huì)起到很大的作用,而這個(gè)作用,甚至可能會(huì)超過你現(xiàn)在的技術(shù)能力。所以,在這個(gè)階段,你最大的任務(wù)是提高自己的影響力,為自己未來的十年工作生涯那一天做準(zhǔn)備。如果你能夠靠你的影響力和以前積累的技術(shù),參與到一個(gè)偉大的項(xiàng)目當(dāng)中,那么你后面的五年也就有著落了。當(dāng)然了,我現(xiàn)在滿打滿算,做程序猿也就4年半不到,因此關(guān)于4年到5年這一部分,我的見解不一定是對(duì)的,就算是對(duì)的,也不一定是適合任何人的。
所以,希望大家自己有的判斷力,去決定到底該如何度過這一年。結(jié)語本文到此就基本結(jié)束了,整篇文章很長(zhǎng),但其實(shí)主要就說了兩部分內(nèi)容,一個(gè)是社招面試的準(zhǔn)備,一個(gè)是Java生涯的學(xué)習(xí)。關(guān)于這兩部分,我已經(jīng)給出了自己的見解,但是還是那句話,每個(gè)人吸收知識(shí)的時(shí)候,都要有抽取精華,去除糟粕的能力。我所說的,可能有些是對(duì)的,有些是錯(cuò)的,有些是適合你的,有些是不太適合你的,你要自己能夠判斷。其實(shí)你在生活和工作當(dāng)中也是一樣的,你身邊的人形形色色,有的人你喜歡,有的人你很討厭。但其實(shí)你喜歡的人也有缺點(diǎn),你討厭的人也有優(yōu)點(diǎn)。你要學(xué)會(huì)從你討厭的人身上學(xué)會(huì)他的優(yōu)點(diǎn),千萬不要一棒子打死,這只會(huì)讓你失去很多學(xué)習(xí)成長(zhǎng)的機(jī)會(huì)。好了,說了這么多了,就到此為止吧,希望本文可以幫助到作為程序猿或即將成為程序猿的你。
第五篇:給Java新手的一些建議——Java知識(shí)點(diǎn)歸納(Java基礎(chǔ)部分)
北大青鳥華美官網(wǎng): www.tmdps.cn
寫這篇文章的目的是想總結(jié)一下自己這么多年來使用java的一些心得體會(huì),主要是和一些java基礎(chǔ)知識(shí)點(diǎn)相關(guān)的,所以也希望能分享給剛剛?cè)腴T的Java程序員和打算入Java開發(fā)這個(gè)行當(dāng)?shù)臏?zhǔn)新手們,希望可以給大家一些經(jīng)驗(yàn),能讓大家更好學(xué)習(xí)和使用Java。
這次介紹的主要內(nèi)容是和J2SE相關(guān)的部分,另外,會(huì)在以后再介紹些J2EE相關(guān)的、和Java中各個(gè)框架相關(guān)的內(nèi)容。
我覺得對(duì)于J2SE方面主要就是要掌握以下的一些內(nèi)容。1.JVM相關(guān)(包括了各個(gè)版本的特性)
北大青鳥華美官網(wǎng): www.tmdps.cn
對(duì)于剛剛接觸Java的人來說,JVM相關(guān)的知識(shí)不一定需要理解很深,對(duì)此里面的概念有一些簡(jiǎn)單的了解即可。不過對(duì)于一個(gè)有著3年以上Java經(jīng)驗(yàn)的資深開發(fā)者來說,不會(huì)JVM幾乎是不可接受的。
JVM作為java運(yùn)行的基礎(chǔ),很難相信對(duì)于JVM一點(diǎn)都不了解的人可以把java語言吃得很透。我在面試有超過3年Java經(jīng)驗(yàn)的開發(fā)者的時(shí)候,JVM幾乎就是一個(gè)必問的問題了。當(dāng)然JVM不是唯一決定技術(shù)能力好壞的面試問題,但是可以佐證java開發(fā)能力的高低。
在JVM這個(gè)大類中,我認(rèn)為需要掌握的知識(shí)有:JVM內(nèi)存模型和結(jié)構(gòu)GC原理,性能調(diào)優(yōu)調(diào)優(yōu):Thread Dump,分析內(nèi)存結(jié)構(gòu)class 二進(jìn)制字節(jié)碼結(jié)構(gòu),class loader 體系,class加載過程,實(shí)例創(chuàng)建過程方法執(zhí)行過程Java各個(gè)大版本更新提供的新特性(需要簡(jiǎn)單了解)2.Java的運(yùn)行(基礎(chǔ)必備)
這條可能出看很簡(jiǎn)單,java程序的運(yùn)行誰不會(huì)呢?不過很多時(shí)候,我們只是單純通過IDE去執(zhí)行java程序,底層IDE又是如何執(zhí)行java程序呢?很多人并不了解。
這個(gè)知識(shí)點(diǎn)是最最基本的java開發(fā)者需要掌握的,初學(xué)java,第一個(gè)肯定是教你如何在命令行中執(zhí)行java程序,但是很多人一旦把java學(xué)完了,IDE用上了,就把這個(gè)都忘了。為什么強(qiáng)調(diào)要知道這個(gè)呢,知道了java最純粹的啟動(dòng)方式之后,你才能在啟動(dòng)出問題的時(shí)候,去分析當(dāng)時(shí)啟動(dòng)的目錄多少,執(zhí)行命名如何,參數(shù)如何,是否有缺失等。這樣有利于你真正開發(fā)中去解決那些奇奇怪
北大青鳥華美官網(wǎng): www.tmdps.cn 怪的可能和環(huán)境相關(guān)的問題。
在這里需要掌握的知識(shí)有:javac編譯java文件為 class 文件java 命令的使用,帶package的java類如何在命令行中啟動(dòng)java程序涉及到的各個(gè)路徑(classpath,java。library。path,java運(yùn)行的主目錄等)3.數(shù)據(jù)類型
這條沒有什么好多說的,無非就是Java中的基本類型和對(duì)象類型的掌握。可以再了解一些JDK如何自動(dòng)轉(zhuǎn)換方面的知識(shí),包括裝箱拆箱等,還要注意避免裝箱之后的類型相等的判斷
主要知識(shí)點(diǎn):基本類型:int,long,float,double,boolean。。對(duì)應(yīng)的對(duì)象類型: Integer 等類型到基本類型的轉(zhuǎn)換,裝箱和拆箱Object類型: equals,hashcodeString類型的特點(diǎn) 4.對(duì)象和實(shí)例,對(duì)象的創(chuàng)建
在這方面,開發(fā)者需要了解class和instance的概念以及之間的差別,這是java面向?qū)ο筇匦缘囊粋€(gè)基礎(chǔ)。主要知識(shí)點(diǎn)有:Class和 Instance 的概念I(lǐng)nstance 創(chuàng)建的過程:
1。無繼承:分配內(nèi)存空間,初始化變量,調(diào)用構(gòu)造函數(shù)
2。有繼承:處理靜態(tài)動(dòng)作,分配內(nèi)存空間,變量定義為初始值,從基類->子類,處理定義處的初始化,執(zhí)行構(gòu)造方法
需要注意的點(diǎn):
靜態(tài)屬性等從基類->子類進(jìn)行初始化
默認(rèn)無參構(gòu)造方法相關(guān)的特性
北大青鳥華美官網(wǎng): www.tmdps.cn 5.訪問控制
這也是java封裝特性的一個(gè)基礎(chǔ),需要掌握的有:public protected default private 對(duì)于class,method,field 的修飾作用 6.流程控制
Java 流程控制的基礎(chǔ),雖然有些語法不一定很常用,但是都需要了解,并且在合適的地方使用它們。需要掌握的有:if,switch,loop,for,while 等流程控制的語法 7.面向?qū)ο缶幊痰母拍?/p>
這是一個(gè)java的核心概念,對(duì)于任何java開發(fā)者都需要熟練掌握。Java中很多特性或者說知識(shí)點(diǎn)都是和java面向?qū)ο缶幊谈拍钕嚓P(guān)的。在我的理解,一個(gè)好的開發(fā)者不僅僅需要了解這些特性(知識(shí)點(diǎn))本身,也更需要知道這些對(duì)象在java的面向?qū)ο缶幊谈拍钪惺侨绾误w現(xiàn)出來的,這樣更有利于開發(fā)者掌握java這門開發(fā)語言,以及其他面向?qū)ο缶幊痰恼Z言。在這里只是簡(jiǎn)單羅列了一下,主要的知識(shí)點(diǎn)包括有:面向?qū)ο笕筇匦裕悍庋b,繼承,多態(tài);各自的定義概念,有哪些特性體現(xiàn)出來,各自的使用場(chǎng)景靜態(tài)多分派,動(dòng)態(tài)單分派的概念重載的概念和使用繼承:接口多實(shí)現(xiàn),基類單繼承抽象,抽象類,接口多態(tài):方法覆蓋的概念和使用接口回調(diào)
北大青鳥華美官網(wǎng): www.tmdps.cn 8.Static
靜態(tài)屬性在java日常開發(fā)中也是經(jīng)常使用,需要了解和 static 關(guān)鍵字相關(guān)的用法,還有和其他關(guān)鍵字的配合使用,如是否可以和 abstract,final 等關(guān)鍵字聯(lián)合使用。主要需要掌握的有:靜態(tài)屬性的定義,使用,以及類加載時(shí)如何初始化靜態(tài)方法的定義和使用靜態(tài)類的定義和使用靜態(tài)代碼塊的定義和初始化時(shí)機(jī) 9.基礎(chǔ)知識(shí)點(diǎn)
這里主要羅列一些散落的,沒有系統(tǒng)歸類的一些java知識(shí)點(diǎn)。在日常的開發(fā)中用到也不少。這塊內(nèi)容其實(shí)還有很多,目前只是暫時(shí)歸納了這幾個(gè)在這里:
包括有:equals,hashcode,string/stringbuffer,final,finally,finalize 10.集合框架
這個(gè)是一個(gè)需要多加掌握的部分,做java開發(fā),可以說沒有不用到集合框架的,這很重要。但是這里的知識(shí)點(diǎn)并不難,但是對(duì)于集合最好要了解內(nèi)部的實(shí)現(xiàn)方式,因?yàn)檫@樣有助于你在各個(gè)不同的場(chǎng)景選擇適合的框架來解決問題,比如有1W個(gè)元素的集合,經(jīng)常要進(jìn)行contains判斷操作,知道了集合的特性或者內(nèi)部實(shí)現(xiàn),就很容易做出正確的選擇。
這里包括了如下內(nèi)容(并發(fā)相關(guān)不包含在內(nèi)):集合框架的體系:基礎(chǔ)Collection,Map具體集合實(shí)現(xiàn)的內(nèi)容,List,Set,Map 具體的實(shí)
北大青鳥華美官網(wǎng): www.tmdps.cn 現(xiàn),內(nèi)部結(jié)構(gòu),特殊的方法,適用場(chǎng)景等集合相關(guān)的工具類 Collections 等的用法 11.異常框架
異常在java的開發(fā)中可能沒有那么被重視。一般遇到異常,直接上拋,或者隨便catch一下處理之后對(duì)于程序整體運(yùn)行也沒有什么大的影響。不過在企業(yè)級(jí)設(shè)計(jì)開發(fā)中,異常的設(shè)計(jì)與處理的好壞,往往就關(guān)系著這個(gè)系統(tǒng)整體的健壯性。一個(gè)好的系統(tǒng)的異常對(duì)于開發(fā)者來說,處理應(yīng)該統(tǒng)一,避免各處散落很多異常處理邏輯;對(duì)于系統(tǒng)來說,異常應(yīng)該是可控的,并且是易于運(yùn)維的,某些異常出現(xiàn)后,應(yīng)該有應(yīng)對(duì)的方法,知道如何運(yùn)維處理,所以雖然異常框架很簡(jiǎn)單,但是對(duì)于整個(gè)企業(yè)級(jí)應(yīng)用開發(fā)來說,異常處理是很重要的,處理好異常就需要了解Java中的異常體系。
這部分需要掌握的知識(shí)點(diǎn)不多,主要就是:異常的體系:ThrowableExceptionRuntimeExceptionErrorRuntimeException和一般 Exception 的區(qū)別,具體處理方法等 12.Java IO
IO 在java中不僅僅是文件讀寫那么簡(jiǎn)單,也包括了 socket 網(wǎng)絡(luò)的讀寫等等一切的輸入輸出操作。比如說標(biāo)準(zhǔn)HTTP請(qǐng)求中Post的內(nèi)容的讀取也是一個(gè)輸出的過程,等等…
對(duì)于IO,Java不僅提供了基本Input、Output相關(guān)的api,也提供了一些簡(jiǎn)化操作的Reader、北大青鳥華美官網(wǎng): www.tmdps.cn Writer等api,在某些開發(fā)(涉及大量IO操作的項(xiàng)目)中也很重要,一般日常的開發(fā)中也會(huì)涉及(日志,臨時(shí)文件的讀寫等)。
在這中的知識(shí)點(diǎn)主要有:基本IO的體系:包括有InputStream,OutputStream,Reader/Writer,文件讀取,各種流讀取等NIO 的概念,具體使用方式和使用場(chǎng)景 13.多線程并發(fā)
多線程是Java中普遍認(rèn)為比較難的一塊。多線程用好了可以有效提高cpu使用率,提升整體系統(tǒng)效率,特別是在有大量IO操作阻塞的情況下;但是它也是一柄雙刃劍,如果用不好,系統(tǒng)非但提升不大,或者沒有提升,而且還會(huì)帶來多線程之間的調(diào)試時(shí)等問題。
在多線程中內(nèi)容有很多,只是簡(jiǎn)單說明一下Java中初步使用多線程需要掌握的知識(shí)點(diǎn),以后有機(jī)會(huì)單獨(dú)再詳細(xì)介紹一些高級(jí)特性的使用場(chǎng)景。多線程的實(shí)現(xiàn)和啟動(dòng)callable 與runable區(qū)別syncrhoized,reentrantLock各自特點(diǎn)和比對(duì)線程池future 異步方式獲取執(zhí)行結(jié)果concurrent 包lock..14.網(wǎng)絡(luò)
Java中也是提供了可以直接操作 TCP協(xié)議、UDP協(xié)議的API。在需要強(qiáng)調(diào)網(wǎng)絡(luò)性能的情況下,可以直接使用TCP/UDP 進(jìn)行通訊。在查看Tomcat等的源碼中,就可以看到這些相關(guān)API的使用情況。不過一般
北大青鳥華美官網(wǎng): www.tmdps.cn 也比較少會(huì)直接使用TCP,會(huì)使用諸如MINA、Netty這樣的框架來進(jìn)行處理,因?yàn)檫@個(gè)方面的開發(fā)涉及不多,所以就不再詳細(xì)羅列了。15.時(shí)間日期處理
幾乎對(duì)于每個(gè)應(yīng)用來說,時(shí)間日期的處理也是繞不過去的,但是JDK8 之前的時(shí)間相關(guān)API用法并不友好。在那個(gè)時(shí)代,可以選擇Joda等時(shí)間框架。到了JDK8 發(fā)布之后,全新的時(shí)間API基本融合了其他框架的優(yōu)點(diǎn),已經(jīng)可以很好的直接使用了。
對(duì)于Java開發(fā)者來說,需要熟練地使用API來對(duì)時(shí)間和日期做相關(guān)的處理。
具體知識(shí)點(diǎn)不再羅列,會(huì)在以后再寫個(gè)專門的文章來總結(jié)一下JDK8中時(shí)間日期API的用法。
16.XML解析/ JSON解析
其實(shí)這兩塊內(nèi)容都不是J2SE里面的內(nèi)容,但是在日常開發(fā)中,和其他程序交互,和配置文件交互,越來越離不開這兩種格式的解析。
不過對(duì)于一個(gè)開發(fā)者來說,能夠了解一些XML/JSON具體解析的原理和方法,有助于你在各個(gè)具體的場(chǎng)景中更好的選擇合適你的方式來使得你的程序更有效率和更加健壯。
XML:需要了解 DOM解析和 SAX解析的基本原理和各自的適用場(chǎng)景
JSON:需要了解一些常用JSON框架的用法,如 Jackson,F(xiàn)astJson,Gson等。
北大青鳥華美官網(wǎng): www.tmdps.cn 17.Maven的使用
Maven也不是Java里面的內(nèi)容,但是maven是革命性的,給java開發(fā)帶來了巨大的便利。從依賴的引入和管理,開發(fā)流程的更新和發(fā)布產(chǎn)出,乃至版本的更新,使用maven可以大大簡(jiǎn)化開發(fā)過程中的復(fù)雜度,從而節(jié)省大量時(shí)間。可以說,maven已經(jīng)成為java開發(fā)者的標(biāo)配了。所以我把maven也作為一個(gè)java開發(fā)者對(duì)于基礎(chǔ)必備的知識(shí)點(diǎn)。以后會(huì)再放上一些我的一些對(duì)于maven使用的經(jīng)驗(yàn)和技巧等,這里就不再細(xì)說了。18.泛型
這是JDK5開始引入的新概念,其實(shí)是個(gè)語法糖,在編寫java代碼時(shí)會(huì)有些許便利,一般的應(yīng)用或者是業(yè)務(wù)的開發(fā),只需要簡(jiǎn)單使用,不一定會(huì)用到定義泛型這樣的操作,但是開發(fā)一些基礎(chǔ)公共組件會(huì)使用到,可以在需要的時(shí)候再細(xì)看這個(gè)部分,一般情況下只要會(huì)簡(jiǎn)單使用即可。19.標(biāo)注
也是jdk5 之后引入的。spring是個(gè)優(yōu)秀的框架,最開始就以xml作為標(biāo)準(zhǔn)的配置文件。不過到了Spring3 之后,尤其是 spring-boot 興起之后,越來越推崇使用標(biāo)注來簡(jiǎn)化xml配置文件了,對(duì)于開發(fā)者來說,可以節(jié)省不少xml配置的時(shí)間。但是劣勢(shì)是在于標(biāo)注散落在各個(gè)類中,不
北大青鳥華美官網(wǎng): www.tmdps.cn 像xml,可以對(duì)所有配置有個(gè)全局性的理解和管理,所以還沒有辦法說完全就取代所有的xml。對(duì)于一般開發(fā)者,會(huì)使用標(biāo)注即可,一些公共組建的開發(fā)者可能會(huì)需要了解標(biāo)注的定義和實(shí)現(xiàn),可以在具體需要的時(shí)候再細(xì)看。20.RMI
RemoteMethodInvocation,Java語言特有的遠(yuǎn)程調(diào)用接口,使用還是比較簡(jiǎn)單方便。不過需要跨語言的情況下,就需要使用 webservice 等其他方式來支持。一般來說,程序都不需要使用RMI,不過可以在特定的情況下使用,我就在一個(gè)項(xiàng)目中,使用RMI來進(jìn)行程序遠(yuǎn)程啟動(dòng)停止的控制。21.JNI
Java Native Interface,可以允許Java中調(diào)用本地接口方法,一般用于C/C++代碼的調(diào)用。需要注意的是在java中加載so/dll文件的路徑問題,本身調(diào)用接口并不復(fù)雜,但是經(jīng)常在是否加載了所需的本地接口庫中花費(fèi)較多時(shí)間。
以上也只是簡(jiǎn)單介紹了下我對(duì)于這些java基本知識(shí)點(diǎn)和技術(shù)點(diǎn)的一些看法和介紹,這些內(nèi)容都源自于我這些年來使用java的一些總結(jié),希望給剛剛接觸Java,或者打算從Java開發(fā)的人一些經(jīng)驗(yàn),希望能夠更有效率地學(xué)習(xí)和使用java,避免走了彎路浪費(fèi)了寶貴的時(shí)間。這當(dāng)中還
北大青鳥華美官網(wǎng): www.tmdps.cn 有些內(nèi)容不夠完善的地方,會(huì)通過以后的文章再添加上。由于個(gè)人能力有限,當(dāng)然其中也會(huì)有些錯(cuò)誤和疏漏,歡迎指正,一起討論,共同來把這篇文章再完善下,希望它可以真正幫助到有需要的人。