作为一名资深的 Java 技术专家和 Enhydra 支持者,本文作者强烈建议开发人员在选择 Web 应用程序编程语言时,使用其他可以替代 JavaServer Pages (Jsp) servlets 的技术。JSP 技术是Sun 的 J2EE平台和编程模型的一部分,用于解决将单调的内容转换为外观优美的表示层时遇到的困难。事实上,并非所有的Web开发人员都对JSP 技术很满意。由于 Sun 技术出现了很多不同的版本,您可以从众多表示技术中选择一种替代技术。本文将深入查看JSP代码并介绍一些有吸引力的替代选择。
表示技术专门用于将单调粗糙的Web 内容转换成带有漂亮的表示层的内容。JavaServer Pages (JSP) 技术是 Sun 的表示模型,并且是 J2EE 平台的一部分,它获得了极大的关注。使用 JSP 技术有优点也有缺点。Web 开发人员应该了解这些优缺点,并且知道还有其他代替技术。实际上,现在有很多可供选择的表示技术。本文先介绍表示技术要解决哪些问题,然后考察 JSP 模型特有的优缺点。最后,将介绍一些其他表示技术,它们可以代替 Sun 表示技术。
历史背景
在深入介绍表示技术之前,有必要了解一下该技术产生的时代背景。就在10 年前,瘦客户机还是个新鲜事物。我们仍然处于桌面应用程序的时代,使用功能有限的 286 微处理器和现在看来不屑一顾的 14 寸显示器。时代变了!现在我的台式机只需要运行一个 Web 浏览器,服务器由 Sun、IBM、HP、Compaq 提供,计算、业务逻辑和内容则又由其他公司提供。那么显示器呢?现在我们使用的是 21 寸到 25 寸不等、等离子宽屏显示器。这样我们就可以看到复杂的 html表示,它们充当这些强大的应用程序的前端。以前的单调界面已经无法满足需要;我们现在需要使用华丽的图形、可以移动的图像、色彩协调的表示,并且要求它能够加快呈现速度。
前提条件
如今,在羽毛渐丰的 windows 应用程序经过十年的发展之后,我们还处在表示模式的巨大转型之中visualbasic和 C 程序员发现他们仍然在使用后端系统或单调的 Windows 应用程序,或是在工具箱中加入了一种具有 Web 能力的语言,例如 Java 语言。如果一个应用程序无法支持至少 3 到 4 种 ML 式语言(例如 HTML、XML 和 WML),即使不是彻底失败,也会被认为是很糟糕的。当然,这就表示我们非常重视能轻松开发 Web 表示层的能力。
事实证明,使用新的 Internet 以及所有可用的语言(Java、C、Perl、Pascal 和 Ada 等)并不像我们希望的那样简单。在后端系统使用编程语言并利用它们生成适合客户机的标记语言时,出现了大量问题。随着浏览器端的选择越来越多(例如 DHTML 和 JavaScript 编码),Web 领域迫切需要图形设计知识,以及可以使用标准 HTML 创建复杂界面的工具。但开发应用程序前端的能力无法跟上这些需求的步伐。此时,表示技术 应运而生。
表示技术的专门任务是:将内容(即没有包含表示细节的数据)转换为表示,也就是您在手机、PalmPilot 或 Web 浏览器看到的各种用户界面。这些表示技术要解决哪些问题?让我们来了解一下。
分离和集成
表示技术的主要目的是允许分离内容和表示。换而言之,业务逻辑单元(假设 C 或 Java 等编程语言)不需要使用特定于表示的方式生成数据。数据或内容,按照原始格式返回,没有进行格式化。表示技术随后对内容应用格式化或进行表示。最终的结果是各种数据被图形、格式、色彩和徽标所包围。
查看清单 1 和清单 2 中的示例,了解一下原始内容和应用了表示技术的内容之间的差异。
清单1:展示了原始的内容,全部都是数据,可以按照任何方式使用。
Russell Crowe
Tom Hanks
Meg Ryan
Mary Stuart Masterson
Alec Baldwin
Ashley Judd
Keanu Reeves
清单2:要比清单 1 更加复杂,使用表示技术对相同的数据进行了装饰,并可以立即表示在支持 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 中的内容更清晰,非专业人员更加容易使用和理解,而清单 2 中的内容特定于浏览器表示。很难从中提取数据或将数据用作其他用途。
这个基本的区别,即分离表示和内容而不是集成它们(至少在用户需要使用信息时),是任何表示技术前提,包括 jsp 技术。此外,任何无法实现这个基本目标的表示技术都不能真正体现创建的初衷。
工作和重复工作
除了分离表示和内容外,另一个衡量表示技术的可用性的指标是:能够消除多少重复的工作。表示和内容的分离也促使内容开发人员之间的角色分离。程序员可以关注上例所示的原始内容,而图形设计师或网络管理员则关注表示。然而,在获得图形设计师设计的表示(或标记)并将它应用到程序员代码提供的内容中时,角色之间仍然有一定重复。
在最简单的情况下,设计师提供标记,而开发人员提供代码并把标记插入到表示技术中。应用程序被 “启动”,内容魔术般地变成了用户界面。当然,我们都知道,开发远远没有结束。接下来要重新修订版本、修改界面,还必须添加新的业务规则。这能真正考验表示技术的灵活性。虽然很容易更新插入到表示层的原始内容,但是图形设计师很少能够轻松地编辑他们的初始工作。经常要修改表示层(我们常常按照销售部门的 “指使” 进行修改)。因此,问题产生了:设计师要修改哪些内容来调整他们的工作?是他们提供给开发人员的原始标记语言页面吗?也许不是,因为这个页面很可能插入了自定义标记或代码(jsp 页面、模板引擎),被转换为一个 javaservlet,或修改为完全无法识别的内容。
设计师通常需要重新设计页面并重新将其提交给开发人员。然后再由开发人员将页面重新转换为特定的格式,以供表示技术使用。或者,设计师必须学习一种脚本编制语言,或至少知道 开发人员提供的页面源代码中哪部分是违规的。当然,这种方法容易出错,并且使用起来不安全。当您了解到某种表示技术允许清晰地分离内容和表示后,您应该确保将修改表示层所需的重复工作减至最小。
JSP 技术的承诺
现在,让我们具体看一下 JSP 编码。JSP 技术承诺为设计师和开发人员提供他们所需的惟一表示技术。JSP 技术是j2ee平台的一部分,这充分展示了 Sun 为其 Java 产品提供的强大支持。为了使您了解这个解决方案的流行程度,请尝试在 amazon.com 中搜索一下 ‘JSP’;您将发现大量与 JSP 技术有关的书籍,它会远远超过任何单独一种 Java API.在详细探讨 JSP 技术引发的具体问题之前,您应该清楚地了解这种技术的承诺。
内容和表示
首先,JSP 技术与内容和表示的分离有关,是 Sun 发布的有关 JSP 页面的最主要目标。实际上,一些代码开发人员抱怨将 out.println("﹤html﹥﹤HEAD﹥﹤TITLE﹥" + pageInfo.getTitle() + "﹤/TITLE﹥﹤/HEAD﹥"); 键入到 servlet,这直接导致了 JSP 的设计。在硬编码内容中混入运行时变量加重了 servlet 开发人员的负担,并且使开发人员更加难对表示层进行修改,即使非常小的修改也是如此。
JSP 技术解决了这个问题,它允许在运行时将普通的 HTML 页面(后来还包括 WHM 或其他标记语言)编译到 Java servlet 中,实际上效仿了 out.println() 范例,而不需要开发人员编写代码。它允许您将变量插入到在运行时才进行解释的页面。
在一个 JSP 页面中,清单 2 所示的 HTML 片段应该类似清单 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﹥
根据最初的原则判断,JSP 技术(至少在其说明的设计中)可以满足表示技术的基本原则,正如上面概况的一样:内容与表示分离。
代码和标记
JSP 技术特性列表上的第二项可能会出现一些问题。JSP 代码可以让您将 Java 代码直接插入到标记页面。在开发 JSP 规范时,microsoft Active Server Pages (asp)大获成功,因此 Sun 与 Microsoft 之间的竞争空前激烈。这导致了这个决策的产生。JavaServer Pages 的名称与 Active Server Pages 类似并非偶然。并且对众多 API 特性的模仿也是蓄意而为。因此 JSP 创建者需要能够将 Java 代码添加到他们的标记中。