这里只是自定义了一个没有不处理标签体的简单标签。jsp中的标签都是对应一个标签类。
首先继承TagSupport类,这个类实现了Tag接口和IterationTag接口,基本属于Adapter模式的设计。
TagSupport类提供了doStartTag(),doEndTag(),第一个是遇到标签体执行,后面一个是标签体结束执行。
public class BlogTag extends TagSupport{
/**
*自定义一个简单标签,继承TagSupport类
*/
//声明两个变量,用于标签接收的属性
private Timestamp date;
private String formatstr;
private static final long serialVersionUID = 1L;
@Override
//doStartTag方法在遇到标签体的时候执行,返回值决定是否执行本身标签体和后面的jsp内容
public int doStartTag() throws JspException {
//设置一个request域变量
pageContext.getRequest().setAttribute(formatstr,DateFormat.getInstance().format(date));
//返回变量决定标签体执行步骤。
return Tag.EVAL_BODY_INCLUDE;
}
///设置要提供set方法,不然标签体不能设置属性。
public void setDate(Timestamp date) throws JspException
{
this.date=date;
}
public void setFormatstr(String formatstr)
{
this.formatstr=formatstr;
}
}
doStartTag()方法返回值有,
EVAL_BODY_INCLUDE与SKIP_BODY,前者是显示标签体中的内容,后者是跳过标签中的内容。
doEndTag(0方法返回值有 EVAL_PAGE与SKIP_PAGE,第一个是继续执行余下的jsp页面,后者是跳过余下的jsp页面。
定义了一个标签类以后,还要进行tld文件配置和在web.xml中引用。
tld文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--标签配置信息包含在taglib中-->
<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>JSTL 1.1 core blog</description><!--标签体描述 -->
<display-name>blogformat</display-name><!--标签体默认名称-->
<tlib-version>1.1</tlib-version><!--版本号-->
<short-name>f</short-name><!--短名称,用来在jsp页面中引用标签的简写-->
<!-- 自定义一个uti -->
<uri>http://blog</uri>
<!--标签体-->
<tag>
<description>
format java.sql.Timestamp to loacl
</description>
<name>format</name><!--标签名称-->
<tag-class>org.blog.server.tag.BlogTag
</tag-class><!--标签对应的处理类-->
<body-content>JSP</body-content><!--标签体内容,通常有设置empty或jsp-->
<attribute><!--标签属性,可以有多个-->
<description>
java.sql.Timestamp object
</description>
<name>date</name><!--属性名称 -->
<required>false</required><!--值表示属性是否是必须,true表示是必须属性-->
<rtexprvalue>true</rtexprvalue><!--该参数表示属性是否可以使用el表达式获取-->
<type>java.sql.Timestamp</type><!--定义参数的类型-->
</attribute>
<attribute><!--属性2-->
<description>
format string
</description>
<name>formatstr</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<type>String</type>
</attribute>
</tag>
</taglib>
web.xml中定义
<jsp-config>
<taglib>
<taglib-uri>http://blog</taglib-uri><!-- 标签库uri,用来引用声明 -->
<taglib-location>/WEB-INF/blogtlds/blogtag.tld</taglib-location><!--标签库tld文件实际地址 -->
</taglib>
</jsp-config>