2006 年 7 月 28 日 過去十年的大部分時間里,Java? 社區(qū)一直在使用 JavaServer Pages (JSP) 技術(shù),但現(xiàn)在已開始顯現(xiàn)出衰退的跡象。目前,長期以來的慣例阻止了 Java 程序員在 Web 頁面中使用 Java 代碼,并且即便擴(kuò)展簡單的組件也很繁瑣。超越 JSP 編程的 Java Web 開發(fā)框架已經(jīng)出現(xiàn),但卻缺少動態(tài)語言功能。本文將向您展示 Ruby 的 Web 頁面開發(fā)策略并會提及有關(guān) Seaside 的基本方法。 在 Java Web 開發(fā)的早些時候,Sun 和 Microsoft 曾經(jīng)爭奪過有關(guān)構(gòu)建動態(tài) Web 頁面的實際標(biāo)準(zhǔn)的控制權(quán)。Sun 公司引入了 Servlet API。通過 servlet,您可以用 Java 語言的所有功能快速生成一個 Web 頁面。具備編譯 servlet 能力的免費 servlet 容器實現(xiàn) (Apache Tomcat) 的存在使得 servlet 變得非常流行。與之相對的,Microsoft 公司引入了稱作 Active Server Pages (ASP) 的 API。該技術(shù)很容易:您可以快速掌握并創(chuàng)建更多的高級 Web 頁面,其中包括一些具有數(shù)據(jù)庫支持或其他動態(tài)內(nèi)容的頁面。
首先來說說 JSP 技術(shù)。JSP 被設(shè)計來直接與 ASP 競爭(顧名思義)。使用 JSP 技術(shù),您可以使用標(biāo)記構(gòu)建一個 Web 頁面并將 Java 代碼直接放入頁面中。JSP 容器將 JSP 文件編譯成 servlet 形式。然后 servlet 引擎像執(zhí)行其他 servlet 一樣執(zhí)行該頁面。JSP 和 ASP 一樣,都實現(xiàn)了一個基于模板的方式。模板可以像您想要在用戶瀏覽器中所呈現(xiàn)的那樣,幫助您構(gòu)建一個簡單的 Web 頁面。當(dāng)模板引擎處理簡單的占位符元素時,您可以用值、組件或作為頁面一部分的結(jié)構(gòu)來替換這些元素。盡管 Java 平臺擁有眾多具有通用目的的模板引擎,但 JSP 已經(jīng)占領(lǐng)了絕對的市場份額,部分原因在于大量 ASP 開發(fā)人員轉(zhuǎn)換來使用 JSP。 比起 Java 語言或 ASP,一些其他的語言在處理 Web 開發(fā)方面表現(xiàn)要強(qiáng)得多。了解一下動態(tài)語言中相互競爭的方法,會讓您更加清楚在 Java 平臺上能夠使用哪些方法。在本文中,我討論了 Ruby 中代碼生成是如何工作的,并且深入講解了 Seaside 中一種更加根本的基于組件的方法。 Ruby 模板依賴此語言的簡單功能來為 Web 開發(fā)提供一種簡單卻行之有效的方法。通過掌握一些層次化的概念即可快速理解 Ruby 模板,這些概念每一層要比其上一層更加強(qiáng)大。 Ruby 模板最基礎(chǔ)的部分是 清單 1. 創(chuàng)建一個 Ruby 字符串
Ruby 不處理任何用單引號括起來的字符串信息。如果用雙引號括起來,Ruby 會在運行代碼的時候進(jìn)行替換。清單 2 是一個使用換行符的示例。使用單引號時,Ruby 保持換行符不變。使用雙引號時,則會解釋換行符: 清單 2. 單引號與雙引號的比較
在第二個
清單 3. 簡單變量替換
您已經(jīng)做好了創(chuàng)建一個基本的模板所需的絕大部分準(zhǔn)備。只差一步即可完成簡單的模板處理。您可以通過在具有單引號的字符串中使用 清單 4.推遲賦值
注意, 在 HTML 頁面中嵌入 Ruby 代碼的典型方法(包括在 Rails 中使用的方法)是一個被稱作 eRuby 的過濾器。現(xiàn)有的幾個實現(xiàn)中包括了一個被稱作 ERb 的基于 Ruby 的實現(xiàn),和一個被稱作 eruby(參見 參考資料)的速度更快且基于 C 語言的實現(xiàn)。它們每一個都能作為 Web 服務(wù)器的插件運行,但在便利地處理本地文件時,您通常會使用 ERb,而當(dāng)需要更快的速度時,例如對于生產(chǎn)用的 Web 服務(wù)器,您會使用 eruby。eRuby 過濾器處理文本文件時,除了下列三種情況以外都會完整地保持原文本:
例如在清單 5 中名為 test.rhtml 的文件(按照慣例,.rhtml 是針對 eRuby 標(biāo)記的、包含有 HTML 的文件的擴(kuò)展名)。清單 5 使用了 Ruby 代碼和表達(dá)式。請注意 清單 5.一個簡單的 rhtml 文件
您可以簡單地通過 ERb 運行此代碼,如清單 6 所示: 清單 6.用 ERb 處理文件
Ruby 是一系列處理基于 LAMP 的 Web 開發(fā)的語言之一。LAMP 代表:
在 LAMP 中,通常您可以通過簡單的操作系統(tǒng)腳本,使用諸如公共網(wǎng)關(guān)接口 (CGI) 之類的框架來提供 Web 應(yīng)用程序。 eRuby 有效地提升了典型的基于 CGI 編程的水平。正如您所預(yù)料的那樣,您可以直接將 ERb (或是基于 C 語言的 eruby 的等價物)插入 Apache HTTP 服務(wù)器并調(diào)用 Web 頁面。隨后您可以將 Ruby 視為 Java servlet 等價物了。但新的框架常將 ERb 作為一個 Ruby 庫來調(diào)用。如果想要從 API 中創(chuàng)建一個 Ruby 模板,您應(yīng)該使用清單 5 的修正版本,如清單 7 所示: 清單 7. 在 Ruby 應(yīng)用程序中運行 ERb 模板
通過這種方式執(zhí)行這些模板,您將 Ruby 編程語言下的所有能力賦予了您的模板。隨后您可以在模板中的代碼和應(yīng)用程序其余部分的代碼之間實現(xiàn)無縫重構(gòu)。例如,您可以創(chuàng)建一個幫助器來基于散列映射的內(nèi)容構(gòu)建簡單的表,如清單 8 所示: 清單 8. 創(chuàng)建幫助器
給定一個散列映射,清單 8 顯示了一個用于創(chuàng)建表的幫助器。本例中先聲明一個散列映射和一個模板,然后把它們放在一起使用(通常您可以將這個模板放到一個單獨的文件中;而為了保持清單的簡單,我將其寫作一行)。注意,您會很自然地在 Ruby 編程語言的功能的基礎(chǔ)上擴(kuò)展模板系統(tǒng)的功能。本例將 ERb 方式的替換與提供簡單字符串的基本 Ruby 字符串替換結(jié)合了起來。Ruby on Rails 用以下幾種強(qiáng)制的方法將這些替換方式組合在一起:
事實上,Rails 的設(shè)計為用戶貢獻(xiàn)庫提供了簡單的方式,這些庫使用 JavaScript 來呈現(xiàn)諸如 Ajax 元素、樹控制或彈出式菜單之類的復(fù)雜特性。Rails 社區(qū)提供了功能遠(yuǎn)遠(yuǎn)強(qiáng)大于 Rails 基本功能的幫助器。
Seaside 是一個不使用傳統(tǒng)模板的 HTML 呈現(xiàn)策略的例子,是針對使用 Smalltalk 開發(fā) Web 應(yīng)用程序的框架。如今,Web 開發(fā)人員通過一個名為層疊樣式表 (CSS)(參見 參考資料)的策略將樣式放到了一個更加重要的位置。在 CSS 中,您可以使用模板友好的語言來構(gòu)建包括呈現(xiàn)位置、顏色、背景以及字體在內(nèi)的所有的樣式信息。Seaside 在樣式上非常依賴 CSS,但卻從不用模板來呈現(xiàn)基本組件。 在 Seaside 中,每一個組件都能夠自我呈現(xiàn)。最基本的情況是,一個組件僅僅顯示基本的 HTML 標(biāo)記和必要的動態(tài)內(nèi)容以呈現(xiàn)此組件。例如,清單 9 定義了 清單 9.一個簡單的 Seaside 組件
在清單 9 中, 圖 1. 一個簡單的 Seaside 組件 ![]() 更加復(fù)雜的組件能夠使其子組件自我呈現(xiàn)。用這種方法,Seaside 能夠用最小的努力產(chǎn)生相當(dāng)復(fù)雜的組件。例如,表能夠呈現(xiàn)一系列行,而這些行又能夠依次呈現(xiàn)一系列單元格。清單 10 是一個復(fù)雜組件的例子: 清單 10. 一個更加復(fù)雜的 Seaside 組件
清單 10 中的代碼呈現(xiàn)了一組計數(shù)器,遍歷一個容器集合,為每一個容器調(diào)用 圖 2. 一組 Seaside 計數(shù)器 ![]() Seaside 模型不使用模板,卻可以依靠每個個體對象的自我呈現(xiàn)來構(gòu)建異常強(qiáng)大的具有復(fù)雜交互功能的 Web 頁面。Seaside 依靠樣式表來維持設(shè)計人員與編程人員間的良好關(guān)系。分層、布局、回溯和樣式在 Seaside 中是家常便飯。
在 Jason Hunter 六年前撰寫的一篇出色的文章中,他列舉了 JSP 的缺點(參見 參考資料)。我解釋為:
多年來,Java 開發(fā)人員已經(jīng)提出了改變這些不足的實踐和框架。JavaServer 頁面標(biāo)準(zhǔn)標(biāo)記庫 (JSTL)(JSP編程的自定義標(biāo)記系統(tǒng))試圖簡化從 JSP 文件中分解出代碼以及將代碼放入共享庫。但那個標(biāo)記系統(tǒng)遠(yuǎn)比其需要的復(fù)雜。它深具誘惑,卻不能直接將 Java 代碼插入 Web 頁面,因而 Java Web 頁面開發(fā)人員通過避免所有的代碼來抵制這種誘惑,這像避免瘟疫一樣。幾個建立在 JSP 技術(shù)上的框架試圖簡化此問題。更新的框架則試圖改善 Java Web 開發(fā)體驗。例如,JavaServer Faces (JSF) 試圖重新發(fā)明 Struts —— 但其最初卻使用了 JSP(這違背了一些專家的意見)。 在最近的幾年,一些不依賴于 JSP 的創(chuàng)新性框架已經(jīng)開始出現(xiàn)。通過依靠更簡單的模板哲學(xué)(一種更接近于純 HTML 語言的思想),RIFE、Wicket、Spring Web MVC、Tapestry 以及其他一些框架都聲稱為組件的集成提供了更簡單的策略(參見 參考資料)。它們都可以讓 Web 開發(fā)人員使用本機(jī)設(shè)計工具而非為 JSP 編程專門定制的工具。這對 Java 語言來說是個健康的方向。然而,其他語言,如 Ruby 在處理 Web 開發(fā)上比 Java 技術(shù)要好得多。 能將 Java 豐富的企業(yè)功能同簡易的動態(tài)語言結(jié)合起來的可行性策略是使用嵌入式虛擬機(jī)。依據(jù) JRuby 的領(lǐng)袖 Thomas E. Enebo 的說法,開發(fā)人員已經(jīng)在研究一種 servlet,這種 servlet 允許嵌入 Ruby 代碼來生成 Ruby 風(fēng)格的 Web 頁面。在很多方法中,這一種能夠讓您利用到這兩者的優(yōu)勢。 我希望您對其他語言呈現(xiàn) Web 頁面的一些方法有了一些認(rèn)識。下一次,我將會探討使用函數(shù)語言解決通用問題的不同方法。 學(xué)習(xí)
獲得產(chǎn)品和技術(shù)
|