是否還在為了實(shí)現(xiàn)AJAX的前進(jìn)后退而煩惱呢?除了使用dhtmlhistory這個(gè)解決方案,你現(xiàn)在還可以通過(guò)GWT來(lái)很容易地實(shí)現(xiàn)這些功能。再也不用擔(dān)心瀏覽器的前進(jìn)和后退按鈕成為擺設(shè)了。
AJAX提高了用戶(hù)的體驗(yàn),但是相應(yīng)的,開(kāi)發(fā)的復(fù)雜程度也提高了,debug也變得異常的困難。通過(guò)GWT,程序員們可以很容易地進(jìn)行debug工序。而且,這一切都是在java的環(huán)境中進(jìn)行。
瀏覽器兼容性問(wèn)題總是能困擾著web開(kāi)發(fā)人員。GWT構(gòu)建出來(lái)的Web程序,將會(huì)兼容Firefox,IE,Mozilla, Safari, 和Opera等主流瀏覽器。而兼容性的工作,不再需要程序員們來(lái)進(jìn)行。
在GWT中,遠(yuǎn)程通訊將會(huì)變得異常簡(jiǎn)單,程序員們需要做的,僅僅是建立一個(gè)可序列化的對(duì)象。序列化和解序列化,將會(huì)由GWT來(lái)進(jìn)行。
下面是GWT自帶的幾個(gè)Demo: (點(diǎn)擊相應(yīng)頁(yè)面進(jìn)入)
本質(zhì)上,瀏覽器向服務(wù)器請(qǐng)求靜態(tài)圖片如jpeg時(shí),服務(wù)器返回的仍然是標(biāo)準(zhǔn)的http響應(yīng),只不過(guò)http頭的contentType不是text/html,而是image/jpeg而已,因此,我們?cè)赟ervlet中只要設(shè)置好contentType,然后發(fā)送圖像的數(shù)據(jù)流,瀏覽器就能正確解析并顯示出圖片。
在Java中,java.awt和java.awt.image包提供了基本的繪制圖像的能力,我們可以在內(nèi)存中繪制好需要的圖形,然后編碼成jpeg或其他圖像格式,最后發(fā)送相應(yīng)給瀏覽器即可。下面是使用Servlet動(dòng)態(tài)創(chuàng)建圖像的詳細(xì)步驟:
1.創(chuàng)建BufferedImage對(duì)象,該對(duì)象存在內(nèi)存中,負(fù)責(zé)保存繪制的圖像;
2.創(chuàng)建Graphics2D對(duì)象,該對(duì)象負(fù)責(zé)繪制所需的圖像;
3.當(dāng)繪制完成后,調(diào)用com.sun.image.codec.jpeg包的JPEG編碼器對(duì)其編碼;
4.最后將編碼后的數(shù)據(jù)輸出至HttpResponse即可。
注意com.sun.image.codec.jpeg包位于JDK目錄的rt.jar包中,它不是公開(kāi)的API,需要將rt.jar復(fù)制到web應(yīng)用程序的WEB-INF/lib下。
我們先創(chuàng)建一個(gè)最簡(jiǎn)單的Servlet:
我們首先設(shè)置了response的contentType為image/jpeg,這樣瀏覽器就可以正確識(shí)別。
然后,創(chuàng)建一個(gè)大小為100x100的BufferedImage對(duì)象,準(zhǔn)備繪圖:
編碼后的JPEG圖像直接輸出到了out對(duì)象中,我們只要傳入response. getOutputStream()就可以直接輸出到HttpResponse中。
下面是完整的代碼:
最后將這個(gè)Servlet編譯,注冊(cè)到web.xml中,映射路徑為/CreateImage,寫(xiě)一個(gè)簡(jiǎn)單的index.html測(cè)試:
如能正確顯示,大功告成!
該考試測(cè)試 Java 的基礎(chǔ)知識(shí)并需要對(duì)該語(yǔ)言的語(yǔ)法和語(yǔ)義有深入理解。
1.參加培訓(xùn)或自學(xué)Java經(jīng)典課程。如果有C語(yǔ)言和面向?qū)ο蟮幕A(chǔ),只需自學(xué)SL275課程以及JDK1.4API,否則應(yīng)該參加相應(yīng)的培訓(xùn)班進(jìn)行學(xué)習(xí)。我對(duì)C語(yǔ)言和面向?qū)ο蠖加幸恍┗A(chǔ),同時(shí)又參加了SL275+Weblogic+JSP課程的學(xué)習(xí)。
2.確定考試版本,明確考查的知識(shí)點(diǎn)及知識(shí)點(diǎn)的考查難度。目前SCJP考試有兩個(gè)版本1.2和1.4,兩個(gè)版本的比較如下表:
其中選擇題有兩種形式:(1)給出一段代碼讓選擇其運(yùn)行結(jié)果;(2)給出關(guān)于某基本概念的一些描述語(yǔ)句讓選擇正確的答案。填空題一般是給出一段正確的代碼,不提供選擇項(xiàng),而讓你填寫(xiě)上運(yùn)行結(jié)果。
兩個(gè)版本考查的知識(shí)點(diǎn)最大的差別在于310-025包含I/O、AWT,且對(duì)各個(gè)知識(shí)點(diǎn)的考查難度相對(duì)較容易,而310-035中去掉了I/O和AWT部分的內(nèi)容,但增加了對(duì)Assertion的考查,同時(shí)對(duì)Wrapper classes、Collections、hashcode( )和equals( )考查的難度有所加大。所以要根據(jù)自己的情況選擇合適的版本。我在復(fù)習(xí)時(shí)覺(jué)得I/O這一部分的內(nèi)容較多且不好記憶,就選擇了310-035,這個(gè)版本較難,也是對(duì)自己的一個(gè)挑戰(zhàn)。
3.根據(jù)考查的知識(shí)點(diǎn)做練習(xí)題。由于認(rèn)證考試是以試題的形式來(lái)考查對(duì)知識(shí)點(diǎn)的掌握情況,所以多做題是通過(guò)考試的最有效方法之一,通過(guò)對(duì)SL275課程系統(tǒng)的學(xué)習(xí),掌握了有關(guān)知識(shí)點(diǎn)的基礎(chǔ)知識(shí)以后,必須通過(guò)做題來(lái)測(cè)試自己對(duì)知識(shí)點(diǎn)的掌握情況,書(shū)中寫(xiě)的有關(guān)知識(shí)點(diǎn)的內(nèi)容比較概括,有時(shí)自己覺(jué)得已經(jīng)掌握了這部分內(nèi)容,但做題時(shí)可能會(huì)出現(xiàn)各式各樣的錯(cuò)誤,比如在聲明main( )方法時(shí)應(yīng)為public static void main( String args[ ] ){……},如果在聲明時(shí)漏寫(xiě)了static,則在編譯時(shí)可以通過(guò),而運(yùn)行時(shí)會(huì)提示出錯(cuò)信息;如果main( )中的參數(shù)寫(xiě)string args[ ],則在編譯時(shí)會(huì)提示出錯(cuò),在考試時(shí)有類(lèi)似的題目,故意設(shè)一些陷阱,一不小心看似簡(jiǎn)單的問(wèn)題卻有可能失分。對(duì)于給出一段程序代碼要求選擇其運(yùn)行結(jié)果的題目,最好親手調(diào)試并分析其結(jié)果。
對(duì)考查Wrapper classes、Collections、hashcode( )和equals( )方法的題目要認(rèn)真查看API文檔(Sun官方網(wǎng)站提供了下載的鏈接,也可以在Sun網(wǎng)站上在線查看)并做好筆記供以后查閱。通過(guò)做題鞏固知識(shí)點(diǎn)、適應(yīng)考試題型、找出容易出錯(cuò)的地方,同時(shí)對(duì)所學(xué)知識(shí)點(diǎn)也起到了查漏補(bǔ)缺的作用。
4.下載相應(yīng)的模擬環(huán)境進(jìn)行實(shí)戰(zhàn)訓(xùn)練,或者在線測(cè)試。知識(shí)點(diǎn)和題型都掌握以后,還不要急于考試,應(yīng)該從網(wǎng)上下載一個(gè)模擬考試環(huán)境的軟件進(jìn)行實(shí)戰(zhàn)演練。我下載了Jcertify5.0,它需在JDK1.3環(huán)境下安裝運(yùn)行,該軟件可以設(shè)置考查的范圍進(jìn)行practice或者test,是一個(gè)很不錯(cuò)的模擬軟件,里面的題目與實(shí)際考試題目難易程度相當(dāng)。
通過(guò)該軟件可以檢驗(yàn)?zāi)阍谝?guī)定的時(shí)間內(nèi)(120分鐘)完成題目的情況及各個(gè)知識(shí)點(diǎn)掌握的程度,這樣就可以根據(jù)測(cè)驗(yàn)結(jié)果有針對(duì)性的復(fù)習(xí)掌握的不太好的知識(shí)點(diǎn),反復(fù)測(cè)驗(yàn)、練習(xí),直到自己滿(mǎn)意為止。
5.考前給自己足夠的信心。通過(guò)做練習(xí)和模擬軟件測(cè)驗(yàn),對(duì)各個(gè)知識(shí)點(diǎn)都比較有把握以后,其實(shí)這時(shí)參加考試已經(jīng)沒(méi)有問(wèn)題了,要相信自己的實(shí)力,給自己加油,此時(shí)切不可再做較難的題目,我當(dāng)時(shí)就犯了這樣的大忌,聽(tīng)說(shuō)310-035的考試比較難,目前通過(guò)的人數(shù)不多,我怕考試時(shí)的題目比我做的練習(xí)題難,在考試的前一天,又做了一套題目,共43題,通過(guò)率為僅為42%,這個(gè)結(jié)果令我很失望,也喪失了自信心,晚上做夢(mèng)一直考試且考試結(jié)果很糟糕,第二天醒來(lái)頭昏腦脹,本來(lái)預(yù)約好的考試不得不往后推遲,這是沉痛的教訓(xùn)。
6.預(yù)約、考試。知名的IT認(rèn)證廠商在一些大城市都有指定的考試中心,Sun認(rèn)證也不例外,考試前三天到Sun指定的考試中心報(bào)名,由他們幫你注冊(cè),除了考試做題,其他的事情你盡管交給考試中心去做就行了。
7.考試注意事項(xiàng)。按預(yù)約的時(shí)間提前到達(dá)考試中心,熟悉考試環(huán)境,穩(wěn)定情緒,考試中心在考場(chǎng)里設(shè)置有監(jiān)視器,你的一舉一動(dòng)都會(huì)被錄制下來(lái),所以考試來(lái)不得半點(diǎn)虛假,盡早打消“打小抄”的念頭。考務(wù)人員幫你進(jìn)入考試系統(tǒng)后,開(kāi)始進(jìn)行考試,考試分三個(gè)階段:
(1)正式考試前的問(wèn)卷調(diào)查,給定時(shí)間為15分,有10來(lái)個(gè)問(wèn)題,給出四個(gè)選項(xiàng)供你選擇,主要調(diào)查你對(duì)SCJP要考查的知識(shí)點(diǎn)的掌握情況,如對(duì)數(shù)組、類(lèi)的定義是精通、是了解但需要?jiǎng)e人幫助還是不懂等,這部分內(nèi)容的回答不影響你的考試成績(jī),如果你讀懂問(wèn)題的意思了,你可以根據(jù)自己的實(shí)際情況進(jìn)行選擇,否則你盡管隨意選一個(gè),一路Next下去,直到所有的問(wèn)題做完;
(2)正式考試,共120分鐘,選擇題在題面中注明了正確答案的數(shù)目(如:choose two),按Next做下一題,單擊exhibit按鈕查看題目提供的代碼;
(3)題目做完后的問(wèn)卷調(diào)查,同樣也不影響你的考試結(jié)果。問(wèn)卷結(jié)束后緊張、激動(dòng)的時(shí)刻就要到了,此時(shí)你可以查看考試結(jié)果,考試系統(tǒng)列出你對(duì)各個(gè)知識(shí)點(diǎn)答題情況的一覽表,如果你的成績(jī)超過(guò)指定的分?jǐn)?shù)底線,則Result即為Pass。
拿到考試結(jié)果通知單的一刻是令人興奮的,考后的總體感覺(jué)是SCJP認(rèn)證并不像自己想象的那么難,只要你做好了充分的準(zhǔn)備,拿到SCJP認(rèn)證證書(shū)不成問(wèn)題。
2. codeZoo http://www.codezoo.com/
這是O'Reily旗下的,除了Java之外,還有Ruby、Python。
3. Java學(xué)習(xí)源代碼檢索系統(tǒng) http://www.chinaitlab.com/www/school/codesearch/index.html
難得看見(jiàn)國(guó)產(chǎn)的,好歹也要支持一下,分類(lèi)也算清楚。
4. Koders http://www.koders.com/
是個(gè)綜合查詢(xún)的網(wǎng)站,不過(guò)它好像是從代碼中查找關(guān)鍵詞,包含的語(yǔ)言挺多的。
5. Resources for Java server-side developers http://www.java201.com/
確切的說(shuō),它是一個(gè)資源收集的網(wǎng)站,代碼查詢(xún)并不多。不過(guò)它分類(lèi)相當(dāng)細(xì),如Articles、Books、Examples、Extensions、Frameworks等類(lèi),你可以輸入Spring或Hibernate作為關(guān)鍵詞搜索一下看看。
存貨不多,以后有了再補(bǔ)充。
******
設(shè)計(jì)師
******
在基于組件的應(yīng)用系統(tǒng)開(kāi)發(fā)中,一個(gè)或幾個(gè)人必須對(duì)這個(gè)系統(tǒng)的整體需求有全面的了解,比如系統(tǒng)的控制流程,和其他的接口等等。有些公司稱(chēng)這個(gè)角色為總工程師,不管怎么叫,這個(gè)角色非常重要,他承擔(dān)協(xié)調(diào)不同開(kāi)發(fā)小組之間的工作,幫助他們考慮系統(tǒng)這個(gè)“大圖”。
********************
表現(xiàn)邏輯層的團(tuán)隊(duì)角色
********************
在表現(xiàn)層,用戶(hù)界面是動(dòng)態(tài)生成的。需要如下開(kāi)發(fā)人員:
1、 Java servlet 開(kāi)發(fā)人員
2、 JSP 開(kāi)發(fā)人員
3、 HTML 設(shè)計(jì)人員
4、 美工人員
5、 客戶(hù)端的JavaScript 開(kāi)發(fā)人員
Servlet 開(kāi)發(fā)人員建立表現(xiàn)層的邏輯,而其他人員建立表現(xiàn)的形式。
Java Servlet 開(kāi)發(fā)人員
Servlet處理頁(yè)和頁(yè)之間的瀏覽,會(huì)話管理,簡(jiǎn)單的輸入驗(yàn)證。Servlet也將業(yè)務(wù)邏輯的元素連接起來(lái)。
Servlet開(kāi)發(fā)人員必須理解一些相關(guān)事宜,HTTP請(qǐng)求,安全,多語(yǔ)言,和一些頁(yè)面元素如session, cookie,超時(shí)等等。J2EE的應(yīng)用里面,servlet必須用Java來(lái)寫(xiě),Servlet可能會(huì)調(diào)用JSP, EJB, JDBC等等。因此,servlet開(kāi)發(fā)人員要與應(yīng)用系統(tǒng)的其他人員緊密合作。
JSP 開(kāi)發(fā)人員
JSP開(kāi)發(fā)人員與servlet開(kāi)發(fā)人員密切合作來(lái)定義系統(tǒng)的表現(xiàn)層頁(yè)面。即使在復(fù)雜的開(kāi)發(fā)項(xiàng)目里,JSP和servlet的開(kāi)發(fā)人員也可能是一個(gè)人。
然而,如果一個(gè)系統(tǒng)中大部分Java在servlet而不是在JSP里,JSP人員就不必對(duì)Java非常熟悉。
HTML 設(shè)計(jì)人員
HTML 設(shè)計(jì)人員對(duì)HTML頁(yè)面進(jìn)行優(yōu)化。例如,他可能要完成以下任務(wù):
1、保證在不同的瀏覽器中所有的頁(yè)面都能正常顯示
2、 保證低速的調(diào)制解調(diào)器訪問(wèn)也不受影響
3、 對(duì)JSP設(shè)計(jì)人員的頁(yè)面進(jìn)行進(jìn)一步的優(yōu)化
美工人員
美工人員創(chuàng)建圖片等等。這些圖片要能小體積,快速下載。美工與HTML頁(yè)面人員緊密合作。
客戶(hù)端的JavaScript 開(kāi)發(fā)人員
使用客戶(hù)端的JavaScript有很多原因。比如,可以處理簡(jiǎn)單的輸入驗(yàn)證,不必提交給服務(wù)器,還可以讓用戶(hù)界面更生動(dòng)。這個(gè)角色和servlet, JSP人員緊密合作。
********************
業(yè)務(wù)邏輯層的團(tuán)隊(duì)角色
********************
業(yè)務(wù)邏輯層包含業(yè)務(wù)規(guī)則和業(yè)務(wù)實(shí)體。需要以下人員:
1、Session bean 開(kāi)發(fā)人員
2、 Entity bean 開(kāi)發(fā)人員
Session Bean 開(kāi)發(fā)人員
Session beans包含業(yè)務(wù)處理和業(yè)務(wù)規(guī)則的邏輯。比如,一個(gè)session bean 可能設(shè)計(jì)成計(jì)算一個(gè)支票的稅率。如果一個(gè)系統(tǒng)面臨處理經(jīng)常變化的復(fù)雜邏輯,而又大量使用session bean,結(jié)果是,session bean就需要不斷的更新。
Session bean 的開(kāi)發(fā)人員一般是一個(gè)領(lǐng)域的專(zhuān)家,理解復(fù)雜的,專(zhuān)門(mén)領(lǐng)域的邏輯,還有數(shù)據(jù)驗(yàn)證的規(guī)則。這個(gè)人員與servlet和entity bean開(kāi)發(fā)人員緊密合作。
Session bean可能需要調(diào)用JDBC接口,和其他的EJB。無(wú)狀態(tài)的session bean系統(tǒng)運(yùn)行的會(huì)更好一些。因?yàn)椋绻?jì)算費(fèi)率是一個(gè)有狀態(tài)的session bean,系統(tǒng)就必須訪問(wèn)一個(gè)保存bean的狀態(tài)信息的服務(wù)器。如果那個(gè)服務(wù)器恰巧出現(xiàn)問(wèn)題,整個(gè)流程就會(huì)受阻。
Entity Bean 開(kāi)發(fā)人員
Entity bean代表永久的對(duì)象,如一個(gè)數(shù)據(jù)庫(kù)中的一條記錄。Entity bean開(kāi)發(fā)人員的任務(wù)是設(shè)計(jì)一個(gè)面向?qū)ο蟮乃袠I(yè)務(wù)數(shù)據(jù)的組織圖。建立面向?qū)ο蟮脑噲D意味著要將數(shù)據(jù)庫(kù)中的表(關(guān)系型的)映射成entity bean。例如,開(kāi)發(fā)人員需要將客戶(hù)表,發(fā)票表,和訂單表轉(zhuǎn)換成相應(yīng)的客戶(hù),發(fā)票,和訂單對(duì)象。
一個(gè)entity bean 開(kāi)發(fā)人員與session bean, Servlet開(kāi)發(fā)人員密切合作,保證應(yīng)用系統(tǒng)提供快速的,靈活的,可擴(kuò)展的對(duì)業(yè)務(wù)數(shù)據(jù)的訪問(wèn)。
Entity bean 可能會(huì)大量的調(diào)用JDBC接口。而entity bean 之間的調(diào)用會(huì)很少。
**********************
數(shù)據(jù)庫(kù)訪問(wèn)層的團(tuán)隊(duì)角色
**********************
在數(shù)據(jù)庫(kù)訪問(wèn)層,開(kāi)發(fā)人員需要建立關(guān)系型數(shù)據(jù)庫(kù)的ER圖,數(shù)據(jù)字典等等相關(guān)文檔。所有對(duì)數(shù)據(jù)庫(kù)的修改,訪問(wèn)等等權(quán)限操作都要經(jīng)過(guò)數(shù)據(jù)庫(kù)訪問(wèn)層開(kāi)發(fā)人員。這個(gè)角色在大部分項(xiàng)目中擔(dān)當(dāng)DBA的角色。
團(tuán)隊(duì)組建之后,就可以開(kāi)始設(shè)計(jì)用戶(hù)界面。
************
設(shè)計(jì)用戶(hù)界面
************
建議從前到后開(kāi)始設(shè)計(jì)應(yīng)用系統(tǒng)。就是說(shuō),先設(shè)計(jì)用戶(hù)界面,再設(shè)計(jì)EJB,這樣效率最高。
安博公司已經(jīng)做了大量的界面設(shè)計(jì)工作,以后的工作完全可以參照已有的設(shè)計(jì)。下面提一些常用的建議性問(wèn)題:
1、頁(yè)面流程是什么?
2、 每個(gè)頁(yè)面上的命令按鈕是什么?
3、是否適用frame?
4、是否有公司標(biāo)準(zhǔn)的Logo,廣告條幅?
5、 在什么地方需要登錄過(guò)程?
6、 多語(yǔ)言的問(wèn)題?
這些和設(shè)計(jì)servlet, JSP相關(guān)。