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