JSP自定义标签(tag)、如何使用自定义标签库、几种典型的标签、标签库接口和类的继承关系(第三天)
JSP自定义标签(tag)
什么是自定义标签?
1,用户自定义的Java语言元素, 实质是运行一个或者两个接口的JavaBean;
2,可以非常紧密地和JSP的表示逻辑联系在一起,又具有和普通JavaBean相同的业务逻辑处理能力;
3,当一个JSP页面转变为servlet时,其间的用户自定义标签转化为操作一个称为标签hander的对象;
4,可操作默认对象,处理表单数据,访问数据库以及其它企业服务;
自定义标签库的特点
1,通过调用页面传递参数实现定制;
2,访问所有对JSP页面可能的对象;
3,修改调用页面生成的响应;
4,自定义标签间可相互通信;
5,在同一个JSP页面中通过标签嵌套,可实现复杂交互。
如何使用自定义标签库
1,声明标签库
2,使标签库执行对Web应用程序可用
声明标签库
1,使用taglib指令声明标签库
2,语法:<%@taglib uri="URI" prefix="pre" %>
注意:a. uri属性可以是绝对的,也可以是相对URL,该URL指向标记库描述符(TLD)文件;?????
????? b. uri属性也可以是一个并不存在的URL,该URL为web.xml文件中将标记库描述符(TLD)文件的绝对
URL到本地系统的一个映射;
3,范例:<%@taglib uri="/WEB-INF/template.tld" prefix="test" %>??????????????
???????? <%@taglib uri="http://java.sun.com/jstl/core" prefix="core" %>??????
使标签库执行可用
方式一:在WEB-INF/classes目录下部署标记处理程序类;
方式二:将标记处理程序类打包成jar文件并置于WEB-INF/lib目录。
几种典型的标签
1,不带属性和主体的简单标签:<mytaglibs:SomeTag/>;
2,不带主体但有属性的标签:<mytaglibs:SomeTag user="TonyDeng"/>;
3,带有主体和属性的标签:
???????? <mytaglibs:SomeTag user="TonyDeng">????????????????????????? ?????????????????????????????????????
????????????????? ...// 标签体??????????????????? ??????????????
???????? </mytaglibs:SomeTag>;
注意:a. 属性列于start tag中,它是在标记库描述符(TLD)文件中指定,服务于标记库的自定义行为;???????
????? b. 标签体位于start tag和end tag间,可以是任何合法的JSP内容或者标签;
定义标签
1,开发实现tag的类(tag handler);
2,编辑标记库描述符(TLD)文件;
3,在web.xml中为标记库描述符(TLD)文件的绝对URL建立一个映射(该步骤可选);
标记库描述符(TLD)文件
1,一个描述标记库的XML文件;
2,内容开始是整个库的描述,然后是tag的描述;
3,标记库描述符(TLD)文件用于Web Container确认tag以及JSP页面发展工具;
实现tag的类(标签处理器)(tag handler)
1,是一些在引用了标签的JSP页面执行期间被Web Container调用以求自定义标签值的对象;
2,必须实现Tag, SimpleTag和BodyTag之一;
3,可以继承TagSupport和BodyTagSupport之一。
标签库的接口和类的继承关系接口的继承关系:??????
☉ interface javax.servlet.jsp.tagext.JspTag?????? ???
??????? ☉ interface javax.servlet.jsp.tagext.SimpleTag????????????
??????? ☉ interface javax.servlet.jsp.tagext.Tag????????????
?????? ??????? ☉ interface javax.servlet.jsp.tagext.IterationTag????????????
?????? ??????? ☉ interface javax.servlet.jsp.tagext.BodyTag
类的继承关系:??????
???????? ☉ class javax.servlet.jsp.tagext.TagSupport
????????? (implements javax.servlet.jsp.tagext.IterationTag, java.io.Serializable)??????????
??????????????? ☉ class javax.servlet.jsp.tagext.BodyTagSupport
???????????????? (implements javax.servlet.jsp.tagext.BodyTag)???????
???????? ☉ class javax.servlet.jsp.tagext.SimpleTagSupport
??????????? (implements javax.servlet.jsp.tagext.SimpleTag)
????????????????? (Interface)???????????????????
??????????????????? ?JspTag?????????????????????
??????????????????????? |?????????????????????????????
??????????????? |ˉˉˉˉˉˉˉˉ|???? ????????
?????????? (Interface)???? ?(Interface)JSP2.0????????????
?????????????? Tag?????????? SimpleTag ←--SimpleTagSupport???????? ?????
??????????????? |?????????? ???????????????????????????????
??????????????? |????????????
?? ?????????(Interface) ??????????
?????????? IterationTag←--TagSupport
?????????? 支持迭代的标签???????? |
?????????????? ?|???????????????? |??????????
??????? ????????|???????????????? |???
??????????? (Interface)?????????? |???????????????
???????????? BodyTag ←---BodyTagSupport
??????????? 可以处理标签体
自定义标签的开发步骤
1,写标签处理器,也就是一个符合自定义标签规范的类 xxx.java
2,写标签库定义文件,也就是定义标签的格式规范,也要符合自定义标签的规范 xxx.tld
3,建上述两步中的相应文件进行部署。web.xml
tld文件中的配置
? <tag>
??? <name>loop</name>
??? <tag-class>com.tag.LoopTag</tag-class>
??? <body-content>jsp</body-content>
??? <!--设定自定义标签体内的内容,可以置为empty,也就是只能写空标签-->
??? <attribute>
????? <name>counter</name><!--配置自定义标签的属性名-->
????? <required>true</required><!--配置属性是否必须出现-->
????? <rtexprvalue>true</rtexprvalue><!--允许使用表达式作为属性的值-->
????? <type>int<type><!--配置属性的类型-->
????? </attribute>
? </tag>
简单的标签处理程序类
1,必须实现Tag接口的doStartTag()和doEndTag()方法;
2,因为不存在Body,doStartTag()方法必须返回SKIP_BODY;
3,如其余页面要执行,doEndTag()方法返回EVAL_PAGE, 否则返回SKIP_PAGE;
4,对于每一个标签属性,你必须在标签处理程序类里定义一个特性以及get和set方法以一致于JavaBeans?? 体系惯例
带Body的自定义标签
1,必须实现Tag接口的doStartTag()和doEndTag()方法;
2,可以实现IterationTag接口的doAfterBody()方法;
3,可以实现BodyTag接口的doInitBody和setBodyContent方法;
4,doStartTag方法可以返回SKIP_BODY、EVAL_BODY_INCLUDE、或者EVAL_BODY_BUFFERED(当你想使用???? BodyContent);
5,doEndTag方法可以返回SKIP_PAGE或EVAL_PAGE;
6,doAfterBody方法可以返回EVAL_BODY_AGAIN, SKIP_BODY;
定义脚本变量的标签(迭代标签)
1,定义脚本标签的二个步骤:??
?? . 在标记库描述符(TLD)文件中列明脚本变量;??
?? . 定义标签扩展信息类(TEI)并且在TLD文件中包括这个类元素(tei-class);
2,变量必须在标签处理程序类中使用pageContext.setAttribute()方法设置;
3,标签扩展信息类(TEI)