自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JSP技術(shù)優(yōu)缺點深入分析

開發(fā) 后端
本文作者強烈建議開發(fā)人員在選擇 Web 應(yīng)用程序編程語言時,使用其他可以替代 JavaServer Pages (JSP) servlets 的技術(shù)。本文將深入查看JSP代碼并介紹一些有吸引力的替代選擇。

作為一名資深的 Java 技術(shù)專家和 Enhydra 支持者,本文作者強烈建議開發(fā)人員在選擇 Web 應(yīng)用程序編程語言時,使用其他可以替代 JavaServer Pages (JSP) servlets 的技術(shù)。JSP 技術(shù)是Sun 的J2EE 平臺和編程模型的一部分,用于解決將單調(diào)的內(nèi)容轉(zhuǎn)換為外觀優(yōu)美的表示層時遇到的困難。事實上,并非所有的Web開發(fā)人員都對JSP 技術(shù)很滿意。由于 Sun 技術(shù)出現(xiàn)了很多不同的版本,您可以從眾多表示技術(shù)中選擇一種替代技術(shù)。本文將深入查看JSP代碼并介紹一些有吸引力的替代選擇。
 
表示技術(shù)專門用于將單調(diào)粗糙的Web 內(nèi)容轉(zhuǎn)換成帶有漂亮的表示層的內(nèi)容。JavaServer Pages (JSP) 技術(shù)是 Sun 的表示模型,并且是 J2EE 平臺的一部分,它獲得了極大的關(guān)注。使用 JSP 技術(shù)有優(yōu)點也有缺點。Web 開發(fā)人員應(yīng)該了解這些優(yōu)缺點,并且知道還有其他代替技術(shù)。實際上,現(xiàn)在有很多可供選擇的表示技術(shù)。本文先介紹表示技術(shù)要解決哪些問題,然后考察 JSP 模型特有的優(yōu)缺點。最后,將介紹一些其他表示技術(shù),它們可以代替 Sun 表示技術(shù)。

歷史背景

在深入介紹表示技術(shù)之前,有必要了解一下該技術(shù)產(chǎn)生的時代背景。就在10 年前,瘦客戶機還是個新鮮事物。我們?nèi)匀惶幱谧烂鎽?yīng)用程序的時代,使用功能有限的 286 微處理器和現(xiàn)在看來不屑一顧的 14 寸顯示器。時代變了!現(xiàn)在我的臺式機只需要運行一個 Web 瀏覽器,服務(wù)器由 Sun、IBM、HP、Compaq 提供,計算、業(yè)務(wù)邏輯和內(nèi)容則又由其他公司提供。那么顯示器呢?現(xiàn)在我們使用的是 21 寸到 25 寸不等、等離子寬屏顯示器。這樣我們就可以看到復(fù)雜的 HTML 表示,它們充當(dāng)這些強大的應(yīng)用程序的前端。以前的單調(diào)界面已經(jīng)無法滿足需要;我們現(xiàn)在需要使用華麗的圖形、可以移動的圖像、色彩協(xié)調(diào)的表示,并且要求它能夠加快呈現(xiàn)速度。

前提條件

如今,在羽毛漸豐的 Windows 應(yīng)用程序經(jīng)過十年的發(fā)展之后,我們還處在表示模式的巨大轉(zhuǎn)型之中。Visual Basic 和 C 程序員發(fā)現(xiàn)他們?nèi)匀辉谑褂煤蠖讼到y(tǒng)或單調(diào)的 Windows 應(yīng)用程序,或是在工具箱中加入了一種具有 Web 能力的語言,例如 Java 語言。如果一個應(yīng)用程序無法支持至少 3 到 4 種 ML 式語言(例如 HTML、XML 和 WML),即使不是徹底失敗,也會被認(rèn)為是很糟糕的。當(dāng)然,這就表示我們非常重視能輕松開發(fā) Web 表示層的能力。

事實證明,使用新的 Internet 以及所有可用的語言(Java、C、Perl、Pascal 和 Ada 等)并不像我們希望的那樣簡單。在后端系統(tǒng)使用編程語言并利用它們生成適合客戶機的標(biāo)記語言時,出現(xiàn)了大量問題。隨著瀏覽器端的選擇越來越多(例如 DHTML 和 JavaScript 編碼),Web 領(lǐng)域迫切需要圖形設(shè)計知識,以及可以使用標(biāo)準(zhǔn) HTML 創(chuàng)建復(fù)雜界面的工具。但開發(fā)應(yīng)用程序前端的能力無法跟上這些需求的步伐。此時,表示技術(shù) 應(yīng)運而生。

表示技術(shù)的專門任務(wù)是:將內(nèi)容(即沒有包含表示細(xì)節(jié)的數(shù)據(jù))轉(zhuǎn)換為表示,也就是您在手機、PalmPilot 或 Web 瀏覽器看到的各種用戶界面。這些表示技術(shù)要解決哪些問題?讓我們來了解一下。

分離和集成

表示技術(shù)的主要目的是允許分離內(nèi)容和表示。換而言之,業(yè)務(wù)邏輯單元(假設(shè) C 或 Java 等編程語言)不需要使用特定于表示的方式生成數(shù)據(jù)。數(shù)據(jù)或內(nèi)容,按照原始格式返回,沒有進(jìn)行格式化。表示技術(shù)隨后對內(nèi)容應(yīng)用格式化或進(jìn)行表示。最終的結(jié)果是各種數(shù)據(jù)被圖形、格式、色彩和徽標(biāo)所包圍。

查看清單 1 和清單 2 中的示例,了解一下原始內(nèi)容和應(yīng)用了表示技術(shù)的內(nèi)容之間的差異。

清單1:展示了原始的內(nèi)容,全部都是數(shù)據(jù),可以按照任何方式使用。

Russell Crowe
Tom Hanks
Meg Ryan
Mary Stuart Masterson
Alec Baldwin
Ashley Judd
Keanu Reeves

清單2:要比清單 1 更加復(fù)雜,使用表示技術(shù)對相同的數(shù)據(jù)進(jìn)行了裝飾,并可以立即表示在支持 HTML 的瀏覽器中。

﹤HTML﹥
﹤HEAD﹥
﹤TITLE﹥Search Results: Actors﹤/TITLE﹥
﹤/HEAD﹥
﹤BODY﹥
﹤H2 ALIGN="center"﹥Search Results: Actors﹤/H2﹥
﹤CENTER﹥
﹤HR width="85%"﹥
﹤TABLE width="50%" CELLPADDING="3" CELLSPACING="3" border="1"
         BGCOLOR="#FFFFCC"﹥
    ﹤TR BGCOLOR="#FFCCCC"﹥
      ﹤TH width="50%" ALIGN="center"﹥Last Name﹤/TH﹥
      ﹤TH width="50%" ALIGN="center"﹥First Name﹤/TH﹥
    ﹤/TR﹥
    ﹤TR﹥
      ﹤TD width="50%"﹥Baldwin﹤/TD﹥
      ﹤TD width="50%"﹥Alec﹤/TD﹥
    ﹤/TR﹥
    ﹤TR﹥
      ﹤TD width="50%"﹥Crowe﹤/TD﹥
      ﹤TD width="50%"﹥Russell﹤/TD﹥
    ﹤/TR﹥
    ﹤TR﹥
      ﹤TD width="50%"﹥Hanks﹤/TD﹥
      ﹤TD width="50%"﹥Tom﹤/TD﹥
    ﹤/TR﹥
    ﹤TR﹥
      ﹤TD width="50%"﹥Judd﹤/TD﹥
      ﹤TD width="50%"﹥Ashley﹤/TD﹥
    ﹤/TR﹥
    ﹤TR﹥
      ﹤TD width="50%"﹥Masterson﹤/TD﹥
      ﹤TD width="50%"﹥Mary Stuart﹤/TD﹥
    ﹤/TR﹥
    ﹤TR﹥
      ﹤TD width="50%"﹥Reeves﹤/TD﹥
      ﹤TD width="50%"﹥Keanu﹤/TD﹥
    ﹤/TR﹥
    ﹤TR﹥
      ﹤TD width="50%"﹥Ryan﹤/TD﹥
      ﹤TD width="50%"﹥Meg﹤/TD﹥
    ﹤/TR﹥
﹤/TABLE﹥
﹤/CENTER﹥
﹤/BODY﹥
﹤/HTML﹥ 

可以看到,清單 1 中的內(nèi)容更清晰,非專業(yè)人員更加容易使用和理解,而清單 2 中的內(nèi)容特定于瀏覽器表示。很難從中提取數(shù)據(jù)或?qū)?shù)據(jù)用作其他用途。#p#

這個基本的區(qū)別,即分離表示和內(nèi)容而不是集成它們(至少在用戶需要使用信息時),是任何表示技術(shù)前提,包括 JSP 技術(shù)。此外,任何無法實現(xiàn)這個基本目標(biāo)的表示技術(shù)都不能真正體現(xiàn)創(chuàng)建的初衷。

工作和重復(fù)工作

除了分離表示和內(nèi)容外,另一個衡量表示技術(shù)的可用性的指標(biāo)是:能夠消除多少重復(fù)的工作。表示和內(nèi)容的分離也促使內(nèi)容開發(fā)人員之間的角色分離。程序員可以關(guān)注上例所示的原始內(nèi)容,而圖形設(shè)計師或網(wǎng)絡(luò)管理員則關(guān)注表示。然而,在獲得圖形設(shè)計師設(shè)計的表示(或標(biāo)記)并將它應(yīng)用到程序員代碼提供的內(nèi)容中時,角色之間仍然有一定重復(fù)。

在最簡單的情況下,設(shè)計師提供標(biāo)記,而開發(fā)人員提供代碼并把標(biāo)記插入到表示技術(shù)中。應(yīng)用程序被 “啟動”,內(nèi)容魔術(shù)般地變成了用戶界面。當(dāng)然,我們都知道,開發(fā)遠(yuǎn)遠(yuǎn)沒有結(jié)束。接下來要重新修訂版本、修改界面,還必須添加新的業(yè)務(wù)規(guī)則。這能真正考驗表示技術(shù)的靈活性。雖然很容易更新插入到表示層的原始內(nèi)容,但是圖形設(shè)計師很少能夠輕松地編輯他們的初始工作。經(jīng)常要修改表示層(我們常常按照銷售部門的 “指使” 進(jìn)行修改)。因此,問題產(chǎn)生了:設(shè)計師要修改哪些內(nèi)容來調(diào)整他們的工作?是他們提供給開發(fā)人員的原始標(biāo)記語言頁面嗎?也許不是,因為這個頁面很可能插入了自定義標(biāo)記或代碼(JSP 頁面、模板引擎),被轉(zhuǎn)換為一個 Java servlet,或修改為完全無法識別的內(nèi)容。

設(shè)計師通常需要重新設(shè)計頁面并重新將其提交給開發(fā)人員。然后再由開發(fā)人員將頁面重新轉(zhuǎn)換為特定的格式,以供表示技術(shù)使用?;蛘?,設(shè)計師必須學(xué)習(xí)一種腳本編制語言,或至少知道開發(fā)人員提供的頁面源代碼中哪部分是違規(guī)的。當(dāng)然,這種方法容易出錯,并且使用起來不安全。當(dāng)您了解到某種表示技術(shù)允許清晰地分離內(nèi)容和表示后,您應(yīng)該確保將修改表示層所需的重復(fù)工作減至最小。

JSP 技術(shù)的承諾

現(xiàn)在,讓我們具體看一下 JSP 編碼。JSP 技術(shù)承諾為設(shè)計師和開發(fā)人員提供他們所需的惟一表示技術(shù)。JSP 技術(shù)是 J2EE 平臺的一部分,這充分展示了 Sun 為其 Java 產(chǎn)品提供的強大支持。為了使您了解這個解決方案的流行程度,請嘗試在 amazon.com 中搜索一下 ‘JSP’;您將發(fā)現(xiàn)大量與 JSP 技術(shù)有關(guān)的書籍,它會遠(yuǎn)遠(yuǎn)超過任何單獨一種 Java API.在詳細(xì)探討 JSP 技術(shù)引發(fā)的具體問題之前,您應(yīng)該清楚地了解這種技術(shù)的承諾。

內(nèi)容和表示

首先,JSP 技術(shù)與內(nèi)容和表示的分離有關(guān),是 Sun 發(fā)布的有關(guān) JSP 頁面的最主要目標(biāo)。實際上,一些代碼開發(fā)人員抱怨將 out.println("﹤HTML﹥﹤HEAD﹥﹤TITLE﹥" + pageInfo.getTitle() + "﹤/TITLE﹥﹤/HEAD﹥"); 鍵入到 servlet,這直接導(dǎo)致了 JSP 的設(shè)計。在硬編碼內(nèi)容中混入運行時變量加重了 servlet 開發(fā)人員的負(fù)擔(dān),并且使開發(fā)人員更加難對表示層進(jìn)行修改,即使非常小的修改也是如此。

JSP 技術(shù)解決了這個問題,它允許在運行時將普通的 HTML 頁面(后來還包括 WHM 或其他標(biāo)記語言)編譯到 Java servlet 中,實際上效仿了 out.println() 范例,而不需要開發(fā)人員編寫代碼。它允許您將變量插入到在運行時才進(jìn)行解釋的頁面。

在一個 JSP 頁面中,清單 2 所示的 HTML 片段應(yīng)該類似清單 3 中的示例。

﹤%@ page import="com.ibm.display.PageUtils" %﹥
﹤%@ page import="com.ibm.display.PageInfo" %﹥
﹤%
PageInfo pageInfo = (PageInfo)session.getAttribute("PAGE_DATA")
%﹥
﹤HTML﹥
﹤HEAD﹥
﹤TITLE﹥
﹤%=pageInfo.getTitle()%﹥
﹤/TITLE﹥
﹤/HEAD﹥
﹤BODY﹥
﹤!-- Other HTML content --﹥
﹤/BODY﹥
﹤/HTML﹥

根據(jù)最初的原則判斷,JSP 技術(shù)(至少在其說明的設(shè)計中)可以滿足表示技術(shù)的基本原則,正如上面概況的一樣:內(nèi)容與表示分離。

代碼和標(biāo)記

JSP 技術(shù)特性列表上的第二項可能會出現(xiàn)一些問題。JSP 代碼可以讓您將 Java 代碼直接插入到標(biāo)記頁面。在開發(fā) JSP 規(guī)范時,Microsoft Active Server Pages (ASP) 大獲成功,因此 Sun 與 Microsoft 之間的競爭空前激烈。這導(dǎo)致了這個決策的產(chǎn)生。JavaServer Pages 的名稱與 Active Server Pages 類似并非偶然。并且對眾多 API 特性的模仿也是蓄意而為。因此 JSP 創(chuàng)建者需要能夠?qū)?Java 代碼添加到他們的標(biāo)記中。

為了演示將 Java 代碼加入到標(biāo)記中,清單 4 中的 JSP 代碼片段根據(jù)需要動態(tài)地添加行,以表示 actors 的 Vector 中的每一項。

﹤%@ page import="com.ibm.display.PageUtils" %﹥
﹤%@ page import="com.ibm.display.PageInfo" %﹥
﹤%@ page import="com.ibm.people.Actor" %﹥
﹤%@ page import="java.util.Iterator" %﹥
﹤%@ page import="java.util.Vector" %﹥
﹤%
PageInfo pageInfo = (PageInfo)session.getAttribute("PAGE_DATA")
Vector actors = pageInfo.getActors()
%﹥
﹤HTML﹥
﹤HEAD﹥
﹤TITLE﹥
﹤%=pageInfo.getTitle()%﹥
﹤/TITLE﹥
﹤/HEAD﹥
﹤BODY﹥
﹤H2 ALIGN="center"﹥Search Results: Actors﹤/H2﹥
﹤CENTER﹥
﹤HR width="85%"﹥
﹤TABLE width="50%" CELLPADDING="3" CELLSPACING="3" border="1"
         bgcolor="#FFFFCC"﹥
﹤%
for (Iterator i = actors.iterator(); i.hasNext()) {
Actor actor = (Actor)i.next();
%﹥
    ﹤TR BGCOLOR="#FFCCCC"﹥
      ﹤TH width="50%" ALIGN="center"﹥
       ﹤%=actor.getLastName()%﹥
      ﹤/TH﹥
      ﹤TH width="50%" ALIGN="center"﹥
       ﹤%=actor.getFirstName()%﹥
      ﹤/TH﹥
    ﹤/TR﹥
﹤%
}
%﹥
﹤/TABLE﹥
﹤/CENTER﹥
﹤/BODY﹥
﹤/HTML﹥

注意,目前為止,我僅僅介紹了 JSP 技術(shù)的最初設(shè)計目標(biāo);在下一節(jié)介紹 JSP 技術(shù)存在的問題之后,我將對這個目標(biāo)作出自己的論斷。不過,您可能已經(jīng)開始有點好奇,因為將代碼嵌入到 JSP 頁面中似乎與 JSP 技術(shù)的首要目標(biāo)(分離內(nèi)容和表示)有所沖突。實際上,我還沒有就此展開論述。

設(shè)計師和開發(fā)人員

JSP 技術(shù)的最終(也是值得稱贊)的目標(biāo)是,它嘗試在應(yīng)用程序開發(fā)過程中形成清晰定義的角色。通過在表面上分離內(nèi)容和表示,JSP 技術(shù)能夠更加清晰地區(qū)分設(shè)計師和開發(fā)人員角色。設(shè)計師使用標(biāo)準(zhǔn)的 HTML、WML 或其他合適的語言創(chuàng)建標(biāo)記,而開發(fā)人員編寫代碼。當(dāng)然,如今很多設(shè)計師學(xué)習(xí)了 JavaScript 語言,因此,這些設(shè)計師開始學(xué)習(xí) JSP 編碼也不是什么令人吃驚的事情。通常,設(shè)計師并不會單純地創(chuàng)建純標(biāo)記,他們會編寫一個完整的 JSP 頁面并將其交給開發(fā)人員。然后經(jīng)過頻繁的修改,開發(fā)人員再將 JSP 頁面作為完整應(yīng)用程序的前端使用。但是,這里的關(guān)鍵問題是仍然有很多設(shè)計師沒有 學(xué)習(xí) JSP 編碼,他們也必須能夠在這種環(huán)境下工作。

出現(xiàn)的問題

我剛剛介紹了一種良好的表示技術(shù)應(yīng)該提供的功能,以及 JSP 技術(shù)嘗試解決的具體問題。現(xiàn)在,我將轉(zhuǎn)入正題:JSP 技術(shù)雖然建立在良好理念的基礎(chǔ)之上,但是卻出現(xiàn)了一些問題。在選擇 JSP 編寫您的應(yīng)用程序之前(您可能仍然會這樣做),至少應(yīng)該注意一些容易出現(xiàn)的問題。

您還需要注意經(jīng)常被忽略的 J2EE 編程平臺:僅僅因為平臺附帶了 API 并不意味著一定要使用它。和這種想法同樣可笑的是,很多開發(fā)人員在使用 JSP、EJB 或 JMS API 時,都在想如果不使用這些 API 的話,他們的應(yīng)用程序就不是真正的 “J2EE 應(yīng)用程序” 了。實際上,平臺提供的 API 遠(yuǎn)遠(yuǎn)超過大多數(shù)應(yīng)用程序的需要。如果您不能使用或?qū)?JSP 技術(shù)還持有懷疑態(tài)度,那么可以不使用它!在選擇 JSP 編寫應(yīng)用程序之前,仔細(xì)研究它的優(yōu)點和 缺點。讓我們看看其中一些缺點。#p#

可移植性和語言鎖定

JSP 技術(shù)將您鎖定到某種特定的語言。這一點不應(yīng)該給予太多的關(guān)注。至少在我看來,Java 技術(shù)是企業(yè)應(yīng)用程序的惟一 選擇。在這個領(lǐng)域,根本不存在可以獨立于語言的解決方案。當(dāng)然,在這個時候,我沒有把 Microsoft .NET 平臺牽涉進(jìn)來。只有時間可以告訴我們這個平臺是否可以真正獨立于語言(我很懷疑這一點)。

然而,選擇 JSP 技術(shù)將強制您使用 Java 語言,至少對于內(nèi)容和表示是這樣的。盡管 CORBA 可以用于業(yè)務(wù)邏輯,JSP 編碼要求必須熟悉 servlet 和核心 Java 語言。因為很多開發(fā)人員通過 J2EE 平臺接觸 JSP 編碼,因此這通常算不成問題。

混合和獨立

在本篇文章中,我始終圍繞分離內(nèi)容和表示這一概念。您可能對此已經(jīng)感到不耐煩,那么現(xiàn)在讓我們看看 JSP 究竟能不能實現(xiàn)這個目標(biāo)。正如我們之前討論的一樣,JSP 宣稱 一直致力于實現(xiàn)內(nèi)容和表示分離,那么我們可以因此認(rèn)為它實現(xiàn)了目標(biāo),是嗎?未必如此。

內(nèi)容和表示之間的界限變得模糊

JSP 允許將 Java 代碼插入到標(biāo)記語言頁面中,這個非常危險的特性允許將內(nèi)容混合到表示中。更糟糕的是,業(yè)務(wù)邏輯通常會進(jìn)入到 JSP 頁面中,如清單 5 所示。

﹤%@ page import="com.ibm.display.PageUtils" %﹥
﹤%@ page import="com.ibm.display.PageInfo" %﹥
﹤%@ page import="com.ibm.logic.AdminUtils" %﹥
﹤%@ page import="com.ibm.people.Actor" %﹥
﹤%@ page import="java.util.Iterator" %﹥
﹤%@ page import="java.util.Vector" %﹥
﹤%
PageInfo pageInfo = (PageInfo)session.getAttribute("PAGE_DATA")
%﹥
﹤HTML﹥
﹤HEAD﹥
﹤TITLE﹥
﹤%=pageInfo.getTitle()%﹥
﹤/TITLE﹥
﹤/HEAD﹥
﹤BODY﹥
﹤H2 ALIGN="center"﹥Search Results: Actors﹤/H2﹥
﹤CENTER﹥
﹤HR width="85%"﹥
﹤TABLE width="50%" CELLPADDING="3" CELLSPACING="3" border="1"
         BGCOLOR="#FFFFCC"﹥
﹤%
// Based on user's permissions, perform search differently (business logic!)
Vector actors = pageInfo.getActors()
if (pageInfo.getUserInfo().hasPermission("ADMINISTRATOR")) {
   actors = AdminUtils.getActors(pageInfo.getSearchCriteria());
} else {
   actors = pageInfo.getActors();
}
for (Iterator i = actors.iterator(); i.hasNext()) {
Actor actor = (Actor)i.next();
%﹥
    ﹤TR BGCOLOR="#FFCCCC"﹥
      ﹤TH width="50%" ALIGN="center"﹥
       ﹤%=actor.getLastName()%﹥
      ﹤/TH﹥
      ﹤TH width="50%" ALIGN="center"﹥
       ﹤%=actor.getFirstName()%﹥
      ﹤/TH﹥
    ﹤/TR﹥
﹤%
}
%﹥
﹤/TABLE﹥
﹤/CENTER﹥
﹤/BODY﹥
﹤/HTML﹥

JSP 的擁護(hù)者會很快告訴您 JSP 標(biāo)記庫 可以幫助您避免這個問題。標(biāo)記庫允許將自定義標(biāo)記(例如 ﹤AUTHORS /﹥)添加到 JSP 頁面,然后在運行時在標(biāo)記庫內(nèi)將其解析為代碼片段。

使用自定義標(biāo)記和相關(guān)的標(biāo)記庫允許把以上示例轉(zhuǎn)換為清單 6 所示的內(nèi)容。

﹤CENTER﹥
﹤TABLE width="50%" CELLPADDING="3" CELLSPACING="3" border="1"
         BGCOLOR="#FFFFCC"﹥
   ﹤ACTORS /﹥
﹤/TABLE﹥
﹤/CENTER﹥

在運行時,將執(zhí)行標(biāo)記的代碼并把正確的結(jié)果插入到頁面中。但是這并沒有解決問題。反對 JSP 技術(shù)的理由并不在于能否 分離內(nèi)容和表示,而是在于是否必須 分離。只要 JSP 編碼允許內(nèi)聯(lián)編碼,那么就可以很方便地對內(nèi)聯(lián)代碼進(jìn)行最后的修改(特別是逼近最后期限時),而不是將代碼轉(zhuǎn)換為一個標(biāo)記庫。如果這不是真的,那么 Java 語言為何會馬上比 C 和 C++ 更流行:Java 禁用了 C 中大量有問題的特性,例如指針相加。雖然您可以總是強調(diào)您不需要 在 C 中執(zhí)行指針相加,或者優(yōu)秀的程序員將插入代碼 scriptlet,我們都知道實際會發(fā)生什么。Java 語言是一種更好的選擇,因為它嚴(yán)禁 使用這些不好的習(xí)慣。但是 JSP 在這方面更類似于 C,允許實現(xiàn)一些非常糟糕的實踐。

檢驗 JSP 技術(shù)是否成功達(dá)到其所述目標(biāo)的另一種方法是看它能否在實踐中實現(xiàn)這個目標(biāo);顯然,如果認(rèn)為 JSP 無法實際實現(xiàn)目標(biāo),這是不公平的。大多數(shù)模板引擎,比如 FreeMarker 和 WebMacro,都提供了相同的內(nèi)聯(lián)編碼功能,通常附帶了一種類似 Perl 的語言。然而,諸如 Enhydra 的 XMLC 這樣的技術(shù)不 允許進(jìn)行這種類型的編碼。相反,這些技術(shù)將一個純標(biāo)記語言頁面作為輸入,然后生成 Java 方法。這實際上改變了編程流程;應(yīng)用程序并不像 JSP 技術(shù)那樣使用頁面從應(yīng)用程序調(diào)用邏輯,而是使用方法影響頁面的值(Enhydra)。以 Enhydra 為例,使用 XMLC 將頁面轉(zhuǎn)換為一個 DOM 樹,然后使用 DOM 的 HTML 綁定更新頁面中的 “字段”(有關(guān) Enhydra XMLC 的更多信息,請查閱 參考資料)。

這里的重點是,JSP 技術(shù)實現(xiàn)目標(biāo)的能力遠(yuǎn)遠(yuǎn)超過 XMLC,例如,僅僅是允許標(biāo)記庫這一項就比 XMLC 強很多。但是 Sun 規(guī)范總體趨向于始終維護(hù)向后兼容性,或至少在相當(dāng)長的一段時間內(nèi)維護(hù)向后兼容性。JSP 規(guī)范的當(dāng)前版本為 1.1,它允許使用 scriptlets,因此在未來幾年內(nèi) JSP 頁面內(nèi)都會支持這個特性。在深入探究 JSP 編碼之前,請注意,在其強調(diào)的完全分離內(nèi)容和表示的理念和實際實現(xiàn)之間存在一個很大的缺口,它充其量只是假裝分離了用戶界面和驅(qū)動應(yīng)用程序的代碼。

單處理和多任務(wù)處理

如前所述,理想狀態(tài)下,設(shè)計師應(yīng)該能夠執(zhí)行單獨處理,只關(guān)注圖形設(shè)計,而開發(fā)人員應(yīng)該能夠?qū)⒆⒁饬性诰幊躺稀R虼?,設(shè)計師可以在將頁面轉(zhuǎn)換為適合應(yīng)用程序的格式后,再對其進(jìn)行處理。對于 JSP 頁面來說,將頁面轉(zhuǎn)換為適合應(yīng)用程序的格式就是指向頁面導(dǎo)入 JavaBeans、插入內(nèi)聯(lián)編碼并添加自定義標(biāo)記庫。問題是有些設(shè)計師使用的是 HTML 編輯器,比如 HoTMetaL、Macromedia Dreamweaver 或 FrontPage,這些編輯器無法識別代碼 scriptlets 或標(biāo)記庫,這意味著設(shè)計師實際上只收到了頁面的一部分。想象一下,標(biāo)記庫或代碼片段只生成了表的若干行,或是頁面中其他格式化的細(xì)節(jié),這是多么麻煩的事情。設(shè)計師使用了不兼容的 HTML 編輯器,無法看到這些元素的外觀。在開發(fā)人員完成編碼后,設(shè)計師不能輕松地對頁面進(jìn)行修改,這時,不僅沒有清晰地劃分角色,JSP 編碼實際上將這兩種角色合二為一:開發(fā)人員必須執(zhí)行多個任務(wù),必須擔(dān)當(dāng)開發(fā)人員、設(shè)計師以及其他角色。

如果您仍然對此表示懷疑,那么請下載 J2EE Reference Implementation 并將其中一個附帶的 JSP 頁面加載到一個 WYSIWYG HTML 編輯器,例如 Dreamweaver.頁面立即被一些黃色區(qū)域填充,告訴您頁面中包含的所有 “錯誤” 標(biāo)記。當(dāng)然,黃色內(nèi)容來自于 JSP 標(biāo)記和代碼,而不是頁面出現(xiàn)了什么真正的錯誤。

迄今為止,尚未出現(xiàn)支持 JSP 功能的 WYSIWYG 編輯器,我也沒有聽說過任何與此相關(guān)的項目。盡管模板引擎也具有相同的問題,但是很多基于 Java 的解決方案,例如我最喜歡的 Enhydra,都允許您將標(biāo)記頁面作為輸入提供給表示技術(shù)。在這種情況下,設(shè)計師可以根據(jù)需要頻繁地進(jìn)行修改,并重新提供標(biāo)記頁面。運行表示技術(shù)的引擎或編譯程序?qū)?biāo)記頁面轉(zhuǎn)換為適當(dāng)?shù)母袷?,并且不需要修改任何代碼(典型情況下)。最終獲得了理想的結(jié)果:設(shè)計師和開發(fā)人員各司其職。

因此,要注意 JSP 技術(shù)作出的承諾和它實際交付的實現(xiàn)。在實際中,要在一個 JSP 技術(shù)驅(qū)動的環(huán)境下發(fā)揮功效,必須讓開發(fā)人員處理大部分標(biāo)記,或至少讓設(shè)計師學(xué)習(xí)一些 JSP 編碼。

HTML 和 XML

JSP 技術(shù)最嚴(yán)重的缺陷之一(也是經(jīng)常被忽視的一個缺陷)就是它與 XML 不兼容。更確切地說,并且特別針對 HTML 領(lǐng)域,JSP 頁面不要求具備 XHTML 兼容性。XHTML 是一個 World Wide Web Consortium (W3C) 規(guī)范,目前正在取代 HTML 4.0.XHTML 在實現(xiàn)格式良好的 XML 文檔方面定義了 HTML 標(biāo)記集。例如,
標(biāo)記必須被轉(zhuǎn)換為
才能確保 XML 兼容性(如果這個例子沒有解釋清楚的話,可以查閱 參考資料 列出的 XML 規(guī)范,以及關(guān)于 XHTML 的 developerWorks 文章)。同樣的規(guī)則適用于圖像標(biāo)記,并且在 XHTML 1.1(即將到來)中,大部分字體屬性和其他樣式被移入到 CSS 樣式表中。另外,大多數(shù)標(biāo)準(zhǔn) HTML 文檔可以輕松地轉(zhuǎn)換為 XHTML 1.0,這意味著可以使用任何與 XML 兼容的解析器讀取,例如 Apache Xerces,并且可以作為 XML 進(jìn)行處理。

您會問 “這有什么關(guān)系呢?”。答案是關(guān)系重大。因為 XML 正在快速成為一個在應(yīng)用程序之間和應(yīng)用程序內(nèi)部進(jìn)行通信的全球標(biāo)準(zhǔn)。使用 XML 格式傳遞書籍,可以讓任何使用基本 XML 數(shù)據(jù)綁定功能的應(yīng)用程序輕松地使用您的應(yīng)用程序的數(shù)據(jù)。想象一下,通過將您的數(shù)據(jù)遷移到 XML 格式,您就可以與信用卡公司進(jìn)行網(wǎng)上交易!多數(shù)情況下,您的數(shù)據(jù)表示還需要與其他公司進(jìn)行交互。最常見的情況是門戶應(yīng)用程序,它接受來自各種提供者的內(nèi)容(例如,天氣信息、股票報價和新聞),通常附帶有提供者的標(biāo)記。然而,由于 JSP 頁面將代碼和自定義標(biāo)記庫相混合,因此無法在這種環(huán)境下良好地工作。

JSP 頁面很少具有格式良好的 XML 文檔,并且不重視是否符合 XHTML,而 XHTML 這種標(biāo)記語言并不允許使用各種 JSP 自定義標(biāo)記庫。然而,更重要的是,插入到 JSP 頁面的代碼片段并不屬于任何標(biāo)記形式,因此當(dāng)另一個應(yīng)用程序處理它們時,將產(chǎn)生解析器加載錯誤。

在您提出質(zhì)疑之前,讓我們先了解一下整個情況。如果應(yīng)用程序允許 JSP 頁面由初始客戶機處理,結(jié)果將產(chǎn)生純 HTML(或 WML、VoXML 等)。然而,大多數(shù)請求這個數(shù)據(jù)的應(yīng)用程序使用了一定程度的緩存,因為網(wǎng)絡(luò)往返開銷很昂貴。在這些情況下,緩存過的頁面將返回過時的數(shù)據(jù)。因此,您可能更愿意返回與 XML 兼容的結(jié)果,最好使用靜態(tài)的形式。而 JSP 技術(shù)在這些情況下無能為力;JSP 頁面必須始終 在運行時進(jìn)行處理,以去掉 JSP 代碼 scriptlets 和標(biāo)記庫。

看看最關(guān)鍵的考驗:其他一些表示技術(shù)能做到這一點嗎?答案是可以。這個領(lǐng)域最權(quán)威的領(lǐng)導(dǎo)者是 Apache Cocoon 項目,它完全建立在 XML 和一個 XSLT 樣式表應(yīng)用程序(可以在運行時或靜態(tài)狀態(tài)下應(yīng)用)的基礎(chǔ)之上。由于 XML Server Pages(在 Cocoon 框架中稱為 XSP)實際上是 XML 文檔,因此始終與 XML 兼容。像 Tea 和 Enhydra XMLC 等允許輸入純標(biāo)記語言頁面的技術(shù)也可以做到這點,雖然它們的目的并不在此。在這些情況下,用戶可以使用 XHTML 或標(biāo)準(zhǔn)的 HTML.此外,這比 JSP 技術(shù)要好,因為 JSP 不能 靜態(tài)地實現(xiàn)格式良好的 XML.

結(jié)束語

希望我的努力能夠讓您進(jìn)一步了解JSP 技術(shù)的優(yōu)缺點,并且您可以將JSP 技術(shù)看作是眾多其他表示技術(shù)的替代品?,F(xiàn)在,您可能對整個J2EE編程模型也產(chǎn)生了一點懷疑。如果您希望進(jìn)一步研究平臺選擇,那么可以在 Apache Cocoon、Enhydra 和各種模板引擎中尋找 JSP 技術(shù)的替代選擇。

最后,請記住,本文并不是建議您使用JSP或避免使用它,盡管表面上像是這樣。我的目的是鼓勵您對任何技術(shù)進(jìn)行詳細(xì)的分析,確保它是正確的選擇。就像編程模型一樣,有時它們是合適的,然而有些時候它們并不適合。多進(jìn)行一些比較,找到最適合自己的技術(shù)并作出明智的決定,而不是倉促地決定。

【編輯推薦】

  1. 專題:JSP基礎(chǔ)教程
  2. JSP中Action屬性的功能淺析
  3. 高性能、高彈性JSP和Servlet性能優(yōu)化
  4. Java和JSP編程的六個常見問題
責(zé)任編輯:佚名 來源: 網(wǎng)絡(luò)轉(zhuǎn)載
相關(guān)推薦

2017-03-06 14:45:27

超線程技術(shù)處理器技術(shù)服務(wù)器

2009-08-13 09:18:43

2009-11-13 13:08:19

2009-12-25 10:25:06

LMDS接入技術(shù)

2009-08-10 15:09:15

JSP架構(gòu)JSP開發(fā)工具

2011-03-23 11:01:55

LAMP 架構(gòu)

2012-07-01 02:10:49

JSP架構(gòu)開發(fā)工具

2010-09-07 14:21:22

PPPoE協(xié)議

2022-04-12 08:30:45

TomcatWeb 應(yīng)用Servlet

2012-11-26 09:49:37

SDNOpenFlowVLAN

2022-08-30 07:00:18

執(zhí)行引擎Hotspot虛擬機

2021-10-29 16:36:53

AMSAndroidActivityMan

2009-12-14 14:50:46

Ruby傳參數(shù)

2009-12-16 16:39:01

Visual Stud

2009-06-10 18:12:38

Equinox動態(tài)化OSGi動態(tài)化

2010-03-08 14:53:48

Linux分區(qū)

2011-09-01 13:51:52

JavaScript

2023-02-01 08:13:30

Redis內(nèi)存碎片

2019-01-15 14:57:47

物聯(lián)網(wǎng)無線技術(shù)IOT

2009-12-22 15:39:36

IPPBX技術(shù)
點贊
收藏

51CTO技術(shù)棧公眾號