从jsp1.1开始就可以在jsp页面中使用自定义标签了,使用自定义标签不但可以实现代码重用,而且可以使jsp代码更简洁。Jsp2.0的标签扩展API中又增加了SimpleTag接口和其实现类SimpleTagSupport。
标签扩展API层次结构:
实例: 编写一个tag按格式输出时间:
1.CommonTag.java
package com.example.tag;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import com.mysql.jdbc.StringUtils;
public class CommonTag extends SimpleTagSupport{
private String format;
private String date;
@Override
public void doTag() throws JspException, java.io.IOException{
if(StringUtils.isNullOrEmpty(format))
format="yyyy-MM-dd";
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date now = new Date();
if(!StringUtils.isNullOrEmpty(date))
{
try {
DateFormat df = DateFormat.getDateInstance();
now = df.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
}
PageContext pc = (PageContext)getJspContext();
JspWriter out = pc.getOut();
out.write(sdf.format(now));
}
public void setFormat(String format) {
this.format = format;
}
public void setDate(String date) {
this.date = date;
}
}
2.commonTag.tld 放到WEB-INF目录下
<?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"> <tlib-version>1.1</tlib-version> <short-name>commontag</short-name> <uri>http://www.example.com/mytag</uri> <tag> <name>date</name> <tag-class>com.example.tag.CommonTag</tag-class> <body-content>empty</body-content> <attribute> <name>date</name> <required>false</required> </attribute> <attribute> <name>format</name> <required>false</required> </attribute> </tag> </taglib>
<注> tld中的一些属性:
body-content
此标签的主体部分的内容。其值可为 JSP\scriptless\tagdependent\empty,默认为empty.
attribute -> rtexprvalue
表示属性是否可以接受一个jsp表达式<%= %>的值,默认false
attribute -> type
当rtexprvalue为true时,指定JSP表达式放回的类型,默认String。
3. 在JSP中使用Tag
<%@taglib prefix="commontag" uri="http://www.example.com/mytag"%> ... <commontag:date date="2017-02-8" format="yyyy/MM/dd"/>
TagSupport 执行逻辑:
BodyTagSupport的执行逻辑:
标记库打包
1. 先把class文件和tld文件按如下路径组织好:
tag文件夹
|
|--------class 文件
|--------META-INF文件夹
|
|------------tld文件
2. 进入tag文件夹 所在目录,执行命令 jar -cvf mytag.jar *
3. 使用时只需将mytag.jar 复制到WEB-INF/lib 目录下
常用开源JSP tag 库
--JSTL
--Display tag