1)控制标签体内容是否输出
2)控制标签余下内容是否输出
3)控制重复输出标签体内容
4)改变标签体内容
5)带属性的标签
package com.loaderman.demo.a_tag;import java.io.IOException; import java.io.StringWriter;import javax.servlet.jsp.JspException; import javax.servlet.jsp.SkipPageException; import javax.servlet.jsp.tagext.JspFragment; import javax.servlet.jsp.tagext.SimpleTagSupport; /*** 标签处理器类* @author APPle**/ public class DemoTag extends SimpleTagSupport{//1.声明属性的成员变量private Integer num;//2.关键点: 必须提供公开的setter方法,用于给属性赋值public void setNum(Integer num) {this.num = num;}@Overridepublic void doTag() throws JspException, IOException {System.out.println("执行了标签");/*** 1)控制标签内容是否输出* 输出: 调用jspFrament.invoke();* 不输出: 不调用jspFrament.invoke();*///1.1 得到标签体内容JspFragment jspBody = this.getJspBody();/*** 执行invoke方法: 把标签体内容输出到指定的Writer对象中*///1.2 往浏览器输出内容,writer为null就是默认往浏览器输出//JspWriter out = this.getJspContext().getOut();//jspBody.invoke(out);jspBody.invoke(null);//等价于上面的代码/*** 3)控制重复输出标签体内容* 方法: 执行多次jspBody.invoke()方法*//*for(int i=1;i<=num;i++){jspBody.invoke(null);}*//*** 4)改变标签体内容*///4.1 创建StringWriter临时容器/*StringWriter sw = new StringWriter();//4.2 把标签体拷贝到临时容器jspBody.invoke(sw);//4.3 从临时容器中得到标签体内容String content = sw.toString();//4.4 改变内容content = content.toLowerCase();//System.out.println(content);//4.5 把改变的内容输出到浏览器//jspBody.invoke(null); 不能使用此方式输出,因为jsbBody没有改变过this.getJspContext().getOut().write(content);*//*** 2)控制标签余下内容是否输出* 输出: 什么都不干!* 不输出: 抛出SkipPageException异常*/throw new SkipPageException();} }
loaderman.tld文件
<?xml version="1.0" encoding="UTF-8" ?><taglib xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"version="2.1"><!-- 标签库的版本 --><tlib-version>1.1</tlib-version><!-- 标签库前缀 --><short-name>loaderman</short-name><!-- tld文件的唯一标记 --><uri>http://loaderman.cn</uri><tag><name>demoTag</name><tag-class>com.loaderman.demo.a_tag.DemoTag</tag-class><body-content>scriptless</body-content><!-- 属性声明 --><attribute><!-- 属性名称 --><name>num</name><!-- 是否必填 --><required>true</required><!-- 是否支持EL表达式 --><rtexprvalue>false</rtexprvalue></attribute></tag></taglib>