第一篇:java新手入門必看的30個(gè)問題!!!!
新手入門必看的30個(gè)問題!!!2009-10-25 10:04:11 瀏覽次數(shù):44 核心提示:看了好多資料,還是對一些基本問題比較頭大。在論壇看完這個(gè)帖子,腦子里的基本概念有了。
看了好多資料,還是對一些基本問題比較頭大。在論壇看完這個(gè)帖子,腦子里的基本概念有了。什么是Java、Java2、JDK?JDK后面的1.3、1.4.2版本號又是怎么回事? 答:Java是一種通用的,并發(fā)的,強(qiáng)類型的,面向?qū)ο蟮木幊陶Z言(摘自Java規(guī)范第二版)JDK是Sun公司分發(fā)的免費(fèi)Java開發(fā)工具,正式名稱為J2SDK(Java2 Software Develop Kit)。什么是JRE/J2RE? 答:J2RE是Java2 Runtime Environment,即Java運(yùn)行環(huán)境,有時(shí)簡稱JRE。如果你只需要運(yùn)行Java程序或Applet,下載并安裝它即可。
如果你要自行開發(fā)Java軟件,請下載JDK。在JDK中附帶有J2RE。
注意由于Microsoft對Java的支持不完全,請不要使用IE自帶的虛擬機(jī)來運(yùn)行Applet,務(wù)必安裝一個(gè)J2RE或JDK。學(xué)習(xí)Java用什么工具比較好? 答:作者建議首先使用JDK+文本編輯器,這有助你理解下列幾個(gè)基礎(chǔ)概念:path,classpath,package并熟悉基本命令:javac和java。并且下載和你的JDK版本一致的API幫助。
如果你不確定類或函數(shù)的用法,請先查閱API而不是發(fā)貼求助。
當(dāng)你熟悉Java之后,你可以考慮換一個(gè)IDE。很多人推薦JCreator,實(shí)際上JCreator的功能還 是很弱的。
作者推薦eclipse,下載網(wǎng)址http://www.tmdps.cn。因eclispe是免費(fèi)的.學(xué)習(xí)Java有哪些好的參考書? 答:作者首先推薦Thinking in Java,中文名《Java編程思想》,有中文版。該書第一章介紹了很多面向?qū)ο蟮木幊趟枷耄鳛樾率謶?yīng)當(dāng)認(rèn)真閱讀。
除此以外,O′relly出版社和Wrox出版社的書也不錯(cuò)。作者本人不喜歡大陸作者的書。也許你覺得英文太難,但是網(wǎng)上大多數(shù)資料都是英文的。另外,你需要經(jīng)常查閱API,而那也是英文的。Java和C++哪個(gè)更好? 答:這個(gè)問題是一個(gè)很不恰當(dāng)?shù)膯栴}。你應(yīng)該問:Java和C++哪個(gè)更適用于我的項(xiàng)目? 如果你不需要跨平臺(tái),不需要分布式,要強(qiáng)調(diào)程序的運(yùn)行速度,C++更為適用。反之?你應(yīng)當(dāng)考慮Java。什么是J2SE/J2EE/J2ME? 答:J2SE就是一般的Java。
J2ME是針對嵌入式設(shè)備的,比如Java手機(jī),它有自己的SDK。而J2EE使用J2SE的SDK。J2EE規(guī)范更多的是對J2EE服務(wù)器的要求和開發(fā)人員的約束。詳情見后繼《J2EE FAQ》。
二、命令篇 我寫了第一個(gè)Java程序,應(yīng)該如何編譯/運(yùn)行? 答:首先請將程序保存為xxx.java文件,然后在dos窗口下使用javac xxx.java命令,你會(huì)發(fā)現(xiàn)該目錄下多了一個(gè)xxx.class文件,再使用java xxx命令,你的java程序就開始運(yùn)行了。我照你說的做了,但是出現(xiàn)什么“′javac′ 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序或批處理文件。”。
答:你遇到了path問題。操作系統(tǒng)在一定的范圍(path)內(nèi)搜索javac.exe,但是沒能找到。請編輯你的操作系統(tǒng)環(huán)境變量,新增一個(gè)JAVA_HOME變量,設(shè)為你JDK的安裝目錄,再編輯Path變量,加上一項(xiàng) %JAVA_HOME%bin。然后關(guān)掉并新開一個(gè)dos窗口,你就可以使用javac和java命令了。環(huán)境變量怎么設(shè)置? 答:請向身邊會(huì)設(shè)的人咨詢。javac xxx.java順利通過了,但是java xxx的時(shí)候顯示什么“NoClassDefFoundError”?br> 答:你遇到了classpath問題。java命令在一定的范圍(classpath)內(nèi)搜索你要用的class文件,但是未能找到。
首先請確認(rèn)你沒有錯(cuò)敲成java xxx.class,其次,檢查你的CLASSPATH環(huán)境變量,如果你設(shè)置了該變量又沒有包含.(代表當(dāng)前目錄)的?br> 睿?br> 你就會(huì)遇到這個(gè)問題。請?jiān)谀愕腃LASSPATH環(huán)境變量中加入一項(xiàng)。另外參見15。我在java xxx的時(shí)候顯示“Exception in thread ”main“ java.lang.NoSuchMethodError: main”。答:首先,在你的程序中每個(gè)java文件有且只能有一個(gè)public類,這個(gè)類的類名必須和文件名的大小寫完全一樣。其次,在你要運(yùn)行的類中有且只能有一個(gè)public static void main(String[] args)方法,這個(gè)方法就是你的主程序。package是什么意思?怎么用? 答:為了唯一標(biāo)識每個(gè)類并分組,java使用了package的概念。
每個(gè)類都有一個(gè)全名,例如String的全名是java.lang.String,其中java.lang是包名,String是短名。
這樣,如果你也定義了String,你可以把它放在mypackage中,通過使用全名mypackage.String和java.lang.String來區(qū)分這兩個(gè)類。同時(shí),將邏輯上相關(guān)的類放在同一個(gè)包中,可以使程序結(jié)構(gòu)更為清楚。你要做的就是在java文件開頭加一行“package mypackage;”。
注意包沒有嵌套或包含關(guān)系,A包和A.B包對java命令來說是并列的兩個(gè)包。我沒有聲明任何package會(huì)怎么樣? 答:你的類被認(rèn)為放在默認(rèn)包中。這時(shí)全名和短名是一致的。在一個(gè)類中怎么使用其他類?
答:如果你使用java.lang包中的類,不用做任何事。
如果你使用其他包中的類,使用import package1.class1;或 import package2.*;這里.*表示引入這個(gè)包中的所有類。然后在程序中你可以使用其他類的短名。如果短名有沖突,使用全名來區(qū)分。我用了package的時(shí)候顯示“NoClassDefFoundError”,但是我把所有package去掉的時(shí)候能正常運(yùn)行。
答:將你的java文件按包名存放。
比如你的工作目錄是/work,你的類是package1.class1,那么將它存放為/work/package1/class1.java。如果沒有聲明包,那么直接放在/work下。
在/work下執(zhí)行javac package1/class1.java,再執(zhí)行java package1.class1,你會(huì)發(fā)現(xiàn)一切正常。另外,你可以考慮開始使用IDE。我想把java編譯成exe文件,該怎么做? 答:JDK只能將java源文件編譯為class文件。
class文件是一種跨平臺(tái)的字節(jié)碼,必須依賴平臺(tái)相關(guān)的JRE來運(yùn)行。Java以此來實(shí)現(xiàn)跨平臺(tái).有些開發(fā)工具可以將java文件編譯為exe文件。作者反對這種做法,因?yàn)檫@樣就取消了跨平臺(tái)性。如果你確信你的軟件只在Windows平臺(tái)上運(yùn)行,你可以考慮使用C++/C#來編程。我在編譯的時(shí)候遇到什么“deprecated API”,是什么意思? 答:所謂deprecated是指已經(jīng)?時(shí),但是為了向前兼容起見仍然保留的方法??br> 這些方法可能會(huì)在以后取消支持。你應(yīng)當(dāng)改用較新的方法。一般在API里面會(huì)說明你應(yīng)當(dāng)用什么方法來代替之。
三、I/O篇 我怎么給java程序加啟動(dòng)參數(shù),就像dir /p/w那樣? 答:還記得public static void main(String[] args)嗎?這里的args就是你的啟動(dòng)參數(shù)。在運(yùn)行時(shí)你輸入java package1.class1-arg1-arg2,args中就會(huì)有兩個(gè)String,一個(gè)是arg1,另一個(gè)是arg2。我怎么從鍵盤輸入一個(gè)int/double/字符串? 答:java的I/O操作比C++要復(fù)雜一點(diǎn)。如果要從鍵盤輸入,樣例代碼如下:BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));String s = cin.readLine();這樣你就獲得了一個(gè)字符串,如果你需要數(shù)字的話再加上:int n = Integer.parseInt(s);或者 double d = Double.parseDouble(s);我怎么輸出一個(gè)int/double/字符串? 答:在程序開始寫: PrintWriter cout = new PrintWriter(System.out);需要時(shí)寫:
cout.print(n);或者cout.println(“hello”)等等。我發(fā)現(xiàn)有些書上直接用System.in和System.out輸入輸出,比你要簡單得多。答:java使用unicode,是雙字節(jié)。而System.in和System.out是單字節(jié)的stream。如果你要輸入輸出雙字節(jié)文字比如中文,請使用作者的做法。我怎么從文件輸入一個(gè)int/double/字符串? 答:類似于從鍵盤輸入,只不過換成BufferedReader fin = new BufferedReader(new FileReader(“ myFileName ”));PrintWriter fout = new PrintWriter(new FileWriter(“ myFileName ”));另外如果你還沒下載API,請開始下載并閱讀java.io包中的內(nèi)容。我想讀寫文件的指定位置,該怎么辦? 答:你肯定沒有認(rèn)真看API。java.io.RandomAccessFile可以滿足你的需要。怎么判斷要讀的文件已經(jīng)到了盡頭? 答:你肯定沒有認(rèn)真看API。在Reaer的read方法中明確說明返回-1表示流的結(jié)尾。
四、關(guān)鍵字篇 java里面怎么定義宏? 答:java不支持宏,因?yàn)楹甏鷵Q不能保證類型安全。
如果你需要定義常量,可以將它定義為某個(gè)類的static final成員。參見26和30。java里面沒法用const。
答:你可以用final關(guān)鍵字。例如 final int m = 9。被聲明為final的變量不能被再次賦值.final也可以用于聲明方法或類,被聲明為final的方法或類不能被繼承。注意const是java的保留字以備擴(kuò)充。
java里面也不能用goto。
答:甚至在面向過程的語言中你也可以完全不用goto。請檢查你的程序流程是否合理。如果你需要從多層循環(huán)中迅速跳出,java增強(qiáng)了(和C++相比)break和continue的功能。例如: outer : while(...){ inner : for(...){...break inner;......continue outer;...}
} 和const一樣,goto也是java的保留字以備擴(kuò)充。
java里面能不能重載操作符? 答:不能。String的+號是唯一一個(gè)內(nèi)置的重載操作符。你可以通過定義接口和方法來實(shí)現(xiàn)類似功能。
我new了一個(gè)對象,但是沒法delete掉它。
答:java有自動(dòng)內(nèi)存回收機(jī)制,即所謂Garbarge Collector。你再也不用擔(dān)心指針錯(cuò)誤了.我想知道為什么main方法必須被聲明為public static? 答:聲明為public是為了這個(gè)方法可以被外部調(diào)用,詳情見面向?qū)ο笃?7。static是為了將某個(gè)成員變量/方法關(guān)聯(lián)到類(class)而非實(shí)例(instance)。
你不需要?jiǎng)?chuàng)建一個(gè)對象就可以直接使用這個(gè)類的static成員,在A類中調(diào)用B類的static成員可以使用B.staticMember的寫法。
注意一個(gè)類的static成員變量是唯一的,被所有該類對象所共享的.
第二篇:Java初學(xué)者如何學(xué)習(xí)(必看)(本站推薦)
這篇文章是我無意中在網(wǎng)上看到的,很有感觸,感覺對初學(xué)者肯定會(huì)有幫助,打算整理一下再發(fā)出來的,可是改了半天,還是沒人家原本的內(nèi)容連貫,有邏輯性。所以直接拿過來了。希望想學(xué)習(xí)java朋友可以花點(diǎn)時(shí)間看看,看完肯定會(huì)有所收獲的,我不多說了,趕緊看看牛人的建議吧。JAVA交流群四一八,三五五,加上五三一。給初學(xué)者之一:淺談java及應(yīng)用 學(xué)java不知不覺也已經(jīng)三年了
每次上網(wǎng),泡bbs逛論壇,沒少去java相關(guān)的版面 總體感覺初學(xué)者多,高手少,精通的更少
很多人對java感到茫然,不知所措,不懂java能做什么 即便知道了java很有用,也不清楚該從哪里入手 所以就有了 java入門難 這一說法
ok,那我們就從java到底能做什么聊起 先說什么是java java是一種面向?qū)ο笳Z言,真正的面向?qū)ο螅魏魏瘮?shù)和變量都以類(class)封裝起來 至于什么是對象什么是類,我就不廢話了
關(guān)于這兩個(gè)概念的解釋任何一本面向?qū)ο笳Z言的教材里面都有 知道了什么是java,那自然就會(huì)對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ì)對內(nèi)存管理深惡痛絕 因?yàn)檫@使得我們不能把主要精力放在我們關(guān)心的事情上 而需要考慮計(jì)算機(jī)內(nèi)部的一些事情,作為一個(gè)軟件工程師
我想沒有一個(gè)人愿意把大量的時(shí)間花在內(nèi)存管理上,畢竟我們不是電子工程師 此時(shí)java的優(yōu)勢體現(xiàn)出來了,它完全屏蔽了內(nèi)存管理
也就是說,如果你用java寫程序,寫出來的任何一個(gè)程序內(nèi)存上的開銷,都不受你控制 乍一看,似乎你受到了束縛,但實(shí)際上不是這樣
因?yàn)殡m然你的程序無法對內(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ù)器這一端來說還是非常有市場的 而且很重要的windows不安全,在ms的宣傳中我想所有人都很少看到安全二字 因?yàn)閣indows操作系統(tǒng)針對的是pc用戶,pc死機(jī)就死機(jī)咯,大不了重啟 最經(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è)安全是針對你的系統(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++,是不是要針對每一款手機(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沒有市場,而且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)心的問題了,而且對于企業(yè)級的應(yīng)用來說
沒有什么比安全穩(wěn)定更重要的,換句話說,我們可以忍受慢,但是不能忍受死機(jī)和藍(lán)屏 而且越大型的應(yīng)用,這種慢的劣勢體現(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í)挺順眼的,他們就是吃unix飯長大的
而unix又是吃百家飯的,不像ms那么唯利是圖,所以不怎么對中國人友好 加上我國又沒有公司在做操作系統(tǒng),所以看上去是不怎么順眼 其實(shí)玩過unix的人都知道,unix對中文的支持一直不怎么好 給初學(xué)者之二:從JDK說起
在知道了java有什么優(yōu)點(diǎn),能做什么之后 就該說一下java該如何去學(xué)了
在說java如何去學(xué)之前,有必要把java的幾個(gè)大方向做一個(gè)簡單說明 早在99年的時(shí)候
sun公司做出了一個(gè)決定,將java應(yīng)用平臺(tái)做一個(gè)劃分 畢竟在不同領(lǐng)域,語言應(yīng)用特性是有區(qū)別的
針對不同領(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è)級應(yīng)用的基礎(chǔ)
這里要特別說明一下J2SE J2EE J2ME中2的意思 其實(shí)2就是英文單詞to的諧音,就是to的意思
而不是second edition,當(dāng)然java 2本身版本號就是1.2,也有點(diǎn)2nd edition的味道 說點(diǎn)題外的,sun公司發(fā)布的java版本很有意思
雖然總是寫是1.X但其實(shí)外界對這種版的說法也就是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? 簡單地說就是Application Programming Interface,應(yīng)用程序編程接口 在java里面,就是一些已經(jīng)寫好了的類打成的包
這又要解釋什么是類什么是包了,簡單說一下,包就是類的集合 一個(gè)包包含零個(gè)或多個(gè)類,嗯,具體的可以去看書
這些類是java的基礎(chǔ)類,常用的類,可以簡單理解成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教程》初級與高級篇各一本 還有就是《21天學(xué)通java》雖然有人說21天系列是爛書,但個(gè)人感覺
對于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è)級應(yīng)用之硬件篇
總算講到企業(yè)級應(yīng)用了,內(nèi)容開始逐漸有趣起來 java企業(yè)級應(yīng)用分為硬件篇和軟件篇
重點(diǎn)在軟件,硬件是外延,嚴(yán)格地說與java沒有必然聯(lián)系 但是,由于java是網(wǎng)絡(luò)語言,不了解硬件的一些基礎(chǔ)知識
軟件知道再多也沒什么用,不要上了戰(zhàn)場還不知道為什么而打仗
硬件是軟件的基礎(chǔ),在這個(gè)前提下,有必要專門花一點(diǎn)點(diǎ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ā)展
電腦性能逐漸得到提升,速度快了起來,成本也逐漸低了下來
于是人們造出了第二臺(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è)對計(jì)算機(jī)性能的要求各不相同
于是開始把計(jì)算機(jī)劃分檔次,最簡單地是按照計(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)在市場上沒有人這樣分,要是出去買機(jī)器,對硬件供應(yīng)商說
我要買一款中型機(jī),或者說,我要買一款小型機(jī),硬件供應(yīng)商肯定會(huì)問問題
他們會(huì)問你買機(jī)器干什么用的?科學(xué)計(jì)算啊還是居家用,是作服務(wù)器啊還是圖形設(shè)計(jì) 但不管怎樣,簡單地說大中小型機(jī)已經(jīng)沒有什么意義了 我們按照使用范疇來劃分 簡單劃分為
服務(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ù)對機(jī)器都有一些特定的要求,尤其強(qiáng)調(diào)安全和穩(wěn)定 工作站(workstation)
工作站其實(shí)是圖形工作站的簡稱,說白了,就是某種功能極其強(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)在國際市場上有聯(lián)想和DELL(戴爾),目前戴爾還是國際老大 還有HP康柏
然后是網(wǎng)絡(luò),也就是路由器和交換機(jī)
這塊市場嘛,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)用市場,比如賣飛機(jī)票
德國的漢莎,中國的中航信,香港的國泰用的都是尤利(美國的公司,英文名我忘了)其它用的是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)]市場了 將來的趨勢是用一整個(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è)級應(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è)級應(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ù))就必須要在這一層完成下面放著這些概念不談,我們來說說將來的趨勢 趨勢一:
瘦客戶端,很早很早以前,當(dāng)時(shí)C/S模式也就是client/server 客戶端軟件大行其道的年代,一個(gè)pc用戶,是采用一個(gè)傻終端連接到服務(wù)器上 然后進(jìn)行相應(yīng)的操作,最典型的就是我們上bbs經(jīng)常用的c-term 這就是那個(gè)時(shí)代的產(chǎn)物,同樣還有我國現(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模式
但需要指出的是,雖然瘦客戶端是趨勢,但并不代表胖客戶端沒有市場 尤其是一些復(fù)雜的業(yè)務(wù)操作,還是瀏覽器這種簡單軟件無法勝任的趨勢二:
傻數(shù)據(jù)庫,ok,首先,我承認(rèn),這個(gè)名詞是我發(fā)明的,但我實(shí)在無法找到一個(gè)更好的表達(dá) 什么是傻數(shù)據(jù)庫,如果誰對數(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ù)庫都有自己的工具,完全不一樣,亂七八糟,沒有人喜歡面對他們 除了數(shù)據(jù)庫維護(hù)人員,也就是DBA,我們是軟件工程師,維護(hù)的事讓他們?nèi)プ?/p>
而且嚴(yán)禁數(shù)據(jù)庫維護(hù)人員改動(dòng)數(shù)據(jù)庫的數(shù)據(jù),他們只做備份,必要時(shí)候恢復(fù)一下就是了 了解了這兩個(gè)趨勢之后,是不是有種砍頭去尾保中間的感覺?
沒錯(cuò),未來的趨勢就是中間件時(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è)非常簡單的例子,網(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è)級應(yīng)用之中間件 前面一篇簡單介紹了一下應(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)的死亡 比如說我們在某個(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è)簡單例子,比如說最常見的是將數(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),他需要請?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,那我們還需要請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è)請求給容器,容器通過調(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è)請求的時(shí)候
appserver自動(dòng)找到相應(yīng)容器中的組件,執(zhí)行組件中的程序塊,把得到結(jié)果返還給客戶 而我們要做的事就是寫組件也就是javabean,然后放到appserver里面去就可以了 至于怎樣與IE通訊,怎樣截獲網(wǎng)絡(luò)上的請求,怎樣控制對象的數(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ù)交互
要說明的是上圖中還包含有應(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è)以后再說 嗯,那么話題再回到中間件上去,什么是中間件?
appserver就是所謂的中間件,但是中間件不僅有appserver,還有其他的東西 換句話說,appserver只是中間件的一種
而關(guān)于中間件有諸多規(guī)范以及遵循這些規(guī)范的模型 最流行的規(guī)范無非兩種,一個(gè)是j2ee還有一個(gè)是.net 但是.net幾乎只有微軟在用,所以很多人把.net這個(gè)規(guī)范就當(dāng)成是微軟的中間件產(chǎn)品 也不為過,畢竟沒幾個(gè)公司喜歡跟著微軟屁股后面跑的 給初學(xué)者之六:java企業(yè)級應(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):性能一級棒,大企業(yè)大公司做系統(tǒng)的首選,世界五百強(qiáng)幾乎都是這套組合 缺點(diǎn):極貴 超級組合,也是最安全最酷的黃金組合,硬件采用SUN公司的機(jī)器 但是SUN的服務(wù)器很貴,同等價(jià)格不如去買IBM的機(jī)器
SUN的服務(wù)器支持Solaris的效果自然不用說,Solaris號稱是世界上最安全的操作系統(tǒng) Oracle也是世界上最安全,性能最優(yōu)的數(shù)據(jù)庫,Weblogic是當(dāng)今性能最優(yōu)的appserver JBuilder和IDEA各有所長,JBuilder是Borland公司的招牌之一
是當(dāng)今世界上最流行的java IDE,用delphi寫的,但網(wǎng)絡(luò)上評價(jià)似乎不是很好 IDEA擁有插件功能,界面在所有java IDE中最為漂亮,東歐人開發(fā)的產(chǎn)品 東歐人嚴(yán)謹(jǐn)?shù)淖黠L(fēng)在這個(gè)產(chǎn)品上體現(xiàn)得尤為突出,用java寫的
IDEA甚至號稱自己被業(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):便宜,性能未必最佳,但是對付中小企業(yè)足夠了 缺點(diǎn):出了問題自己抗吧
嗯,這是java陣營最大的特色,免費(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)對數(shù)據(jù)庫要求不高 或者安全要求不是非常嚴(yán)格,mysql是一個(gè)非常不錯(cuò)的選擇 開發(fā)工具方面,netbeans是sun公司極力推廣的一種IDE 聽說在北美市場使用量已經(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: 微軟陣營
操作系統(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è)置了種種障礙 而且針對windows,微軟做了大量的優(yōu)化,可以這么看.net就是與windows捆綁的一套產(chǎn)品
所以有些人說,微軟的產(chǎn)品離開了windows,就是渣
而且.net開源選擇也少,安全性方面考慮,windows本身就有一堆補(bǔ)丁要打了 sqlserver也不安全,至于.net到底安全不安全我不清楚,畢竟我沒怎么用過 但整體考慮,感覺.net不是大企業(yè)的首選,鑒于其濃厚的商業(yè)背景 也不是中小企業(yè)的首選,但是必須看到
客戶端也就是微機(jī)pc市場已經(jīng)完全被windows所壟斷
所以在一些快速開發(fā),還有和微軟產(chǎn)品兼容性要求較高的領(lǐng)域,.net還是比較有市場的 最后一個(gè)visual studio對它之前的版本兼容,且支持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ù)器上互相移植 比如你可以在測試的時(shí)候用jboss 而在正式投產(chǎn)上線的時(shí)候使用websphere,只需要在配置文件中作相應(yīng)改動(dòng)即可 給初學(xué)者之七:java企業(yè)級應(yīng)用之術(shù)語篇
在了解完J2ee的相關(guān)周邊產(chǎn)品之后需要深入J2ee規(guī)范內(nèi)部去了解一下到底這些規(guī)范 這里介紹幾個(gè)最常用的規(guī)范 再繼續(xù)說下去之前有必要說幾個(gè)常識
下面進(jìn)入正題 再談容器
前面介紹過容器,我覺得有必要再補(bǔ)充一點(diǎn)
容器從某種意義上說其實(shí)就是一個(gè)可運(yùn)行的java寫的應(yīng)用程序 猶如c++/c編譯后生成的.exe文件
不同的是java編譯后的文件需要用命令行或者腳本啟動(dòng)執(zhí)行 由于容器是由java寫的,所以容器都能夠跨平臺(tái)
雖說如此,似乎大部分容器都針對不同的操作系統(tǒng)提供了不同的版本 但可以肯定的一點(diǎn)是,相同容器間的移植組件不需要重新編譯 Servlet web容器組件
Servlet確切地說,就是web容器運(yùn)行的java組件
與普通javabean不同的是,Servlet定義了一系列方法//比如init()和destroy()供容器調(diào)用,調(diào)用的主要目的是為了管理
當(dāng)一個(gè)request請求被web容器截獲之后,容器分析該請求地址 然后通過一個(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對于web容器來說其實(shí)是一種東西,雖然它們編寫遵循的標(biāo)準(zhǔ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è)級應(yīng)用的需要 最典型的就是虛擬機(jī)提供的垃圾回收收集機(jī)制也就是GC不夠完善 可以優(yōu)化的余地極大,在這種情況下,EJB應(yīng)運(yùn)而生 EJB和其它組件一樣,不過遵循了某些規(guī)范而已
但是這些規(guī)范更多的是為充分利用機(jī)器并提高性能為主要目的的 舉個(gè)簡單例子
比如某個(gè)web服務(wù)器有100個(gè)用戶同時(shí)連接上
由于網(wǎng)絡(luò)連接是瞬時(shí)連接,所以很多時(shí)候并發(fā)數(shù)并沒有100那么大 前一秒有可能有30個(gè)請求被發(fā)送過來并被處理 后一秒可以只有10個(gè)請求被發(fā)送過來并被處理
只有在非常非常極端的情況下才有可能發(fā)生100個(gè)請求同時(shí)被發(fā)送過來并被處理的情況 那么我們是否需要保留100個(gè)那么多個(gè)對象在服務(wù)器的內(nèi)存里面去處理這些請求呢? 很顯然,不需要,大多數(shù)時(shí)候//甚至可以說是所有時(shí)候,我不相信有那么極端的情況 我們只需要保存其中的10-30%就夠了,那么什么時(shí)候需要20%,什么時(shí)候需要50% 甚至100%,這個(gè)過程就交給容器去管理,這就是ejb容器每天在干的事 管理內(nèi)存中活躍的對象
恩,必須強(qiáng)調(diào)的一點(diǎn)是,由于使用的不成熟 我們經(jīng)常把規(guī)范以及具體的應(yīng)用兩個(gè)名詞混用
舉個(gè)簡單例子,我們說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)并不大了 這類高級應(yīng)用只對AppServer應(yīng)用服務(wù)器產(chǎn)商重要 也不再羅嗦了---------記得聽說過這樣一種說法
大一時(shí)候不知道自己不知道 大二時(shí)候知道自己不知道 大三時(shí)候不知道自己知道 大四時(shí)候知道自己知道 為什么呢,因?yàn)榇?/p>
一時(shí)候剛進(jìn)大學(xué),什么都不懂,很正常,大家都一樣 大二或者大三時(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ǔ)知識 但是騙騙外行,蒙蒙國企那些吃閑飯的管理人員問題不大
給初學(xué)者之八:java高級應(yīng)用之框架篇 沒錯(cuò),我沒敲錯(cuò)
之所以不再聲稱是企業(yè)級應(yīng)用而稱之為高級應(yīng)用 是因?yàn)橄旅嬉v的東西屬于純民間性質(zhì) 是java具體應(yīng)用的上層建筑,可用可不用,沒有人強(qiáng)迫你用 首先給框架//framework 下一個(gè)定義
我想讀者你可能聽說過.net framework這個(gè)概念
沒錯(cuò),我們將要說的framework也和這個(gè)framework差不多 所不同的是.net framework的競爭對象是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)的誕生,在美國 恩,現(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ū)廣泛討論,最終對規(guī)范的制定產(chǎn)生巨大的影響 其中就包括企業(yè)級的參與者,相當(dāng)有名的JBoss以及我國的金碟公司都是其中的成員 下面介紹一下幾個(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ā)送請求,Viewer把這個(gè)請求轉(zhuǎn)發(fā)給Controller Controller通過調(diào)用一個(gè)Model來處理該請求,然后返回?cái)?shù)據(jù)到Viewer 這么一個(gè)過程,從而達(dá)到數(shù)據(jù)與邏輯的剝離,增強(qiáng)代碼可讀性,降低維護(hù)成本 而幫助人們實(shí)現(xiàn)這一系列東西的就是Struts框架,就是這么一個(gè)東西 Struts的競爭對手主要是產(chǎn)商們極力倡導(dǎo)的JSF也就是Java Server Faces 但是由于Struts出道時(shí)間早,所以應(yīng)用比較多 JSF則是產(chǎn)商們大力支持,前景看好
對于這一層來說,在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 太重了,對于單機(jī)的系統(tǒng)來說,沒有必要使用那么復(fù)雜的東西 于是就開始設(shè)計(jì)并引導(dǎo)Spring小組開發(fā)出這樣一個(gè)構(gòu)架
不能不說他是個(gè)天才,因?yàn)榈牡拇_確不是所有的系統(tǒng)都是跨多服務(wù)器的 沒有必要把一個(gè)簡單的系統(tǒng)設(shè)計(jì)得那么復(fù)雜//天才的那幾個(gè)共性又體現(xiàn)出來了 Spring從誕生之日起就是針對EJB的,力爭在不少應(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ì)找你。
Hibernate 名字取材自O(shè)RM最早的一句玩笑話//ORM就是OR-Mapping 說用了ORM之后,程序員就可以去冬眠了,而不需要操心那么多事
這里不得不說的是,該框架由于做得太好,以至于被J2ee招安,成為EJB3.0的一部分 替代原有EJB2.X里面關(guān)于Entity Bean而成為EJB ORM的工具 這里解釋一下ORM//OR-Mapping 中文名對象關(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í)體都是以對象的形式存在,一個(gè)個(gè)對象 zhaoce是以這種形式存在的 Human human=new Human();human.setName(“zhaoce”)human.setSex(“m”);human.setAge(23);這樣的,那么我們知道,傳統(tǒng)的JDBC是通過一個(gè)二維字符串將數(shù)據(jù)取出 需要我們自己將其包裝成對象,在存入的時(shí)候,我們還需要將對象拆開 放入sql語句中//Insert into Huamn values('zhaoce','m',23)然后執(zhí)行該sql語句
太麻煩太麻煩,ORM理念的提出改變了這一切,ORM認(rèn)為,這些東西應(yīng)該由框架來做 而不是程序員,程序員做他該做的,不要為這種破事分心,還測試半天 于是就出現(xiàn)了Hibernate,JDO,TopLink等等,甚至.net里面也有ADO.net 過去一段時(shí)間是Hibernate和JDO爭風(fēng),現(xiàn)在看來Hibernate逐漸成為主流并被官方接納 成為規(guī)范標(biāo)準(zhǔn)之一,替代掉原來EJB2.X的ORM EntityBean TopLink則是Oracle公司推出和Oracle數(shù)據(jù)庫結(jié)合的一種ORM 商業(yè)用軟件,貴且復(fù)雜,不過正在逐漸開放
而象表示層一樣,這一種專門面對數(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)過長期實(shí)踐之后得出了一堆結(jié)論和經(jīng)驗(yàn) 并認(rèn)為這樣做才是最安全,或說是最有效率的 這就是模式,模式是編程高手之間交流的橋梁 兩個(gè)編程高手通過統(tǒng)一命名的模式了解對方的思想
當(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é)模式不可定勢,不要學(xué)死,活學(xué)活用,無招勝有招才是最高境界 JavaDoc 文檔工具,極其好用
可以根據(jù)注釋自動(dòng)生成HTML文檔 Ant 98年,有一位程序員在從歐洲飛回美國的飛機(jī)上想到了這么一個(gè)東西 從而改變了整個(gè)世界,他的名字叫James Duncan Davidson 組織管理工具,可以這么描述它
比如你想在編譯之后自動(dòng)再次生成JavaDoc 那么你只需要編輯Ant腳本//對,就像Windows腳本那樣 然后批處理就可以了,不過現(xiàn)在Ant已經(jīng)廣泛集成到IDE中去 不需要自己手動(dòng)編寫,不過如果想要炫炫,據(jù)說此招百試不爽 JUnit 測試工具,Unit家族可不只有JUnit 還有其它版本的,這個(gè)不細(xì)說,具體實(shí)踐一下就明白了 POJO //Plain Old Java Object 就是傳統(tǒng)的Java對象,也就是一個(gè)JavaBean 由虛擬機(jī)來掌握其生死
常用的兩個(gè)管理構(gòu)架/規(guī)范是Spring和EJB容器 命名由來是某人//名字我忘了
覺得我們使用了太多的規(guī)范,以至于我們都忘記了純粹的java對象 以至于我們都忽略了它的存在,所以叫了這么一個(gè)名字 以喚醒人們的記憶,這個(gè)意義上來說EJB其實(shí)不能算是POJO 畢竟遵循了一堆的接口,但是不管怎樣,接口歸接口,還是沒有繼承類 沒有被強(qiáng)加什么//遵循可以寫空方法假遵循 所以說還是POJO也對 但是由于這種東西缺乏管理,不象Servlet有專門的容器管理并繼承了一定的類 而沒有管理的對象在虛擬機(jī)中是很危險(xiǎn)的,因?yàn)槔厥諜C(jī)制各個(gè)虛擬機(jī)不同 而且也不怎樣,極有可能長時(shí)間不回收,這樣在企業(yè)級的應(yīng)用中呢 就有可能造成內(nèi)存大量被占用從而死機(jī),毫無疑問,這種機(jī)制需要優(yōu)化 這種優(yōu)化就是通過EJB容器或者Spring構(gòu)架來實(shí)現(xiàn) 這么做還有一個(gè)好處就是迫使程序員對每一個(gè)類做封裝
強(qiáng)迫他做管理,以達(dá)到防止內(nèi)存泄露的目的,內(nèi)存泄露最經(jīng)常出現(xiàn)的錯(cuò)誤就是 引用未釋放,引用最典型體現(xiàn)在new這個(gè)關(guān)鍵字上,new得越多引用得越多 隨著時(shí)間地增長,有可能導(dǎo)致循環(huán),不停new new new new new.....其中哪怕只要有一個(gè)new處理不當(dāng),虛擬機(jī)無法回收內(nèi)存 那就極有可能完蛋,而且這種小bug越是在大的項(xiàng)目越是難以找到 有可能因?yàn)橐粋€(gè)人而影響整個(gè)項(xiàng)目組,所以不妨記住我的一條經(jīng)驗(yàn) 好的系統(tǒng)框架不應(yīng)該在業(yè)務(wù)邏輯流程中出現(xiàn)new關(guān)鍵字 現(xiàn)在不理解也無所謂,將來有一天會(huì)明白的 SOA 面向服務(wù)的構(gòu)架
不說太多,這個(gè)屬于上上層建筑
不過不妨記住我的一句話,可以幫助理解這個(gè)概念 面向什么就是對什么做封裝 面向?qū)ο缶褪菍ο笞龇庋b 面向服務(wù)類似,剩下的靠悟性 反射
1.4新增功能,非常強(qiáng)大
通過反射,程序可以解析出類本身的屬性也就是變量
/注意這里說的屬性不是.net里面的屬性,我不喜歡微軟造的新名詞,亂 還有行為也就是方法,然后通過invoke()方法調(diào)用該方法 甚至可以新增對象等,java首創(chuàng),本是其它語言所沒有的
后來被微軟抄了去,利用該功能,開源框架廣泛受益并大量采用,近乎瘋狂地使用 具體就不說了,最后要指出的是,有一種說法是利用反射會(huì)降低效率 在早期的時(shí)候,的確是,現(xiàn)在不會(huì)了,放心使用 容器
5.0以后的版本在J2SE中都出現(xiàn)了容器 各位甚至可以自己嘗試用標(biāo)準(zhǔn)庫去使用容器 書籍
《Thinking in Java》 //實(shí)話說,一般,尤其是翻譯后的版本,原版還行 《Java教程》 //電子工業(yè)出版社出版的那本,上下冊,很厚,但翻譯得不錯(cuò) 《21天學(xué)通Java》 //入門極好,但是《21天學(xué)通j2ee》極爛,不要買 《Mastering EJB》 //翻譯過的書質(zhì)量我不清楚,估計(jì)不怎樣,請看原版書籍 《精通Hibernate》 //看清楚作者,孫衛(wèi)琴,其它人的別買
其它的可以不用了,網(wǎng)絡(luò)上的遠(yuǎn)比書上來得多,來得好,雖然也來得雜 最后的建議 一,不要做一個(gè)浮躁的人 二,學(xué)好英語,很重要 三,閱讀源代碼和文檔
四,共享源代碼,不要做一個(gè)功利的人 五,熱愛Java 相信能看到這里的朋友都是真心想學(xué)習(xí)java,在編程的路上你已經(jīng)成功的走出了第一步,接下來就是努力的走下去。。加Java學(xué)習(xí)群四一八,三五五,五三一。
第三篇:JAVA實(shí)習(xí)生問題
JAVA實(shí)習(xí)生問題:
1.我班只招三人。2.實(shí)習(xí)從現(xiàn)在開始,至于結(jié)束,暫時(shí)沒有時(shí)間限制,因?yàn)楣卷?xiàng)目較多,缺乏人手,項(xiàng)目周期長。聽他們說他們現(xiàn)在接了一個(gè)安徽省的云平臺(tái)項(xiàng)目,這個(gè)就夠他們忙的了。如果最后你們能夠成長起來,并且愿意留下來,他們也很高興,也就相當(dāng)于培養(yǎng)自己的員工。
3.工作內(nèi)容:項(xiàng)目組帶著做項(xiàng)目。相當(dāng)于一邊學(xué)習(xí)一邊動(dòng)手做。所以興趣很重要,如果很有興趣,具有一定的分析問題解決問題的能力,遇到問題,則是自己積極想辦法解決,而且覺得很有成就感,在有興趣的前提下,跟著項(xiàng)目組做項(xiàng)目也是學(xué)的最快的;但是如果興趣并不是很大,那么就變成了壓力、痛苦和無聊。
4.此次公司招實(shí)習(xí)生,對基礎(chǔ)沒什么要求(只要學(xué)過java就行),重要的是興趣。如果動(dòng)手能力、自學(xué)能力較強(qiáng),具有較強(qiáng)的分析問題、解決問題的能力,即使基礎(chǔ)不是很好,也應(yīng)該問題不大。有興趣,遇到問題就不會(huì)覺得難,而是自己積極的想辦法去解決。
5.對于女生來說,需要考慮的更多一些,比如安全問題,畢竟是在校外實(shí)習(xí)。這些問題你們自己要考慮到,也都是要讓你們自己負(fù)責(zé)的。要慎重,自己考慮清楚。
6.公司招實(shí)習(xí)生的目的是幫著項(xiàng)目組做項(xiàng)目。不是很想干的,最好別去。
7.工作有兩個(gè)方向,軟件開發(fā)or系統(tǒng)集成,方向自己選,看你們對哪一塊感興趣。如果基礎(chǔ)好一點(diǎn),項(xiàng)目組就帶著你們做;如果基礎(chǔ)薄弱,不光帶著做,還會(huì)有培訓(xùn)。實(shí)際上帶著做項(xiàng)目,是學(xué)的最快的,但是前提是有興趣。至于具體做什么,要看是什么項(xiàng)目,是項(xiàng)目中的哪一部分。
第四篇:Java面試問題
1、引用CSS樣式有哪兩種方式?
Link,@import2、js怎么控制兩個(gè)文本框,當(dāng)選中的時(shí)候邊框變空,沒選中的變會(huì)原來的顏色。onFocus=“document.getElementById('text1').style.backgroundColor='#eee'”
onblur=“document.getElementById('text1').style.backgroundColor='#fff'”
3、查詢數(shù)據(jù)庫表顯示在頁面需要新建多少個(gè)class文件和xml文件?
4、spring有多少種注入方式?
注入方法1:構(gòu)造方法方式 2:屬性注入 3:靜態(tài)工廠方法參數(shù)注入 4: 接口注入
第五篇:java 基礎(chǔ)要點(diǎn)總結(jié) 學(xué)習(xí)java必看
Java基礎(chǔ)
1.JAVA程序是由1個(gè)或者N個(gè)CLASS組成的程序
2.編寫---javac進(jìn)行編譯------java進(jìn)行執(zhí)行
3.類名的命名:規(guī)范:第一個(gè)字母要大寫 第一字母必須是字母 下劃線美圓符號 人民幣符號//
4.不是第一個(gè)字母的話 可以是數(shù)字
5.文件名和類名的關(guān)系 如果class前面沒有public 是可以不一樣的 但是如果有的話 必須一樣
6.兩個(gè)BYTE SHORT類型進(jìn)行加減乘除的時(shí)候 返回的結(jié)果是int類型
/*
需求:定義一個(gè)hello world小程序。
步驟:
1,通過class關(guān)鍵字定義一個(gè)類。將代碼都編寫到該類中。
2,為了保證該的獨(dú)立運(yùn)行。在類中定義個(gè)主函數(shù)。格式public static void main(String[] args)3,保存成一個(gè)擴(kuò)展名為java的文件。
4,在dos控制臺(tái)中通過javac工具對java文件進(jìn)行編譯。
5,在通過java命令對生成的class文件進(jìn)行執(zhí)行。
*/
class Demo//定義一個(gè)類。
{
//主函數(shù)。
public static void main(String[] args)
{
//輸出語句。
System.out.println(“hello haha”);
}
}
6.字符串?dāng)?shù)據(jù)和任何數(shù)據(jù)使用+都是相連接,最終都會(huì)變成字符串。
System.out.println(“5+5”+(5+5));//“5+5=55”
轉(zhuǎn)義字符:通過 來轉(zhuǎn)變后面字母或者符號的含義。
n:換行。
b:退格。相當(dāng)于backspace。
r:按下回車鍵。window系統(tǒng),回車符是由兩個(gè)字符來表示rn.t:制表符。相當(dāng)于tab鍵。
7.if else 結(jié)構(gòu) 簡寫格式: 變量 =(條件表達(dá)式)?表達(dá)式1:表達(dá)式2;
三元運(yùn)算符:
好處:可以簡化if else代碼。
弊端:因?yàn)槭且粋€(gè)運(yùn)算符,所以運(yùn)算完必須要有一個(gè)結(jié)果。
class OperateDemo
{
public static void main(String[] args)
{
int x= 7;
//邏輯運(yùn)算符用于連接boolean類型的表達(dá)式。
//x>3 & x<6 = true & true = true;
/*
true & true = true;
true & false = false;
false & true = false;
false & false = false;
& : 只要兩邊的boolean表達(dá)式結(jié)果,有一個(gè)為false。那么結(jié)果就是false。只有兩邊都為true,結(jié)果為true。
true | true = true;
true | false = true;
false | true = true;
false | false = false;
| : 兩邊只要有一個(gè)為true,結(jié)果為true。
只有兩邊都有false,結(jié)果為false。
^ : 異或;就是和|有點(diǎn)不一樣。當(dāng)true ^ true = false;
true ^ true = false;
true ^ false = true;
false ^ true = true;
false ^ false = false;
^ : 兩邊相同結(jié)果是false。
兩邊不同結(jié)果是true。
&和&&的特點(diǎn):
&:無論左邊是true是false。右邊都運(yùn)算。
&&:當(dāng)左邊為false時(shí),右邊不運(yùn)算。
|:兩邊都參與運(yùn)算。
||:當(dāng)左邊為true。右邊不運(yùn)算。
int n = 3,m = 8;
System.out.println(“n=”+n+“,m=”+m);
1,通過第三方變量。
/*int temp;temp = n;n = m;m = temp;
2不用第三方變量。= 3 +8;3 = 113;n = n + m;//如果n和m的值非常大,容易超出int范圍。m = nm;n = n ^ m;m = n ^ m;//(n^m)^m;n = n ^ m;//n ^(n ^ m)System.out.println(“n=”+n+“,m=”+m);
if和switch語句很像。
具體什么場景下,應(yīng)用哪個(gè)語句呢?
如果判斷的具體數(shù)值不多,而是符合byte short int char這四種類型。雖然兩個(gè)語句都可以使用,建議使用swtich語句。因?yàn)樾噬愿摺?/p>
其他情況:對區(qū)間判斷,對結(jié)果為boolean類型判斷,使用if,if的使用
范圍更廣。