定制标记库
1 编写标记处理类
public class TimerTag extends TagSupport{
private long start;
private long end;
public int doStartTag(){ //doStartTag标记开始方法
start=System.currentTimeMillis();
return EVAL_BODY_INCLUDE;//
}
public int doEndTag() throws JspTagException {//doEndTag标记结束方法
end=System.currentTimeMillis();
long elapsed=end-start;
try{
JspWriter out=pageContext.getOut();
out.println("running time:"+elapsed+"ms.");
}catch(IOException e){
throw new JspTagException(e);
}
return EVAL_PAGE;//
}
}
2 编写.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/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>custion web utility tags</description> //对当前标记库的描述
<tlib-version>1.0</tlib-version> //当前标记库的版本
<short-name>util</short-name> //对当前标记库使用时的前缀名称
<uri>http://163.com</uri> //可任意
<tag>
<description>calc code running time</description> //对当前标记的描述
<name>timer</name> //标记我名称
<tag-class>com.tags.TimerTag</tag-class> 当前标记对应的处理类的具体名称
<body-content>JSP</body-content> //可有empty,JSP
</tag>
</taglib>
3 使用格式
jsp页面
<%@ taglib prefix="util" uri="http://163.com" %> 添加指令
<util:timer></util:timer>
总结:
TLD是一个XML文件,在WEB-INF目录下
<taglib>根元素
<tlib-version>version</tlib-version>标记库的版本
<short-name>prefix</short-name>前缀名称
<uri>uri</uri>引用的地址
...
<tag>
<name>tagname</name>标记名称
<tag-class>classname</tag-class>标记对应的处理类
<tei-class>classname</tei-class>标记处理类的辅助处理类
<body-content>[JSP,empty,scriptless,tagdependent]</body-content>
//jsp表示标记中可以包含html,java代码,这些代码可以被运行
//empty表示标记中不包含内容
//scriptless表示标记中可以包含EL,jsp的动作代码,不可以包括JAVA脚本代码
//tagdependent表示标记中可以包含
<attribute>标记的属性
<name>pattern</name>属性的名称
<required>false</required>表示该属性是否是必须的
<rtexprvalue>false</rtexprvalue>该属性是否可以是JSP的表达式
</attribute>
</tag>
</taglib>
TagSupport运行原理(不能对标记所包含的内容进行二次加工)
BodyTagSupport运行原理(可以对开始和结束标记所包含的内容进行处理)
public int doAfterBody()throws JspTagException{
BodyContent bc=getBodyContent();取内容
String input=bc.getString();取内容
JspWriter out=bc.getEnclosingWriter();
String newContent=input;
try{
out.println(newContent);
}catch(IOException e){
throw new JspTagException(e);
}
return 1;
}