Servlet和JSP技術是用Java開發服務器端應用的主要技術,是開發商務應用表示端的標准。Java開發者喜歡使用它有多種原因,其一是對於已經熟悉Java語言的開發者來說這個技術容易學習;其二是Java把“一次編寫,到處運行”的理念帶入到Web應用中,實現了“一次編寫,到處實現”。而且更為重要的是,如果遵循一些良好的設計原則的話,就可以把表示和內容相分離,創造出高質量的、可以復用的、易於維護和修改的應用程序。比方說,在HTML文檔中如果嵌入過多的Java代碼(scriptlet),就會導致開發出來的應用非常復雜、難以閱讀、不容易復用,而且對以後的維護和修改也會造成困難。事實上,在CSDN的JSP/Servlet論壇中,經常可以看到一些提問,代碼很長,可以邏輯卻不是很清晰,大量的HTML和Java代碼混雜在一起,讓人看得一頭霧水。這就是隨意開發的弊端。
如果你已經基本了解JSP和Servlet的各項技術(最好也開發過一些Web應用),那麼我們可以一起探討一下如何開發“好”的應用的一些指導原則。我們首先對Servlet和JSP技術做一個浏覽。
Servlet和JSP概覽
早期的動態網頁主要采用CGI(Common Gateway Interface,公共網關接口)技術,你可以使用不同的語言編寫CGI程序,如VB、C/C++或Delphi等。雖然CGI技術發展成熟且功能強大,但由於編程困難、效率低下、修改復雜等缺點,所以有逐漸被取代的趨勢。在所有的新技術中,JSP/Servlet具備更高效、更容易編程、功能更強、更安全和具有良好的可移植性,因而被許多人認為是未來最有發展前途的動態網站技術。
與CGI相似,Servlet支持請求/響應模型。當一個客戶向服務器遞交一個請求時,服務器把請求送給Servlet,Servlet負責處理請求並生成響應,然後送給服務器,再由服務器發送給客戶。與CGI不同的是,Servlet沒有生成新的進程,而是與HTTP Server處於同一進程中。它通過使用線程技術,減小了服務器的開銷。Servlet處理請求的過程是這樣的:當收到來自客戶端的請求後,調用service方法,該方法中Servlet先判斷到來的請求是什麼類型的(GET/POST/HEAD…),然後調用相應的處理方法(doGet/doPost/doHead…)並生成響應。
別看這麼復雜,其實簡單說來Servlet就是一個Java類。與一般類的不同之處是,這個類運行在一個Servlet容器內,可以提供session管理和對象生命周期管理。因而當你使用Servlet的時候,你可以得到Java平台的所有好處,包括安全性管理、使用JDBC訪問數據庫以及跨平台的能力。而且,Servlet使用線程,因而可以開發出效率更高的Web應用。
JavaServer Pages (JSP)
JSP技術是J2EE的一個關鍵技術,它在更高一級的層次上抽象Servlet。它可以讓常規靜態HTML與動態產生的內容相結合,看起來像一個HTML網頁,卻作為Servlet來運行。現在有許多商業應用服務器支持JSP技術,比如BEA WebLogic、IBM WebSphere、 JRun等等。使用JSP比用Servlet更簡單。如果你有一個支持JSP的Web服務器,並且有一個JSP文件,你可以把它放倒任何靜態HTML文件可以放置的位置,不用編譯,不用打包,也不用進行ClassPath的設置,就可以像訪問普通網頁那樣訪問它,服務器會自動幫你做好其他的工作。
JSP工作原理
JSP 文件看起來就像一個普通靜態HTML文件,只不過裡面包含了一些Java代碼。它使用.jsp的後綴,用來告訴服務器這個文件需要特殊的處理。當我們訪問一個JSP頁面的時候,這個文件首先會被JSP引擎翻譯為一個Java源文件,其實就是一個Servlet,並進行編譯,然後像其他Servlet一樣,由Servlet引擎來處理。Servlet引擎裝載這個類,處理來自客戶的請求,並把結果返回給客戶,如下圖所示:
圖1: 調用JSP頁面的流程