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