当前位置: 首页 > 图灵资讯 > 技术篇> 批判性地看待一种可行的表示技术:JavaServerPages servlet技术(下)

批判性地看待一种可行的表示技术:JavaServerPages servlet技术(下)

来源:图灵教育
时间:2024-02-21 10:20:11

JSP 现在,让我们讨论技术的承诺。 JSP 编码的具体内容。JSP 技术承诺为设计师和开发人员提供最合适的表达技术。JSP 技术是 J2EE 平台的一部分显示 Sun 公司可以给予 Java 最有力的产品支持。为了让你对这个解决方案的受欢迎程度有一个概念,你可以尝试一下 amazon.com 在上面搜索“JSP,你会发现,讨论 JSP 与其他任何一种书籍进行比较 Java API 有更多的书。我深入讨论 JSP 在技术存在具体问题之前,您需要对其承诺的功能有一个清晰的了解。

内容和表达首先,JSP 该技术最早出现在分离内容和表达的过程中 Sun 对于 JSP 在公布的一系列目标中。实际上,JSP 该设计直接针对开发人员的投诉,对于这些开发人员来说 servlet 反复键入代码 out.println("<HTML><HEAD><TITLE>"+ pageInfo.getTitle() + "</TITLE></HEAD>") 感到厌烦。运行过程中硬编码内容与变量的混合 servlet 开发人员造成了巨大的负担,即使是最小的变化,开发人员也很难做出表示层。

JSP 通过支持普通技术 HTML 页面(以后 WML 或者其它标记语言页)在运行过程中编译成 Java servlet,改变了这种情况。它实际上是模仿。 out.println() 在没有开发人员编写代码的情况下,还允许将变量插入页面,直到操作时才解释。

清单 2 所示的 HTML 片段对应 JSP 页应与清单 3 中间的例子相似。

清单 3. 使用表示技术包含数据的技术 JSP 页

<%@ 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><!-- 其他 HTML 内容 --></BODY></HTML>

根据这些初始原则,JSP 技术(至少在其声明设计中)将满足表示技术的第一个原则,如上所述:内容与表示的分离。

JSP的代码和标记 技术所列的第二个特征可能会引起你的注意,那就是,JSP 编码允许直接插入标记页中 Java 代码。为了理解做出这个决定的原因,让我们回顾一下制定 JSP 规范时的情况。Sun 与微软的竞争一直非常激烈,主要是因为微软 Active Server Pages (ASP)的成功。JavaServer Pages 与 Active Server Pages 名称上的相似性不是巧合。而且模仿 ASP 各种各样的特征似乎也是有意的。所以 JSP 作者选择在他们的标志中添加 Java 代码。

添加到标记中 Java 代码的例子,列表 4 中的 JSP 根据需要自动添加片段,以显示演员 Vector 中的每一项。

清单 4. 插入到标记语言页面中 Java 代码

<%@ 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">结果:演员</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 最初的技术目标。在下面的章节中,我们将讨论这个问题 JSP 只有在技术问题上,我才会对这个目标做出判断。但是,你现在可能有点怀疑了,因为向 JSP 在页面中嵌入代码似乎会导致与 JSP 与技术的第一个目标相关的问题(即分离内容和表示)。但实际上(啊咳),我还没有发表意见。

JSP设计师和开发人员 最后一个技术值得一提的目标是,它试图在应用程序开发过程中建立一个明确的角色。从表面上分离内容和表达,JSP 技术在设计师和开发人员之间划定了更明显的界限。设计师只使用标准 HTML、WML、或者创建其他适当的语言标记,开发人员编写代码。当然,现在很多设计师都学会了JavaScript,所以不应该惊讶的是,他们中的许多人也开始学习 JSP 编码。在许多情况下,他们不仅做纯标记,而且写得完整 JSP 并将其交给开发人员。经过常规调整后,开发人员对这些进行了调整 JSP 将页面作为整个应用程序的某一部分的前端放置在适当的位置。但关键是很多设计师不会 JSP 编码,所以在这种环境下还有工作要做。

我已经清楚地解释了技术应该提供什么,以及 JSP 技术试图解决的具体问题。现在,我要切入正题:JSP 虽然技术设计有很好的想法,但它带来了很多问题。选择在应用程序中使用 JSP 以前(你可能还在用),至少要知道可能的缺陷。

你也应该知道 J2EE 编程平台经常被忽视的一个小问题:该平台提供了一个小问题 API 并不意味着你必须使用它。正如这句话听起来有点愚蠢一样,许多开发人员仍然存在 JSP、EJB 或 JMS API 他们认为,如果他们不使用这些,他们就会挣扎 API,他们的应用程序有点不像“J2”EE 应用程序。事实上,这个平台承诺了很多承诺 API,对大多数应用程序来说都是不必要的。假如你在用 JSP 当技术出现问题或怀疑时,你可以完全不使用它! 在应用程序中选择使用 JSP 在技术之前,请仔细看看它的优缺点。现在让我们来看看它的几个缺点。

JSP可移植性和语言锁定 技术把你锁定在一种特定的语言中。这个不应该看得太重。在设计企业应用程序时,Java 技术是唯一的语言选择(至少我的观点是这样)。在这个问题上,没有独立于语言的解决方案。当然,在游戏的这个阶段,我还没有考虑 Microsoft .NET 烟幕及其平台的实际情况。只有时间才能证明 Microsoft .NET 平台是否会发展成为真正独立于语言的产品。(我很怀疑。)

还有,选择 JSP 你将被迫使用技术 Java 至少对于表达和内容来说,语言是这样的。虽然 CORBA 可用于业务逻辑,但可用于业务逻辑 JSP 确实需要熟悉一些编码 servlet 以及核心的 Java 语言。因为很多开发人员都是从 J2EE 平台转向 JSP 编程,所以这通常不是问题。

在全文中混合和独立,我多次提到分离内容和表达的想法。你可能已经厌倦了,所以现在让我们来确定 JSP 是时候真正实现这个目标了吗?正如我所说,既然 JSP 声称是为了这个分离目标而设计的,所以我们应该假设它实现了这个目标?对吗?不一定。

JSP模糊了内容和表达之间的界限 允许插入标记语言页中 Java 代码,这是相当危险的,它甚至允许将内容混合到表示中。更糟糕的是,业务逻辑经常混合在一起 JSP 例如,页面中的清单 5 所示。

清单 5. 包括业务逻辑 JSP 页

<%@ 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">结果:演员</H2><CENTER> <HR WIDTH="85%"> <TABLE WIDTH="50%" CELLPADDING="3" CELLSPACING="3" BORDER="1" BGCOLOR="#FFFFCC"><%// 根据用户的权限,执行不同的搜索(业务逻辑!)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 支持者会立即告诉你 JSP 标记库可以帮助你避免这个问题。标记库允许向前移动 JSP 添加定制标记的页面(例如)<AUTHORS />),这些标记在运行过程中被解释为标记库中的代码片段。

使用定制标记和相关标记库将上述示例变成清单 6 中的代码。

清单 6. 结合页面中的定制标记和标记库

<CENTER> <TABLE WIDTH="50%" CELLPADDING="3" CELLSPACING="3" BORDER="1" BGCOLOR="#FFFFCC"> <ACTORS /> </TABLE></CENTER>

该标记的代码将在运行过程中执行,正确的结果将插入页面。但这并没有解决问题。此时,对 JSP 不利的技术论点不在于表达和内容是否可以分离,而在于它们是否必须分离。只要 JSP 如果编程允许嵌入代码,则很容易使用嵌入代码进行最终修改(特别是在限期相邻时),而不是将代码转换为标记库。如果没有,请考虑一下 Java 语言的流行速度迅速超过C 和 C++ 的原因:Java 不允许 C 许多有问题的特点,如指针加法。虽然你总能争论,但你总能争论 C 指针加法不需要执行,或者优秀的程序员从不插入代码 scriptlet,但我们都知道实际情况会是什么。Java 语言优于 C,因为它禁止这种坏习惯。但 JSP 在这种情况下,和 C 语言非常相似,它允许一些坏习惯。

对于 JSP 该技术是否达到了其声称的目标, 另一个测试标准是看它实际上是否能达到目标。当然,要求不可能达到的标准 JSP 这是不公平的。大多数模板引擎(例如(例如) FreeMarker 和 WebMacro)这些模板具有相同的嵌入式代码功能,通常使用类似的模板 Perl 的语言。但是,像 enhydra 的 XMLC 这种内嵌代码是不允许的。这些技术用纯标记语言页面作为输入来代替,并生成 Java 方法。这种做法本质上改变了程序流,而不是页面(JSP 技术)调用应用程序的逻辑(enhydra)使用方法影响页面中的值。在 enhydra 在特定情况下,XMLC 将页面转换为一个 DOM 树,并使用 DOM 的 HTML 绑定允许更新页面中的“域”。(关于 enhydra XMLC 详情请参考参考资料。)

这一点,JSP 比 XMLC 问题更严重。例如,虽然 JSP 该技术可以实现其目标,但只允许使用标记库。但是,Sun 标准中的总体趋势是保持向后兼容,或者至少保持相当长的时间。当前版本的 JSP 1.1 允许使用 scriptlet,所以估计 JSP 页面中包含代码的情况将持续几年。在深入探讨 JSP 在编码之前,请注意,它实际上提供了产品之间的差距(最多只是用户界面和驱动程序代码之间的伪分离)和目标(即完全分离内容和表示)。

在理想情况下,设计师只应进行单一处理,即只进行图形设计,开发人员只应注意编码。这样,在将页面转换为应用程序所使用的格式后,设计师应该能够修改它。在 JSP 在页面的情况下,这应该导入 JavaBean、插入嵌入代码,在页面中添加定制标记库。问题是,一些设计师使用它 HTML 编辑器,如 HoTMetaL、Macromedia Dreamweaver 或 FrontPage,这些编辑器无法识别代码 scriptlet 或者标记库,这意味着设计师实际上只收到一些页面。当标记库或代码段在页面上产生表格行或其他格式的具体内容时,其难度可想而知。使用不兼容的 HTML 编辑器,设计师看不到这些元素是什么样子的。当开发人员编译的页面无法方便地修改时,JSP 编码不是区分不同的角色,而是将这些角色结合在一起:开发人员必须能够完成各种任务,成为开发人员和设计师,并承担其他角色。

这个重要的特征不能说服你吗?那么你可以下载吗? J2EE 参考实现,并包含其中任何一个 JSP 页面转入所见即所得 HTML 编辑器,如 Dreamweaver。这个页面立即充满了黄色区域,让你知道页面中包含的所有“非法”标记。当然,黄色区域是由 JSP 页面上的任何实际错误都不是由标记和代码引起的。

到目前为止,还没有任何支持。 JSP 所见即所得编辑器,我也没听说有人致力于开发这样的编辑器。模板引擎也有同样的问题,很多都是基于 Java (比如我喜欢的) enhydra),允许提交标记页作为输入表示技术。在这种情况下,设计师可以反复修改标记页,然后重新提交。操作表示技术的引擎或编译器可以在不改变代码的情况下,将页面转换为正确的格式。结果正是我们想要的:设计师是设计师,开发人员是开发人员。

所以,和 JSP 与技术实际提供的功能相比,我希望你们一定要小心对待 JSP 技术承诺。事实上,为了使应用程序处于一个位置 JSP 如果你在技术驱动的环境中成功运行,你必须让你的开发人员处理大量的标记,或者让设计师至少学习一些东西 JSP 编程。

HTML 与 XMLJSP 技术最严重的缺陷之一也是最容易被忽视的一点,那就是它和 XML 不兼容。更准确地说,尤其是在 HTML 领域中,JSP 页面不需要兼容 XHTML。XHTML 是万维网联盟 (W3C) 标准,它现在正在被取代 HTML 4.0。XHTML 完整的结构 XML 文档定义 HTML 标记集。例如 <br> 必须将标记转换为 < br/>,以确保遵守 XML 规定。(如果您认为这一点不清楚,可以查阅 XML 规范和 developerWorks 关于 XHTML 在参考资料中列出的文章。)图像标记也有类似的规则 XHTML 1.1 (最近出生的) 大多数字体属性和其他样式转移到 CSS 样式表中。此外,大多数标准 HTML 文档可以很容易地转换为文档 XHTML 这意味着它们很容易使用 XML 兼容性分析程序阅读,例如 Apache Xerces,并且能够以 XML 方式控制。

你会问:“最重要的是什么?最重要的一点是 XML 迅速成为互联网和企业内部网的全球标准。对于任何基本的使用 XML 其他用于数据处理工具的应用程序 XML 格式传输数据,它们可以很容易地使用您的应用程序数据。想象一下,只需将数据转换为 XML 格式可以与信用卡公司进行电子商务通信! 在许多情况下,您的数据也需要与其他公司交换数据。最常见的情况是门户网站应用程序,它从不同的提供商(如天气、股票报价和新闻等)接收内容,这些内容通常有提供商的标志。但是,JSP 由于页面与代码和定制标记库混合,因此无法在这样的环境中工作。

JSP 页面几乎不完整,格式也不完整 XML 文档,更不用说符合了 XHTML。因为 XHTML是一种不允许各种标记语言的标记语言 JSP 定制标记库。但更重要的是,插入 JSP 页面中的代码片段不是任何形式的标记,一旦用另一个应用程序处理,就会产生分析程序错误的负担。

让我在你评论我之前讲完整个故事。如果应用程序允许原始客户机计算 JSP 页面值,结果将是纯的 HTML (或 WML、VoXML 等)。但由于网络上的往返非常昂贵,大多数请求数据的应用程序都使用某种形式的缓存。在这种情况下,缓存页面返回旧数据。在这种情况下,你可能更愿意回归完全符合纯度 XML 最好是静态表单。但是 JSP 技术对这种情况无能为力。JSP 页面在运行过程中必须始终求值,以便删除 JSP 代码 scriptlet 和标记库。

检查一下:还有其他技术可以完成这项任务吗?答案是肯定的。这一领域的绝对领导者是 Apache Cocoon 它完全基于项目 XML,是一个 XSLT 样式表应用程序(可在运行时或静态应用)。由于 XML Server Pages(Cocoon 框架中叫作 XSP)实际上是 XML 因此,它们总是符合文档的要求, XML 的。其他允许输入纯标记语言页面的技术(如 Tea 和 enhydra XMLC)尽管他们不强迫这样做,但也可以允许这一点。在这种情况下,用户可以使用 XHTML 或标准 HTML。但这还是比较的 JSP 因为是的,情况更好 JSP 不可能静态实现完整的格式 XML。

我希望我能拓宽你的视野,让你看到它 JSP 技术的优缺点。现在,你可以把它拿走 JSP 编程被认为是各种表示技术中的可选技术。在这一点上,你可能是整体的 J2EE 可疑的编程模型。现在你可能想进一步研究这个平台的替代方案,并在这里 Apache Cocoon、enhydra 在多个模板中选择替代品 JSP 编码方案。

最后,应该记住的是,虽然本文似乎提出了反对意见,但不建议您使用或不使用 JSP。我无意鼓励你深入探索任何技术是否符合你的要求。编程模型就像一个例子,有时是可行的,有时是不可行的。三思而后行,找到最适合你的方案再做决定,总比草率做决定好。