这里只是自定义了一个没有不处理标签体的简单标签。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>
<jsp-config> <taglib> <taglib-uri>http://blog</taglib-uri><!-- 标签库uri,用来引用声明 --> <taglib-location>/WEB-INF/blogtlds/blogtag.tld</taglib-location><!--标签库tld文件实际地址 --> </taglib> </jsp-config>