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