在jsp编译阶段,遇到了自定义标签就会自动执行doStartTag();
本文主要讲解传统方式的自定义标签使用的步骤:
1.创建一个后缀名为.tld的文本文件,将它复制到web-inf里面。
<?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/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>迭代器标签</description>
<tlib-version>1.0</tlib-version>
<short-name>tag</short-name><!--简称 -->
<uri>http://www.luzelong.com</uri>
<!-- 自定义标签的相关信息 -->
<tag>
<description>标签描述</description>
<name>hhl</name>
<tag-class>com.luze.tag.MyIteration</tag-class>
<body-content>JSP</body-content>
<!--给处理类加属性-->
<attribute>
<name>n</name>
<required>true</required><!--true表示该属性必写-->
</attribute>
</tag>
注意tag-class 属性写的是他的实现类,就是下面的我们要创建的类!
2.创建一个继承javax.servlet.jsp.tagext.TagSupport的类。
package com.luzelong.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
public class MyIteration extends TagSupport {
private int n;//执行次数
public void setNum(int n){
this.n = n ;
}
//执行标签时
@Override
public int doStartTag() throws JspException {
return EVAL_BODY_INCLUDE;//先执行一次
}
//执行完毕后
@Override
public int doAfterBody() throws JspException {
n--;
return n>0?EVAL_BODY_AGAIN:SKIP_BODY;//当n>0 重复执行 SKIP_BODY 是不执行
}
}
3.jsp文件前面加上下面代码,构成连接
<%@ taglib uri="http://www.luze.com" prefix="lzl" %>
4.具体使用
<body>
<lzl:hhl n="3">love </lzl:hhl>
</body>
执行结果为love love love
上面是继承TagSupport类的写法,如果想在标签体被显示前,进行一些其他的“额外”操作(比如:转大小写)就要要继承BodyTagSupport类。
该类揽括了前面的所有方法。要使用该类就要导入tomcat自带的jasper.jar这个包。
提示:导入该jar包的方法是在idea上方导航栏的run->edit Configurations->tomcat->server->Application server->configure…->最下面的+号->lib里面找。
1.配置.tld
<tag>
<name>myToUpperCase</name>
<tag-class>com.luzelong.tag.ToUpperCase</tag-class>
<body-content>JSP</body-content>
</tag>
2.实现类
package com.luzelong.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class ToUpperCase extends BodyTagSupport {
//第一步 高数程序 我们要将原来的hellow变成大写,即将doStartTag()的返回值设置成 EVAL_BODY_BUFFER(此步骤已在父类默认设置)
//第二步,获取,并修改
@Override
public int doEndTag() throws JspException {
try {
String content = getBodyContent().getString();
content = content.toUpperCase();
bodyContent.getEnclosingWriter().write(content);
}catch (Exception e){
e.printStackTrace();
}
return super.doEndTag();
}
}
3.验证
<%@ taglib prefix="wc" uri="http://www.luzelong.com" %>
<lzl:myToUpperCase>hellow </lzl:myToUpperCase>
输出结果:HELLOW