;
第 3 步:初始化标记处理类实例
每个标记处理类都必须包含一个不带参数的公共构造函数,用于放置初始化代码。本文中的某些标记处理类(EvalTag、ListTag 和 MapTag)包含一个无参数的公共构造函数,它使用默认值初始化实例变量。其他类(IfTag、WhileTag 和 ItemTag)没有构造函数。请注意,Java 编译器在类不包含任何构造函数的情况下自动生成一个无参数的公共构造函数,该函数不执行任何操作。 [Page]
第 4 步:提供属性设置方法
JSP 页面中的标记属性值通过 setAttribute() 方法传递给标记处理类。例如,本文中的 <u:eval> 标记包含四个属性:var、scope、expr 和 type。EvalTag 处理类实现 setExpr() 和 setType() 方法,并从 VarTagSupport 继承 setVar() 和 setScope()。
动态属性通过 DynamicAttributes 接口定义的 setDynamicAttribute() 方法传递。
第 5 步:实现 doTag() 方法
该方法用于实现定制标记的逻辑。doTag() 方法由 JSP 容器继所有属性设置方法之后调用。此处可以使用 getJspContext() 获得一个 javax.servlet.jsp.JspContext 对象来访问 JSP 环境。可以调用 getJspBody(),它返回 javax.servlet.jsp.tagext.JspFragment 的实例,该实例表示位于 <prefix:customTag> 和 </prefix:customTag> 之间的 JSP 主体。如果要开发协同工作的标记,如 <u:list> 和 <u:item>(本文的最后一部分将对其进行介绍),则还可以使用 getParent() 和 findAncestorWithClass() 方法。
第 6 步:测试定制标记
使用定制标记的 JSP 页面必须使用 <%@taglib%> 指令导入该标记的标记库。当定制标记出现在 JSP 页面中时,JSP 容器将生成创建标记处理类实例、调用属性设置方法和调用 doTag() 方法的代码。因此,在使用定制标记的 JSP 页面的执行过程中将调用标记处理类方法。
限制和变通方法
为简化标记处理 API,JSP 2.0 采取了一个限制:如果定制标记的处理类是基于简单标记 API 的,则页面作者不得在 <prefix:customTag> 和 </prefix:customTag> 之间使用 JSP 1.x 声明 (<%!%>)、JSP 1.x 表达式 (<%=%>) 和 scriptlet (<%%>)。大多数情况下,您可以将 JSP 页面中的 Java 代码移动到标记处理类中,或在 JSP 2.0 表达式 (${})(可以在定制标记的主体中使用)中使用 JSTL。请注意,JSP 2.0 允许您在基于标准标记 API 的定制标记主体中使用 scriptlet。然而,由于不使用脚本的 JSP 页面更易于维护,因此最好避免