Oracle9iAS Containers for J2EE - Release 2

日期:2003 年 2 月 27 日

方法: OC4J 中的标记库验证(JSP 1.2 特性)

完成此方法指南后,您应该能够:

  • 理解 JSP 1.2 规范中的一部分标记库验证的特性
  • 如何创建和使用自定义的标记验证器
  • 编写一个简单的自定义标记验证器类
  • 如何打包和部署标记验证器类

JSP 1.2 规范的一个重要补充项目是支持标记库验证机制。JSP 标记库验证机制提供转换时间或请求时间方法,以强制执行对 JSP 标记使用的约束。 OC4J 也支持此特性。

有时候,标记库实施人员认为需要约束开发人员使用所提供标记库的方法。很多时候虽然已经成功编译了 JSP 页,但对标记库的不正确使用可能会导致运行时错误。对这种约束的需要有很多原因。以下给出一些原因:

  • 属性和值检查 — 在某些情况下,JSP 标记必须与特定的属性以及有效值一同使用。
  • 排序 — 在某些情况下,标记必须嵌套在预定义的次序中,以便内部标记可以访问由父标记所定义的对象。
  • 编辑工具支持 — 工具在使用 JSP 标记时可能需要排序。
  • 方法限制 — 标记库开发组可能希望约束对某些特性的使用方法。

任何开发人员在准备编写标记库验证器时必须了解三种组件。Tag Classes 和 Tag Library Validator 类是实现指定接口的 java 类。这些接口确保这些类提供可以由 JSP 容器使用的方法实现。标记库描述符是将 Tag 类和 Validator 类链接在一起的 XML 文件。

标记库描述符:标记库描述符包含基本语法信息。特别地,属性描述包括其名称、是可选项还是必选项,以及是否接受请求时间表达式。此外,可使用主体内容元素来显示操作必须为空。必须强制执行 TLD 中描述的所有约束。标记库创作者可以假设标记处理程序实例与满足 TLD 中显示的所有约束的操作相一致。

Tag 类:Tag 类是用于执行由标记库定义的操作的 Java 类。每个在标记库中定义的标记都具有一个与标记库描述符文件的帮助相关的相应的 Tag 类。这些类定义当 JSP 页产生响应时所执行的操作。

Tag Library Validator 类:Tag Library Validator 类可以列在 TLD 中,用于标记库请求验证 JSP 页。JSP 页的 XML 视图通过 PageData 类显示,而验证器类可以执行标记库创作者认为合适的任何检查。这样,库创作者完全控制了验证页面的方法。

下面给出的演示说明了如何使用标记库验证框架与 OC4J。为此,我们设计一个简单的情况。在此情况中,我们定义了两个标记 "parent" 和 "child"。以下给出使用 Tag Library Validator 类强制执行的约束列表:

  1. "child" 标记必须封在 parent 标记中
  2. "parent" 标记必须具有属性 "age",其值在 1 到 100 之间
  3. 在 "child" 节点中包含的文本不能带有字符串 "EXPERIMENT"

为实现此案例,我们需要完成以下步骤:

第 1 步:创建标记处理程序
第 2 步:创建 Tag Library Validator 类
第 3 步:定义 Tag Library Descriptor 文件
第 4 步:编写使用标记的 JSP
第 5 步:建立并运行示例

创建标记处理程序

在此方法中,我们将创建 2 个标记 "parent" 和 "child"。以下给出这些类的定义。

Parent 标记处理程序: TagParent.java
此标记处理程序定义 "parent" 标记。它具有两个属性,name 和 age。当在 JSP 页面中遇到标记元素和属性时,由容器设置这些属性。

Child 标记: TagChild.java
此标记处理程序定义 "child" 标记。它具有一个属性 name。当遇到标记元素和属性时,由容器设置此属性。

创建 Tag Library Validator 类

Tag Validator Class: Validator.java
tag validator 类具有一个重要的方法 validate。当容器遇到一个在 Tag Library Descriptor 文件中具有相关验证器类定义的标记时,由容器调用此方法。PageData 类作为一项参数由容器传递到此方法。PageData 实例可用于重新创建整个 JSP XML 视图(转换的 JSP 文档的 XML 表示)。当 XML 文档对象创建以后,正常的 DOM API 可用于处理和验证 XML 文档。这样,标记库的创作者完全控制了验证 JSP 页的方法。

定义标记库描述符

标记库描述符:howtotlv.tld

<?xml version = '1.0' encoding = 'windows-1252'?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>howtotlv</short-name>
<uri>http://xmlns.oracle.com/j2ee/jsp/tld/demos/howtotlv.tld</uri>
<description>
This tag library descriptor uses a Validator class to enforce following rules
1. "child" tag must be enclosed in parent tag
2. "parent" tag must have an attribute "age" with value between 1 to 100
3. Text contained in "child" node must not have a string "EXPERIMENT"
</description>
<validator>
<validator-class>howtotlv.Validator</validator-class>
</validator>
<tag>
<name>parent</name>
<tag-class>howtotlv.TagParent</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>name</name>
<required>required</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>age</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>child</name>
<tag-class>howtotlv.TagChild</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>


编写使用标记的 JSP

有效的 JSP 页 [不产生错误]:howtotlv.jsp

<%@ page language="java" %>
<%@ taglib prefix="demo" uri="howtotlv.tld" %>
<html>
<body>
<demo:parent name="Stella" age="32" >
<demo:child name="Michael">
Hello from the child tag!
</demo:child>
</demo:parent>
Done!
</body>
</html>

无效的 JSP 页 [产生错误]:error2.jsp

<%@ page language="java" %>
<%@ taglib prefix="demo" uri="howtotlv.tld" %>
<html>
<body>
<demo:parent name="Stella" age="102" >
<demo:child name="Michael">
Hello from the EXPERIMENT child tag!
</demo:child>
</demo:parent>
<br/>Done!
</body>
</html>

在 OC4J 安装中建立并运行示例

前提条件
确保已经安装了 OC4J v9.0.3 或更高版本。 可从 OTN 下载

注释: < OC4J_HOME> — 安装 OC4J 的目录。如果您将 OC4J 安装在 c:\ 下,则 将会是 c:\j2ee\home

解开此示例:

howtotlv.ear 文件下载到一个方便的目录中。可以使用以下给出的指示来部署示例应用程序。

在 OC4J 上部署此示例

  1. 确保已经安装了 OC4J v9.0.3 并且处于运行状态。
  2. 将 howtotlv.ear 下载或拷贝到一个方便的目录中。
  3. 打开一个命令提示窗口。(在 Unix 或 Linux 中则打开一个命令解释程序)
  4. 将此命令窗口中的当前目录改为放置 howtotlv.ear 的目录。
  5. 在命令提示符处执行以下命令:
    java -jar \j2ee\home\admin.jar ormi://localhost:23791 admin welcome -deploy -file howtotlv.ear -deploymentName howtotlv
    例如,
    java -jar C:\OC4J\j2ee\home\admin.jar ormi://localhost:23791 admin welcome -deploy -file howtotlv.ear -deploymentName howtotlv
  6. 在命令提示符处执行以下命令:
    java -jar \j2ee\home\admin.jar ormi://localhost:23791 admin welcome -bindWebApp howtotlv howtotlv-web http-web-site /howtotlv
    例如,
    java -jar C:\OC4J\j2ee\home\admin.jar ormi://localhost:23791 admin welcome -bindWebApp howtotlv howtotlv-web http-web-site /howtotlv
  7. 要运行示例,请访问 url http://:/howtotlv/
    其中,
  • hostname 是部署此应用程序的主机名称。
  • portno 是 OC4J 监听的端口号。

在 Oracle9i Application Server 上部署此示例

要在 Oracle9i Aplication Server 上部署此应用程序,请使用在 Oracle9iASinstall.html 中给出的指示

注意:如果您使用 Microsoft Internet Explorer 查看页面,则应确保将浏览器设置为显示全部错误消息文本。为此,
1. 单击工具菜单
2. 选择 Internet Options
3. 在弹出的对话框中选择 Advanced Tab
4. 找到滚动窗口中显示的 Browsing Category
5. 确保取消选择 "Show friendly HTTP error messages"

总结

通过阅读本文档并按照给出的步骤执行,您应当已经了解:

  • 由 JSP 1.2 规范提供的标记验证支持特性
  • 如何实现自定义的标记验证器
  • 在 OC4J 中打包和部署自定义的标记验证器

参考


请在 OTN 示例代码论坛中发表您对此方法的意见。

寄送此页面
Printer View 打印机视图