1.1 Java是什么
Java是什么?回答這個問題就像是答復太太“這件衣服好看嗎?”一樣復雜。
對于這個問題,每一位使用過Java的朋友都有自己的理解和答案;而對于沒有用過Java的朋友,你解釋得越多,他越糊涂(幸好現在從事軟件開發而不知道Java為何物的人已經是鳳毛麟角,很少見了)。而我自己認為:Java可以是一個支撐平臺(體系結構)、一種編程語言、一個編譯運行環境,也可以是它們的組合體。
Java誕生之初,是作為嵌入式芯片的編程環境存在的,時至今日,Java已經擁有多個分支(變種)已經在其各自的領域內得到了廣泛的發展。Application、Applet、Servlet、JSP、JavaBean每一個名字我們都耳熟能詳,下面我們逐個了解一下這些成員。
1.1.1 Java大家庭
Application
通常我們所說的Java程序指的就是Java Application。和普通的Windows應用程序一樣,Java Application通過虛擬機可以直接在Windows操作系統中運行。事實上它比Windows應用程序更加適應于Windows:結合相應的虛擬機(JVM)它可以在不同版本的Windows環境中運行,不論Windows98、Windows 2000或是Windows XP,甚至是Linux或UNIX。
良好的跨平臺特性,使得Java Application成為那些需要跨平臺使用的軟件系統的不二選擇(使用過Oracle數據庫系統的朋友一定對它的安裝程序和管理界面記憶猶新,它們正是用Java Application實現的)。
順便說一句,使用傳統的VB或是VC編寫的Windows應用程序,都無法在Windows98和Windows2000平臺運行,這種狀況直到2003年微軟(Microsoft)公司的.NET Framework及VS.NET推出才宣告結束。
但令人遺憾的是,盡管VS.NET采用了和Java同樣原理的.NET Framework作為新一代應用程序的虛擬運行環境,有效地解決了程序的跨平臺運行和移植的問題,但VS.NET并不能向下兼容,使大量以前用VB或VC編寫的程序不具有跨平臺能力。同時微軟公司的VS.NET所編寫的程序只能在不同的Windows版本之間跨平臺移植,目前還無法將其移植到非Windows操作系統(如UNIX、Linux等)中。
Applet
Applet可以直接翻譯為小應用程序。Java Applet就是用Java語言編寫的這樣一些小應用程序,它們可以直接嵌入到網頁或者其他特定的容器中運行,并能夠產生特殊的效果(比如嵌入網頁中的Applet將受瀏覽器安全設置的影響,嚴格控制對訪問本地資源的訪問)。
Applet必須運行于某個特定的“容器”,這個容器通常是由瀏覽器擔任的,也可以是通過各種插件,或者包括支持Applet的移動設備在內的其他各種程序來運行。
盡管Java Application具有很強的跨平臺性,但由于其字節碼的編譯方式,使得其運行效率較低,而且其編制出的程序界面風格也與標準的Windows風格相差甚遠,因此不少人最初認識Java都是從Java Applet開始的。
Java Applet可以嵌套在瀏覽器中實現圖形繪制、字體和顏色控制、動畫和聲音的插入、人機交互、網絡通訊等功能,與用戶進行互動、顯示動態的畫面,還可以方便地、動態地和HTML頁面進行數據交換,有效地彌補了Web應用交互能力弱和精密計算能力較差的缺點。
在瀏覽器中運行時,Applet還會遵循IE嚴格的安全限制,阻止潛在的不安全請求和操作(例如限制Applet對客戶端文件系統的訪問)。
Servlet
和Applet相對應,Servlet指的是在B/S(Browser/Server)結構中用Java編寫的服務器端程序。
Servlet是位于Web服務器內部的服務器端的Java應用程序,與傳統的從命令行啟動的Java Application不同,Servlet由Web服務器進行加載和管理。支持Servlet的Web服務器必須包含支持Servlet的Java虛擬機。
Servlet與Web服務器的關系類似于Applet與Web瀏覽器的關系,我們可以將Servlet想象成沒有用戶界面(faceless)的Applet。
目前,由于Java的流行,大多數Web服務器都支持Servlet,即使不直接支持Servlet的Web服務器,也可以通過附加的插件和模塊來支持Servlet,這得益于Java的跨平臺特性。另外,由于Servlet內部以線程方式提供服務,不必對于每個請求都啟動一個進程,并且利用多線程機制可以同時為多個請求服務,所以Servlet的運行效率很高。
JSP
JSP(Java Server Pages)是由Sun MicroSystem公司在Java語言基礎上開發出來的一種動態網頁制作技術,其可使您在HTML頁面中插入Java程序實現動態頁面,并且支持和HTML的混合編寫,不需要編譯直接執行。用戶可以使用普通的文本編輯工具來書寫HTML語句,然后將動態部分用特殊的標記嵌入Java程序即可。
Sun MicroSystem公司首先推出Servlet,其功能強大,體系設計也很先進,但是其輸出HTML語句的方式仍然沿用了傳統CGI程序的作法:用命令逐行輸出。從而使得在Servlet動態生成HTML時比較麻煩,因此微軟的ASP一度成為動態網頁編程的首選語言。
這促使Sun MicroSystem很快推出了類ASP的Java嵌套型語言:JSP。
JSP作為一種全新的網頁編程技術,不僅提供了一種方便有效的動態網頁制作方法,而且作為Java家族的一分子,它還具有一般Java應用良好的可移植性,這使得JSP頁面可以在任何支持Java的應用服務器中運行。
JSP語言通過在HTML語法中嵌入JSP的Tag標簽,從而大大簡化和方便了網頁的設計和修改,這使得源于Java的JSP語言很快地被廣泛應用。然而對于多數大型Web應用程序的開發仍然需要Servlet和JSP搭配使用。
JavaBean
ASP通過COM來擴充復雜的功能,如文件上載、發送E-mail以及將業務處理或者復雜計算分離出來成為獨立可重復利用的模塊。JSP則通過JavaBean完成同樣的功能擴充。
本書中的大部分組件都是通過JavaBean的方式來提供的。讀者通過簡單調用就可以完成各種強大、復雜的功能。
在開發的復雜程度上,COM的開發遠比JavaBean復雜和煩瑣,學會ASP不難,但學會開發COM卻不容易。相比較而言,使用JavaBean對系統功能進行擴充則較容易實現。而且在后期維護的時候,COM組件必須在服務器上注冊后方可使用,如果對COM組件進行了更新,就必須在注冊表中對組件進行重新注冊。更新COM組件的注冊過程,對很多程序員來說都是一段不愉快的經歷。
所幸的是JavaBean并不需要注冊,只要將其放置在CLASSPATH所包含的目錄中就行了。對JavaBean進行修改和更新,對絕大多數應用服務器(如JSWDK和Tomcat)來說,只要重新啟動服務,就可以載入最新版的組件。
JavaBean是完全的面向對象程序(OOP),可以針對不同的業務處理功能方便地建立一整套可重復利用的對象庫,例如用戶權限控制、E-mail自動回復等。
JavaScript
首先需要明確的是:JavaScript不是Java大家庭的成員。
我們在這里對JavaScript進行介紹的主要原因是:
1.JavaScript在B/S結構的瀏覽器中被廣泛應用;
2.很多初學者將Java和JavaScript分辨不清。
Applet、Servlet、JSP和JaveBean都是Java在不同環境中的表現形式,盡管他們對標準Java的支持程度各有不同,但他們都是Java的一種分支,秉承著Java的全部特性,支持同樣的標準,共同由Java虛擬機JVM解釋執行。
而JavaScript除了在編程語法上和Java的書寫格式有很大的相似性,以及命名中包含了Java字樣外,和Java并無關系。
JavaScript是一種腳本語言,它無法編譯成字節碼,自然也不需要JVM的支持,是由瀏覽器對其解釋執行的。
1.1.2 Java相關技術
MVC與Struts
MVC是Model(模型)/View(視圖)/Controller(控制)的縮寫。在我們真正了解MVC之前,我們先來看看我們為什么需要使用MVC構架,以及MVC能給我們帶來哪些令人激動的新特性。
在MVC的概念深入人心和Struts廣為流傳之前,大部分Web應用程序都是用ASP、PHP、JSP這樣的過程化語言來創建的。它們將從數據庫中檢索出來的數據和HTML這樣的表示層代碼混在一起編寫后,由瀏覽器展示給最終客戶。
這樣編寫的程序代碼像面條一樣,將服務器端的程序代碼和表示層的標簽混在一個文件中編寫,為程序的調試和修改帶來很大的麻煩。甚至美工對頁面布局的輕微調整都會導致大量代碼的重新編寫和調試。經驗豐富的開發者能夠區分出文件中哪些是數據,哪些是表示層的標簽,但這通常很不容易做到,它需要精心的計劃和不斷的嘗試。而MVC的出現則從根本上強制性地將它們分開。
盡管MVC的概念很早就有人提出,但是直到像Struts、JSF之類的MVC構架產品逐漸成熟后,MVC的模型才真正在軟件系統的開發過程中得到廣泛的應用。
如果你已經對JSP的“面條式”編程感到失望,或者你需要維護其他項目組用JSP編寫的應用系統,正面對著一大堆JSP程序而無從下手,又或者你作為一位資深的項目經理,需要帶領團隊開發一個大型應用系統,而你正對選擇什么樣的構架設計煞費苦心時,再或者你需要完成一個界面多樣化(可以隨心定義、甚至可以通過Wap為手機用戶提供服務)的應用系統,那么建議你采用MVC構架。
盡管構造MVC應用程序需要一些額外的工作,但是它所帶來的好處是毋庸置疑的。
需要說明的是:作為一個MVC的框架,Struts并不是唯一的Java語言對MVC Framework的實現。但Struts作為Jakarta計劃的一部分,無論從易用性、可靠性,還是擁有用戶的數量上都是目前行業中的佼佼者。因此我們將通過Struts來領略一下MVC的魅力所在。
Model(模型):Struts中的Model由三種類型的JavaBean構成
Action Form
Action Form通常被稱為FormBean,對應于來自頁面表單中的信息。在MVC的指導思想下,我們在實現用戶復雜的業務邏輯時,需要得到用戶在瀏覽器端表單中填寫的信息,但卻不能通過Request提供的方法直接得到用戶提交的數據(因為這不符合MVC的編程理念),所以我們需要在服務器端構造一個和瀏覽器中表單內容完全一致的類,用它來保存用戶表單中的信息,供服務器端的程序調用,這個類就是Action Form類。
Action
Action通常被稱為ActionBean,用于響應用戶在瀏覽器端的動作、事件(Event),并獲取從ActionServlet傳來的FormBean,取出FormBean中的相關信息,并做出相應的處理。通常事件的響應程序通過對實現業務邏輯的Java Bean或EJB等組件的調用來完成。
JavaBean或EJB
這些類用于實現系統所包含的業務邏輯,是整個系統的核心所在。通常這些類被Action類在響應用戶的請求時調用。
所有對Action進行處理的對象(以下簡稱為處理器對象)都是開發者從Struts的Action類派生的子類。Action處理器對象封裝了具體的處理過程和邏輯,它可以調用業務邏輯(Model)模塊,并且把響應提交到合適的View組件以產生響應。
ActionForm組件對象是Struts提供的另一個非常有用的核心組件對象,它可以通過定義屬性描述客戶端表單數據。開發者可以從它派生子類對象,利用它和Struts提供的自定義標簽庫可以實現對客戶端表單數據的良好封裝和支持,Action處理器對象可以直接對它進行讀寫,而不再需要和request、response對象進行數據交互。
通過ActionForm組件對象實現了對View和Model之間交互的支持。Struts通常建議使用一組JavaBean表示系統的內部狀態,根據系統的復雜度也可以使用Entity EJB和Session EJB等組件來實現系統狀態。Struts建議在實現時把事件的響應程序(Action)和業務邏輯的實現代碼分離,這樣可以保證業務邏輯的可重用性。
事實上,對于初學者來說,可以直接將實現業務邏輯(訪問數據庫系統)的代碼在Action中實現,因為這并不違背MVC構架對結構的要求,只是喪失了業務邏輯的可重用性。
View(視圖):Struts通過在JSP頁面中嵌套Tag標簽實現
Struts提供豐富的JSP標簽庫:Html、Bean、Logic、Template等(我們還可以自定義標簽)。通過這些自定義標簽可以非常好地和系統的Model部分交互,通過使用這些自定義標簽創建的JSP表單,可以實現和Model部分中的ActionForm的映射,完成對用戶數據的封裝,同時這些自定義標簽還提供了像模板定制等多種顯示功能。
簡而言之,ActionForm把用戶在表單中填寫的信息封裝成類,供服務器端的程序使用;而TagLib中提供的各種標簽則用于服務器端程序輸出處理結果。
Controller(控制器):其作用是從客戶端接受請求,并且選擇執行相應的業務邏輯,然后把響應結果送回到客戶端
Controller的作用有點像瀏覽器端的Web頁面和服務器端Java程序之間的傳話筒。它負責瀏覽器端和服務器端的信息傳遞,將Web頁面的各種事件和請求傳遞到服務器端相應的Action中進行處理;并且把Action處理的結果送至瀏覽器端的View視圖中顯示。
使用MVC構架搭建的工程,同樣的業務邏輯,我們將可以用不同的表現形式進行展示,如同彩殼手機可以任意更換外殼一樣;應用系統界面的風格不斷調整時,不需要對業務邏輯進行任何的調整。
MVC具有的結構化、模塊化、組件化的優點,使得大型業務系統的開發和管理更易于實現,但是開發基于MVC的系統,比開發基于JSP的程序從結構上來看復雜了許多,原來通過一個簡單的JSP頁面就能實現的功能,在基于Struts應用中變成了多個步驟的設計和實現過程。它需要我們花費更多的時間和精力來學習才能掌握。
很多的JSP程序員朋友剛開始學習Struts可能會比較難以適應。因為他們習慣了用Request和Response在頁面和服務器端傳遞數據,而且以“Hello world”程序作為例子,說明JSP是多么簡單易用,并且十分強調JSP的靈活性。
誠然,對于一些簡單的應用來說JSP足以勝任,使用Struts則會增加系統的開發周期和成本。而且Struts并不能完全替代JSP,任何一個Struts應用都需要JSP的程序支持,二者是密不可分的。
在北京杰軟科技有限公司內部,有很多資深的Java程序員,他們對JSP非常熟悉,但對Struts則抱著懷疑的態度,也有很大的抵觸情緒,其中很多人甚至認為完成同樣一個開發任務,采用Struts會使開發周期遠遠大于采用JSP開發的時間。
但后來由于公司的技術策略全面調整和部分項目的客戶需求,大家被迫強制學習和使用Struts。在逐漸熟悉了Struts的工作原理和開發過程后,大家體會到了Struts的魅力。現在大家相當一致地認為,大多數的情況下使用Struts開發更加簡單,更能夠有效提高開發效率,增強代碼的可維護性。用慣了Struts的程序員開始對維護以前的JSP程序感到無從下手。
對于這個觀念轉變的過程,我們得出了一個結論:如果要對一種新的技術作出客觀的評價,首先必須全面地了解,等能夠熟練地應用后才有發言權,才能發現它的優點和劣勢。僅憑借自己的經驗和感覺對一些新技術的評價顯然是有失公允的。
Web Server與Tomcat
自從JSP發布之后,很多公司都計劃推出自己的JSP引擎。Apache Group在完成GNUJSP 1.0的開發以后,開始考慮在Sun MicroSystem的JSWDK基礎上開發一個可以直接提供Web服務的JSP服務器,當然同時也支持Servlet,這樣Tomcat就誕生了。
Tomcat是一個小型的輕量級應用服務器,在中小型系統和并發訪問用戶不是很多的場合下被普遍使用,是開發和調試JSP程序的首選。
目前,Tomcat已經是jakarta項目中的一個重要子項目,是一個開放式源碼(這意味著Tomcat是完全免費的軟件,任何人都可以從互聯網上自由地下載),是全面支持JSP和Servlet技術的容器,也是一個Web服務器軟件。其被JavaWorld雜志的編輯選為2001年度最具創新的Java產品,同時它又是Sun MicroSystem公司官方推薦的Servlet和JSP容器,Servlet和JSP的最新規范都可以在Tomcat的新版本中得到實現(Tomcat 5.0以后的版本中都已經完全支持Struts),因此其越來越多地受到軟件公司和開發人員的喜愛。
Tomcat深受廣大程序員喜歡的另一個原因是它運行時占用的系統資源很小,而且擁有良好的擴展性,任何程序員都可以更新、更改或者用自己開發出的程序擴充Tomcat的功能。
盡管Tomcat設計的初衷是作為Apache服務器的擴展而出現,它們是分別獨立運行的,所以當你運行Tomcat時,它實際上作為一個與Apache獨立的進程單獨運行。Apache為HTML頁面提供服務,而Tomcat則處理對JSP頁面和Servlet程序的請求。
事實上,Tomcat也具備了Web服務器的基本功能——處理對HTML頁面的訪問請求,因此在大多數情況下,它也可以不依賴于Apache獨立運行,同時充當Web服務器和Java容器(應用服務器)兩個角色。