开发JSP自定义行为__教程 |
|
日期:2007-5-20 1:19:01 人气:54 [大 中 小] |
|
|
|
通常说来,一个标记处理程序只对那个它要与之协同工作的父元素感兴趣。所以,一个好的想法是开发一个方法,该方法将沿着层次结构不断向上追溯,直到找到标记处理程序感兴趣的那个父元素。而这正是TagSupport类所实现的findAncestorWithClass()方法所做的工作。
Public static final Tag findAncestorWithClass(Tag from , Class klass) {
Boolean isInterface = false;
If(from == null || klass == null || (!Tag.class.isAssignableFrom(klass) &&
!(isInterface = klass.isInterface()))) {
return null;
}//假如from或者klass为null , 或者klass是一个类并且没有实现Tag接口,显然当前Tag找不到klass类的父元素。
for(;;) {
Tag tag = from.getParent();
If(tag == null) {
Return null;
} //表示没有父元素
if((isInterface && klass.isInstance(tag)) || klass.isAssignableFrom(tag.getClass()))
return tag; //假如klass是接口并且当前tag实现了该接口,那么找到了。
//或者当前tag是klass类型的,那么找到了。
else
from = tag;
}
}
9. 通过行为创建新的变量
当自定义行为创建一个变量时,它必须与JSP容器合作。
对于一个标记处理程序来说,创建一个新的对象并使得其他行为和JSP脚本代码可以访问这个对象,需要两件事情:
(1) JSP容器必须知道对象的名称和Java类型,这样它才能为变量声明生成代码。
(2) 变量必须被放置在某个JSP作用域内,这样才能通过findAttribute()方法找到它,并能赋值给这个变量。
第一件事由一个名为TagExtraInfo的类来完成。当你为一个引入对象的行为开发标记处理程序时,你必须创建TagExtraInfo类的一个子类。JSP容器在生成代码的时候就需要这样一个类的实例。
10. 开发迭代行为
开发迭代行为时,通常也需要一个TagExtraInfo子类,这样才能在loop的过程中访问loopID变量。
11. 如何创建TLD
当JSP容器将自定义行为元素转化成创建并调用正确的标记处理程序的代码时,JSP容器还需要关于哪个标记处理程序实现哪个自定义行为元素的信息。而这些信息都是从TLD那里获得的。另外,JSP容器还使用TLD信息来验证行为元素的属性列表是否正确。
TLD是一个XML文件,它包含了一个库中所有自定义行为的信息。使用自定义行为的JSP页面必须能识别相应的TLD,还能够利用taglib指令元素在页面中识别出用于行为的名称空间前缀。如:
<%@ taglib uri=”/WEB-INF/tlds/orataglib_1_0.tld” prefix=”ora” %>
….
<ora:redirect page=”main.jsp”/>
JSP页面里遇到前缀匹配的行为时,JSP页面就会用TLD来查找它需要的信息。
TLD文件中的内容:
(1) 最顶部:标准的XML声明和一个DOCTYPE声明。(这两个声明指定了文件的文档类型定义Document Type Definition , DTD)。
(2) <taglib>元素: TLD的主元素,它包含了描述库的所有特定元素。
(3) <tlibversion>元素:指定标记库的版本。必须
(4) <jspversion>元素:指定了库所依赖的JSP规范的版本。默认值为1.1。可选
(5) <shortname>元素:必须元素。这个元素的值中不能包含空格或其他特殊字符,也不能以数字或下划线开头。
(6) <uri>元素:可选,字符规则同上。
(7) <info>元素:可选,
(8) TLD中至少还必须包括一个<tag>元素。<tag>元素中包含了描述自定义行为的各个方面的其他元素:<name> <tagclass> <teiclass> <bodycontent> <info> <attribute>
l <name>元素是必须的。它包含了自定义行为元素对应的名称,这个名称是唯一的。
l <tagclass>元素也是必须的。
l 如果行为引入了变量,或者需要进行语法验证,那么就要使用<teiclass>元素。这个元素是可选的,用来制定TagExtraInfo子类的全名。
l <bodycontent>元素是一个可选元素,它的三个可能值为:empty , JSP或tagdependent。
l <info>元素是可选的,用来描述行为的目的。
l tag元素还必须为行为的每个属性设置<attribute>元素。当然每个元素中也包含了描述属性的另外一些元素:<name>,<required>和<rtexprvalue>
12. 语法验证
(1) 最简单的语法验证是:
当JSP容器将一个JSP页面转化成Servlet时,它会将自定义行为元素和TLD中行为元素的规范进行比较。这样就可以验证语法上的错误。 |
|
出处:本站原创 作者:佚名 |
|
|