如果要实现自定义标签,那么需要如下几步:
编写标签处理类
需要继承或者实现相关的类或者接口
编写标签描述文件
该文件是一个XML文件,而且必须放在网站的WEB-INF目录中
在JSP中引入标签且使用
使用taglib指令引入标签库,随后使用。
自定标签的类体系
详细了解下一下几个类和接口:
---| JspTag接口
该接口是一个典型的标记接口。主要标记实现该接口的类可以处理标签。Seralizable
----| Tag接口
该接口主要描述的是标签处理类的共性,但是实现该接口的类不能处理标签体,该接口中定义了标签处理类和JSP页面之间的通信协议。而且提供生命周期方法如:在标签开始和接结束的时候自动执行的方法。
------| TagSupport类
主要负责处理标签的属性。
-------| BodyTagSupport类
该类主要的是处理标签的标签体。
体验
1. 处理类
public class HelloHanler implements Tag {private PageContext pageContext = null;// 标签结束的时候执行public int doEndTag() throws JspException {return 0;}// 标签开始的时候执行public int doStartTag() throws JspException {// 给页面输出一个hello信息JspWriter out = pageContext.getOut();// 输出信息String info = "hello custom tag";try {out.write(info);} catch (IOException e) {e.printStackTrace();}return 0;}// 获取其父标签public Tag getParent() {return null;}// 释放public void release() {}// 设置jsp上下文对象public void setPageContext(PageContext pc) {this.pageContext = pc;}// 设置父标签public void setParent(Tag t) {}}2. 描述文件
<?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"> <!-- 2. 编写标签库描述文件 --><tlib-version>1.0</tlib-version> <short-name>jnb</short-name><tag> <name>hello</name><tag-class>cn.itcast.test.HelloHanler</tag-class><body-content>empty</body-content> </tag></taglib>3. 引入
<%@taglib uri="/WEB-INF/test.tld" prefix="jnb"%> <br/><jnb:hello/>JSP1.2进行自定义标签开发
public class ShowDate extends TagSupport {// 为了便于获取属性,那么直接在处理类中定义和属性同名的属性变量即可且提供get和set方法private String pattern;public String getPattern() {return pattern;}public void setPattern(String pattern) {this.pattern = pattern;}// 标签开始的时候自动执行public int doStartTag() throws JspException {// 创建日期对象Date date = new Date();// 创建格式化对象SimpleDateFormat format = new SimpleDateFormat(getPattern());// 格式化String str = format.format(date);// 获取JSP上下文对象PageContext pageContext = this.pageContext;// 获取JSP的OUT输出流JspWriter out = pageContext.getOut();// 输出try {out.write(str);} catch (IOException e) {e.printStackTrace();}return super.doStartTag();}}2. 描述文件
<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"> <!-- 2. 编写标签库描述文件 --><tlib-version>1.0</tlib-version> 指定标签库的版本(必须) <short-name>jnb</short-name> 指定标签库的简称(必须) <tag> 指定一个标签开始<name>showdate</name> 标签名<tag-class>cn.itcast.custom.ShowDate</tag-class> 指定标签处理类<body-content>empty</body-content> 指定标签体,JSP(有)empty(没有)<attribute> 描述属性<name>pattern</name> 属性名<required>true</required> 属性的说明信息<rtexprvalue>true</rtexprvalue> 属性值的说明信息</attribute> </tag></taglib>3. 引入和使用
<%@taglib uri="/WEB-INF/date.tld" prefix="date"%> <date:showdate pattern="yyyy年MM月dd日 a E"/>实现带标签体的自定义标签
public class ShowDateByBody extends BodyTagSupport {// 为了便于获取属性,那么直接在处理类中定义和属性同名的属性变量即可且提供get和set方法private String pattern;public String getPattern() {return pattern;}public void setPattern(String pattern) {this.pattern = pattern;}// 标签开始的时候自动执行public int doStartTag() throws JspException {// 创建日期对象Date date = new Date();// 创建格式化对象SimpleDateFormat format = new SimpleDateFormat(getPattern());// 格式化String str = format.format(date);// 获取JSP上下文对象PageContext pageContext = this.pageContext;// 获取JSP的OUT输出流JspWriter out = pageContext.getOut();// 获取标签提的内容BodyContent body = this.getBodyContent();String tag_body = body.getString();str = "<font color="red">"+tag_body+"</font>"+str;// 输出try {out.write(str);} catch (IOException e) {e.printStackTrace();}return super.doStartTag();}}2. 描述文件
<tag> <name>showdate2</name><tag-class>cn.itcast.custom.ShowDateByBody</tag-class><body-content>JSP</body-content><attribute><name>pattern</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute> </tag>3. 引入和使用