1、tld文件的查找
tld标签的模板,可以从tomcat的example工程中找到,如apache-tomcat-8.0.37\webapps\examples\WEB-INF\jsp2\jsp2-example-taglib.tld
tld文件的位置,需要放到WEB-INF目录下,或者子目录。
2、tag标签配置
body-content有如下几种选项
tagdependent:指定标签处理类自己负责处理标签体
empty:指定该标签只能作为空标签使用
scriptless:指定该标签体可以是静态html元素、表达式语言,但不允许出现jsp脚本
dynamic-attributes:指定该标签是否支持动态属性。只有当定义动态属性标签时才需要该子元素。
attribute标签的fragment,设置true表示该属性支持JSP脚本,false表示不支持。
带属性的标签,需要为每一个属性提供get和set方法
关于uri的写法问题,可以任意,只要跟tld文件定义的相对应即可。
自定义处理类,可以继承javax.servlet.jsp.tagext.SimpleTagSupport,也可以继承javax.servlet.jsp.tagext.TagSupport,两者重写的方法不一样,针对SimpleTagSupport重写doTag(),针对TagSupport,可以针对doStartTag()或者doStartEnd()进行自定义。
自定义标签生命周期
简单自定义标签的生命周期顺序为:① 创建自定义标签的实例对象 —> ② setJspContext方法 —> ③ setJspBody方法(如果有标签体才调用) —> ④ setParent方法(如果有父类自定义标签才调用)—> ⑤ doTag方法 —> ⑥ 该自定义标签的实例对象将被垃圾回收器回收(与传统自定义标签不同,简单标签的标签处理器类对象不会缓存)。
3、示例
普通的标签,直接加载渲染html内容
package com.hbk.test;
import java.io.IOException;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* 自定义标签
* @author 黄宝康
* 2019年8月2日 上午9:29:32
*/
public class MyTag extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
getJspContext().getOut().print("黄宝康,你好"+new Date());
}
}
<?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>黄宝康自定义JSP标签</description>
<tlib-version>1.0</tlib-version>
<short-name>我的第一个标签</short-name>
<uri>http://hbk.com/mytag</uri>
<tag>
<description>输出我的名字加时间</description>
<name>hbk</name>
<tag-class>com.hbk.test.MyTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="mytag" uri="http://hbk.com/mytag"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>自定义标签学习</title>
</head>
<body>
<mytag:hbk/>
</body>
</html>
带属性的标签
package com.hbk.test;
import java.io.IOException;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* 自定义标签
* @author 黄宝康
* 2019年8月2日 上午9:29:32
*/
public class MyTag extends SimpleTagSupport {
private String color;// 给时间加颜色
private String author;// 显示作者信息
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public void doTag() throws JspException, IOException {
getJspContext().getOut().print("<span>"+author+",你好</span><span style=\"color:"+color+"\">"+new Date()+"</span>");
}
}
<?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>黄宝康自定义JSP标签</description>
<tlib-version>1.0</tlib-version>
<short-name>我的第一个标签</short-name>
<uri>http://hbk.com/mytag</uri>
<tag>
<description>输出我的名字加时间</description>
<name>hbk</name>
<tag-class>com.hbk.test.MyTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>color</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<attribute>
<name>author</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
</tag>
</taglib>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="mytag" uri="http://hbk.com/mytag"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>自定义标签学习</title>
</head>
<body>
<mytag:hbk author="黄宝康" color="blue"/>
</body>
</html>