Board logo

标题: JSP 技术 -- 是友还是敌?(3) [打印本页]

作者: look_w    时间: 2018-7-10 21:42     标题: JSP 技术 -- 是友还是敌?(3)

模糊了内容与表示之间的界限
JSP 允许向标记语言页中插入 Java代码,这一点相当危险,它甚至允许将内容混合到表示中。更糟的是,业务逻辑经常混入JSP 页中,如清单 5 所示。      
清单 5. 包含业务逻辑的JSP 页
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<%@ 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.结合到页中的定制标记和标记库
1
2
3
4
5
6
7
<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 与 XML
JSP 技术的一个最严重的缺陷,也是最易被忽视的一点,就是它与 XML不兼容。更准确的说,尤其是在 HTML 领域中,JSP 页不需要兼容XHTML。XHTML 是一个万维网联盟 (W3C) 规范,它现在正取代 HTML4.0。XHTML 按照一种结构完整的 XML 文档定义 HTML 标记集。例如         <br> 标记必须转换为         <br/> ,以确保遵守 XML规定。(如果您觉得这一点没有阐明清楚,可以查阅 XML 规范和developerWorks 关于 XHTML 的文章,它们在列在 中。) 图像标记也有类似的规则,在XHTML 1.1 (最近诞生的) 中,大多数字体属性和其他样式转移到了 CSS样式表中。另外,大多数标准的 HTML 文档可以很容易转换为 XHTML1.0,这意味着它们很容易使用 XML 兼容的分析程序阅读,例如 ApacheXerces,并且能够以 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 ServerPages(在Cocoon 框架中叫作 XSP)实际上是 XML文档,所以它们始终是符合 XML的。其他允许纯标记语言页输入的技术(例如 Tea 和 EnhydraXMLC)也可以允许这一点,虽然它们不强制这样做。在这些情况下,用户可以使用XHTML 或标准 HTML。但是这样仍然比 JSP 的情况要好,因为在 JSP中        无法无法静态实现格式完整的 XML。      
小结
我希望我为您拓宽了一些眼界,使您看到了 JSP技术的优缺点。现在,您可以把 JSP编程看成是多种表示技术中的一种可选技术。在这一点上,您可能对整体的J2EE编程模型有所怀疑。现在您也许希望更进一步研究此平台的替代方案,并在Apache Cocoon、Enhydra 和多种模板中选择替代 JSP 编码的方案。      
最后,应该记住的是,尽管本文似乎提出了反对意见,但并没有建议您使用或不使用JSP。我无意鼓励您深入到任何技术的深层探究它是否符合您的要求。编程模型就像是例子,有时行得通,有时行不通。三思而后行,找到最适合您的方案再做决定,这总比草率做决定要好。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0