最新消息:宝宝仲的世界......这里是宝宝仲的舞台,宝宝仲的个人Show

JSP 最佳实践: 将自定义标记库打包

WEB TECH luinstein 623浏览 0评论

JSP 最佳实践: 将自定义标记库打包

将自定义标记库打包到 JAR 文件中,以便更安全和更容易地发布

developerWorks
文档选项


将打印机的版面设置成横向打印模式

打印本页

将此页作为电子邮件发送

将此页作为电子邮件发送

级别: 初级

Brett McLaughlin (brett@oreilly.com), 作者, O’Reilly and Associates

2003 年 10 月 25 日

将标记库存放在本地文件系统中的确有利于内部(in-house)开发和测试,但是这并非永远都是好的解决方案。自定义标记库应该能够被广泛地访问,也就是说,必须以一种标准的和安全的方式来发布它们。BrettMcLaughlin 解释了如何将您的自定义标记库打包到 JAR 文件,以便在任何 JSP 兼容的 Web 容器中更容易地维护、发布和安装它们。

到目前为止,我们在本系列中讲到的都是自定义标记库在本地文件系统中的情况,在这种情况下,我们可以很容易地访问和操作这些自定义标记库。然而,虽然本地访问对于内部(in-house)开发和设计来说很有用,但这并非永远都是一个好的解决方案。自定义标记库的最终目的就是它们应该能够被广泛地访问,这意味着必须以一种标准化的方式来发布自定义标记库,并且这种方式允许一些必要的安全措施。在本期的 JSP 最佳实践中,您将学习如何将自定义标记库打包到一个 JAR 文件中,以便更安全和更容易地发布。

为什么使用 JAR?

自定义标记库本身就是要被发布的,既可能是在公司开发小组这么一个小圈子内发布,或者是在联合组织这样更大的圈子内发布,也可能是在面向付费客户的外部网络上发布。但不管是哪种情况,将标记库存放在本地文件系统中并使其在该位置可用,都不是一个好主意。

如果您的标记库是用于一个内部(in-house)开发小组,那么在发布该标记库时您首先想到的就是要分清责任。在 JSP 编程中,理想的情况是拥有两个并行工作的开发小组:Java 开发人员负责编写实现细节,而 JSP 页面设计者则负责处理前端。但是经验表明,如果不强制执行的话,这种分工很快就打破了。将自定义标记库放在一个可以从本地访问的文件系统中这种做法会造成一种不利的情形,在这种情形下,即使是好意的行为 — 例如 JSP 页面设计者“改正” TLD 文件,或者 Java 程序员“调整” HTML — 也可能给开发周期以及最终产品带来破坏。

如果将远程方(例如外部公司或组织)这一因素也考虑进来,那么这种情形就更加严重了。无论何时您允许不受控制的外方(例如最终用户或者页面设计者)访问您的代码,都将招致麻烦。例如,假设一个外部公司的用户更改您的 TLD,或者搞乱标记类文件。这样一来,您不但要因为产生的错误而受到责备,而且很可能找不出到底是谁犯下这样的错误。您将花费双倍的时间来调试代码,而实际上问题的起因不过是一个用户错误。这种类型的错误往往不止出现一次 — 只要您将主标记库存放在一个可以从本地访问的文件系统中,这种错误就会重复出现。

最后,让我们考虑一下,如果您决定将自定义标记库推向市场进行出售,会出现什么情况呢?现今,对类进行反编译十分容易,这就意味着某些人可以轻易地买到您的代码,加以修改,然后恶意地以您公司的名义使用它。或者,他们可以简单地重新打包它,将其放在他们自己的网站上出售。不管是哪种情形,对于您来说都不是什么好事。将代码打乱(这使得反编译二进制代码变得很难,而且通常是不可能的)是避免恶意修改或者剽窃的好方法。将您的标记库打包到一个单独的、离散的单元中也是推荐的做法。

JSP 规范允许我们使用 Java 平台的 JAR 工具打包自定义标记库。一旦这些自定义标记库被打包到 JAR 文件中,就可以广泛地发布、维护和安装。而且,您将看到,将标记库打包到 JAR 文件中并不很难。


回页首

创建标记库目录

第一步就是像清单 1 显示的那样创建一个标记库目录结构:

清单 1. 用于标记库 JAR 的目录结构

$basedir/
          META-INF/
		 META-INF/site-utils.tld
		 com/
		 com/newInstance/
		 com/newInstance/site/
		 com/newInstance/site/tags/
		 com/newInstance/site/tags/LastModifiedTag.class
		 com/newInstance/site/tags/SSOSubmitTag.class
		 com/newInstance/site/tags/CopyrightTag.class
		 com/newInstance/site/utils/HTMLParser.class
		 com/newInstance/site/utils/RegExp.class

您可以在自己的 Web 容器中创建这样的目录结构,步骤如下:

  1. 为您的标记库创建一个名为 tag-libraries 的基目录。
  2. 在 tag-libraries 目录中,创建一个名为 META-INF 的子目录。
  3. 从 Web 应用程序的 WEB-INF/tlds 目录中,将您想要的 TLD 文件复制到这个 META-INF 目录中。
  4. 从 WEB-INF/classes 目录中将您想要的包结构复制到基目录中。

确信您只对标记库用到的目录和类进行了复制 — 因为您最终想要完成就是将自己的 Java 类与您的标记一起发布。


回页首

创建 JAR 文件

接下来的一步是使用 Java 命令 jar ,从您的标记库目录结构创建一个 JAR 文件,如清单 2 所示:

清单 2. 创建 JAR 文件

[legolas:tqag-libraries] bmclaugh% jar cvf newInstance-taglib_1-1.jar 
META-INF com
added manifest
adding: com/(in = 0) (out= 0)(stored 0%)
adding: com/newInstance/(in = 0) (out= 0)(stored 0%)
adding: com/newInstance/site/(in = 0) (out= 0)(stored 0%)
adding: com/newInstance/site/tags/(in = 0) (out= 0)(stored 0%)
adding: com/newInstance/site/tags/CopyrightTag.class(in = 980) 
               (out= 382)(deflated 39%)
adding: com/newInstance/site/tags/LastModifiedTag.class(in = 1488) 
               (out= 818)(deflated 45%)
adding: com/newInstance/site/tags/SSOSubmitTag.class(in = 2208) 
               (out= 1060)(deflated 48%)
adding: META-INF/(in = 0) (out= 0)(stored 0%)
adding: META-INF/site-utils.tld(in = 589) (out= 334)(deflated 43%)

只要您原意,产生的 JAR 文件可以传递给任何人 — 无论是公司内部的页面设计者,还是一家海外公司。


回页首

文档编制和版本控制

创建任何标记库的重要一环是文档编制 — 您 为您的代码编制文档,对不对? — 当需要打包标记库以用于发布的时候,更是如此。您或许已经注意到,前面的 JAR 中包括注释 added manifest ,这条注释引用由 JAR 规范定义的一个特殊类型的文件。 manifest 是一种文本文件,其中存有关于一个 JAR 的信息,这个文件总是被包括在 JAR 内的同一个地方。如果您想知道一个 Java 归档文件的内容或者功能,那么首先(最好)要看的就是 manifest 文件。

在本例中,manifest 包括一个版本标识(VID),这让您可以跟踪您的工作与最终用户或页面设计者的已有 JAR 文件之间的修订和升级。

清单 3 展示了一个用于标记库的简单 manifest 文件:

清单 3. 一个简单的 manifest 文件

Name: com/newInstance/site/tags/
Sealed: true
Implementation-Title: "newInstance.com Site Utility Tag Library"
Implementation-Version: "1.1"
Implementation-Vendor: "Brett McLaughlin"

上面的 manifest 文件定义了要发布的 Java 包的名称,并规定 JAR 文件应该 密封(seal)起来。将一个文件密封起来可以确保 com.newInstance.site.tags 包中的所有类都 必须存在于同一个 JAR 文件中。自然地,这样可以防止用户创建他自己的类,将这些类分派给同一个包,并覆盖或扩展这些类的功能。密封是一种好的习惯,可以确保代码的一致性和版本控制。


回页首

将 manifest 添加到 JAR 中

最后一步是为标记库包提供一个名称、版本和提供者(provider)。您所提供的信息将可以很容易地被任何 JAR 工具访问到,并且使得您可以更容易地判断您是否需要为用户升级该标记库。

清单 4 展示了如何在创建时将 manifest 添加到 JAR 文件中。这里的文件名是 manifest.mf,但是您也可以使用任何您选择的文件名。

清单 4. 创建一个带有 manifest 的 JAR 文件

[legolas:tqag-libraries] bmclaugh% jar cvfm
newInstance-taglib_1-1.jar manifest.mf META-INF com
added manifest
adding: com/(in = 0) (out= 0)(stored 0%)
adding: com/newInstance/(in = 0) (out= 0)(stored 0%)
adding: com/newInstance/site/(in = 0) (out= 0)(stored 0%)
adding: com/newInstance/site/tags/(in = 0) (out= 0)(stored 0%)
adding: com/newInstance/site/tags/CopyrightTag.class(in = 980) 
               (out= 382)(deflated 39%)
adding: com/newInstance/site/tags/LastModifiedTag.class(in = 1488) 
               (out= 818)(deflated 45%)
adding: com/newInstance/site/tags/SSOSubmitTag.class(in = 2208) 
              (out= 1060)(deflated 48%)
adding: META-INF/(in = 0) (out= 0)(stored 0%)
adding: META-INF/site-utils.tld(in = 589) (out= 334)(deflated 43%)

回页首

创建标记库 URI

创建好 JAR 文件之后,您将需要让页面设计者知道如何从他们的 Web 容器链接到该 JAR 文件。类似于文件系统中的文件,最容易的方法就是创建一个 URI(统一资源标识符),并将其存放在一个 web.xml 文件中。清单 5 展示了用于标识一个标记库的 web.xml 条目:

清单 5. 在 web.xml 中标识一个标记库

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
   PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
          "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
   <taglib>
     <taglib-uri>

http://www.newInstance.com/taglibs/site-utils

     </taglib-uri>
     <taglib-location>
     /WEB-INF/lib/newInstance-taglib_1-1.jar
     </taglib-location>
   </taglib>
</web-app>

您可能已经注意到,我们将 JAR 文件放在目标 Web 应用程序的 WEB-INF/lib 目录中。Web 应用程序所使用的所有 JAR 文件都应该存放在这个目录中。这里不再像以前那样引用文件系统上的 TLD 文件,web.xml 文件现在指向包含标记库的 JAR 文件。


回页首

结束语

通过这里罗列出来的简单几步,我们就将标记库从一般的文件系统转移到一种受到更多控制的、可分发的 JAR 文件环境中。访问 JAR 中的标记库与访问 JAR 文件之外的文件系统中的标记库是一样的:您只需简单地在一个 taglib 指令中指定 URI,并运行该指令。

在接下来的几期技巧文章中,我们将超越这些 JSP 基础知识,了解一些特定于 Web 的 JSP 功能。这些技巧的主题涉及从使用数据库到处理动态导航链接,这些技巧将为基于 Java 的 Web 站点和 Web 应用程序带来精彩的一面。

参考资料

关于作者

 

Brett McLaughlin 从 Logo 时代(还记得那个小三角吗?)就开始从事计算机工作了。他现在专门研究用 Java 和 Java 相关技术构建应用程序基础结构。最近几年,他在 Nextel Communications 和 Allegiance Telecom Inc. 从事这些基础结构的实现。Brett 是 Java Apache 项目 Turbine 的共同创始人之一,该项目通过使用 Java servlet 为 Web 应用程序开发构建可再用的组件体系结构。他还是 EJBoss 项目(一种开放源码 EJB 应用程序服务器)和 Cocoon(一种开放源码 XML Web 发布引擎)的志愿开发者之一。可以通过 brett@oreilly.com 与 Brett 联系。

转载请注明:宝宝仲的世界 » JSP 最佳实践: 将自定义标记库打包

您必须 登录 才能发表评论!