步骤如下:
1、写tld文档:用来指定标签的名字,标签库等。
2、写标签处理器类。
3、配置到web.xml中
4、在jsp中使用新定义的标签
例:实现一个自定义标签 功能如下 如果字符串长度超过规定长,则截取,并根据要求添加省略号
tls文档:
1.0 2.0 ip http://www.xx.tag stringCut com.xx.utils.jstl.JSTLStringCut str false true java.lang.String 輸入字符串 length true true java.lang.Integer 要显示字符串的长度 showDot true true java.lang.Boolean 是否显示点号
标签处理器类:
package com.xx.utils.jstl;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class JSTLStringCut extends BodyTagSupport{
private String str ;
private Integer length ;
private Boolean showDot;
@Override
public int doStartTag() throws JspException {
System.out.println(str);
System.out.println(length);
System.out.println(showDot);
try {
if(str==null){
//do nothing
}else{
if(str.length()>length){
str=str.substring(0,length);
if(showDot){
str=str+"...";
}
}
pageContext.getOut().print(str);
}
} catch (IOException e) {
e.printStackTrace();
}
return BodyTagSupport.EVAL_BODY_INCLUDE;//执行标签内容
}
@Override
public int doEndTag() throws JspException {
return BodyTagSupport.EVAL_BODY_INCLUDE;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public Integer getLength() {
return length;
}
public void setLength(Integer length) {
this.length = length;
}
public Boolean getShowDot() {
return showDot;
}
public void setShowDot(Boolean showDot) {
this.showDot = showDot;
}
}
配置到web.xml
http://www.xx.tag /WEB-INF/tags/string-cut.tld
jsp中使用标签
jsp页面顶部加入:
<%@ taglib uri="http://www.xx.tag" prefix="ip" %>
more>>
以下部分转自:http://oyprunner.iteye.com/blog/539494
EVAL_BODY_INCLUDE:把Body读入存在的输出流中,doStartTag()函数可用
EVAL_PAGE:继续处理页面,doEndTag()函数可用
SKIP_BODY:忽略对Body的处理,doStartTag()和doAfterBody()函数可用
SKIP_PAGE:忽略对余下页面的处理,doEndTag()函数可用
EVAL_BODY_TAG:已经废止,由EVAL_BODY_BUFFERED取代
EVAL_BODY_BUFFERED:申请缓冲区,由setBodyContent()函数得到的BodyContent对象来处理tag的body,如果类实现了BodyTag,那么doStartTag()可用,否则非法
BodyTagSupport类的方法:
编写标签对应的实现类时,需要重载BodyTagSupport类几个方法:doStartTag(), setBodyContent(), doInitBody(), doAfterBody(), doEndTag();
他们执行顺序如下:
doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag()
doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY,
如果返回EVAL_BODY_INCLUDE则继续执行;
如果返回SKIP_BODY则接下来的doInitBody(),setBodyContent(), doAfterBody()三个方法不会被执行,
而直接执行doEndTag()方法。
setBodyContent()方法用于设置标签体内容,如果在此之前要作一些初始化工作,则在doInitBody()方法中完成。
标签体内容执行完后,会调用doAfterBody()方法,此方法可返回EVAL_BODY_TAG, SKIP_BODY,
EVAL_PAGE或SKIP_PAGE。
如果返回EVAL_BODY_TAG则会再次设置标签体内容,直到返回SKIP_BODY;
如果返回EVAL_PAGE则标签体执行完后会继续执行JSP页面中接下来的部分;
如果返回SKIP_PAGE,则JSP页面的后续内容将不再执行。
标签中静态常量:
EVAL_BODY_INCLUDE:告诉服务器正文的内容,并把这些内容送入输出流
SKIP_BODY:告诉服务器不要处理正文内容
EVAL_PAGE:让服务器继续执行页面
SKIP_PAGE:让服务器不要处理剩余的页面
EVAL_BODY_AGAIN:让服务器继续处理正文内容,只有doAfterBody方法可以返回
EVAL_BODY_BUFFERED:BodyTag接口的字段,在doStartTag()返回
EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回,而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回。