自定义标签的步骤:
1、确定需求,如:用<my:date/>输出当前时间
2、编写Java类:需要实现实现接口javax.servlet.jsp.tagext.JspTag
具体的接口为:
javax.servlet.jsp.tagext.SimpleTag,简单标签,JSP2.0**
javax.servlet.jsp.tagext.Tag,经典标签
3、编写tdl文件(xml)
Demo:
public class MyTag implements SimpleTag { private PageContext pageContext;
public void setJspContext(JspContext pc) { this.pageContext=(PageContext) pc;//设置pageContext
} public void doTag() throws JspException, IOException { SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss:SSS");
String date=format.format(new Date());
pageContext.getOut().print(date);//输出到页面
} public JspTag getParent() {
// TODO Auto-generated method stub
return null;
} public void setJspBody(JspFragment arg0) {
// TODO Auto-generated method stub }
<?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"> <!-- 确定当前标签库的版本 -->
<tlib-version>1.0</tlib-version>
<short-name>my</short-name> <!-- 建议引入当前便签库是,使用的简写-->
<uri>http://www.cnblogs.com/liuwt365/mytag</uri> <!-- 为当前标签库配置文件,起一个名称 * 内容:自定义,全球唯一 --> <tag>
<name>date</name> <!-- 确定标签名称 -->
<tag-class>cn.test.simpleTag.MyTag</tag-class> <!-- 确定实现类 -->
<body-content>empty</body-content> <!-- 格式化当前标签的body内容-->
</tag> </taglib>
<%@ taglib uri="http://www.cnblogs.com/liuwt365/mytag" prefix="my" %> <!-- 页面注册 --> <my:date/>
PS:如果标签中含有属性,则tdl中需要设置:<my:maxValue num1="13" num2="15"></my:maxValue>
<tag>
<name>max</name>
<tag-class>cn.test.simpleTag.MyMaxTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>num1</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Integer</type>
</attribute> <attribute>//设置属性
<name>num2</name>//属性名
<required>true</required>//是否必须 true|false (yes|no)(非必须)
<rtexprvalue>true</rtexprvalue> //runtime expression value 运行时表达式
<type>java.lang.Integer</type> //类型(非必须)
</attribute>
</tag>
如果含有标签体,tdl中设置如下:<my:toUpper>JUHjdksds</my:toUpper>
<tag>
<name>toUpper</name>
<tag-class>cn.test.simpleTag.MyToUpperTag</tag-class>
<body-content>scriptless</body-content> <!-- 确定标签体的类型
* empty:没有标签体
* JSP:支持JSP所有的语法,在Tag中使用
* scriptless:对于JSP页面的脚本不支持 <%%>
* tagdependent:标签体不做处理,原样输出
--> </tag>
如果含有标签体 ,java类中的
public void setJspBody(JspFragment jf) {
this.jspFragment=jf; //获取
}
向jsp页面输出时
StringWriter stringWriter=new StringWriter();//获得流 this.jspFragment.invoke(stringWriter);//将数据写入到流中
String data=stringWriter.toString().toUpperCase(); this.pageContext.getOut().print(data);
this.jspFragment.invoke(pageContext.getOut())=this.jspFragment.invoke();