自定义标签
自定义标签主要用于移除JSP页面中的Java代码。
一般自定义标签实现的目的:
1. 控制JSP页面中某一部分内容是否执行
2. 控制整个JSP页面是否执行
3. 控制JSP页面内容重复执行
4. 修改JSP页面的输出
实现概述
- 编写一个实现Tag接口的Java类,把页面中的java代码移到这个java类中。(这个类应该叫标签处理器类)
别写一个标签库描述符(tld)文件,在tld文件把标签处理器类描述成一个标签。
使用时引入标签库即可
传统标签 与 简单标签
根据标签处理器类实现标签接口的不同,将自定义的标签分为传统标签和简单标签。
传统标签:实现Tag。
简单标签: 实现SimpleTag。
传统标签
继承Tag的默认实现类TagSupport
一般我们会重写doStartTag()方法,即将java代码放在这个方法中。
TagSpport类还有的几个方法有 setPageContxt()、setParent()、doEndTag()等方法
传统标签的运行原理:
1. 遇到自定义标签,首先实例化标签对应的标签处理器类。
2. 调用setPageContext()方法,将页面的pageContext对象传递给标签处理器类
3. 查看标签是否有父标签,如果有父标签,则把父标签作为一个对象,调用setParent()方法传递给自定义标签对象(开始实例化的)。
4. 完成以上初始化工作,服务器开始执行标签,遇到开始标签就调用doStartTag()方法
5. 如果有标签体的话,一般会执行标签体
6. 遇到结束标签,调用doEndTag()方法。
7. 整个标签执行完毕后,服务器会调用doRelease()方法
简单标签
继承SimpleTag的默认实现类SimpleTagSupport
- 简单标签中一般我们重写doTag()方法,即将java代码放在这个方法中。
SimpleTagSupport类的几个其他方法为: getParent(), setParent()、setJspBody()、setJspContext()。
方法的调用过程为: setJspContext() –> setParent() –> setJspBody() –> doTag()
- 在标签库描述符(tld)文件描述标签
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/jsee/web-jsptagLibrary_2_0.xsd"
version="2.0">
<tlib-version>1.2</tlib-version>
<uri>simpleTags</uri>
<tag>
<name>simple1</name>
<description>xxxxxxxx</description>
<tag-class>foo.SimpleTagTest1</tag-class>
<body-content>empty</body-content> // -> <body-content>scriptless</body-content>
</tag>
</taglib>
使用简单标签实现一些功能
NT: 以下功能的实现都是在doTag()方法中执行的。
- 控制标签体是否执行
JspFrament jf = this.getJspBody(); //得到代表标签体的对象
jf.invoke(this.getJspContext().getOut()); //将标签体写给浏览器, 即标签体执行
//在这里 如果什么都不写,就什么都不输出, 即标签体不执行
//jf.invoke(null); —> 也是执行标签(只不过,默认将标签内容写给浏览器) 迭代标签体
for(int i = 0; i < 5; i++)
{
jf.invoke(null); //控制标签体执行5次
}修改标签体
StringWriter sw = new StringWriter(); //带缓冲的Writer
jf.inovke(sw); //写到缓冲
String content = sw.toString(); //获取标签体内容
/* 修改内容 …..*/
this.getJspContext().getOut().write(content); //手动写给浏览器- 控制余下的JSP代码不执行
throw new SkipPageException(); //抛出这个异常
开发带属性的标签
步骤:
1. 在标签处理器中编写每个属性对应的set方法
2. 在tld文件中描述标签的属性、
<tag>
<attribute>
<name>count</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue> //如果是true的话,可以使用EL表达式赋值
<type>Integer</type> //这样会检查传入的参数是否正确。
</attribute>
<tag>
打包标签库
第一步:准备工作
1.创建一个目录:例如tag-libraries
2.在tag-libraries下创建另外一个目录:META-INF(必须的)
3.将你编写的“.tld”文件放入“META-INF”目录中,返回tag-libraries
4.将你的class文件带包放入此目录中:例如com.cheng.……
第二步:打包成jar
1.运行cmd,输入命令:jar cvf my-taglib.jar META-INF com
(在eclipse中 直接javaProject-> import -> JarFile)
第三步:加入的web工程中的lib文件夹中
第四步:jsp页面上引用