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頁面的流程