(1) 构思,比如写一个对指定名字说hello的标签,应该是<前缀:hello user="zhangsan"/>
(2) 写类
要实现的基础接口:javax.serlvet.jsp.tagext.SimpleTag
其中含有五个方法:
doTag ---> 实现标签的功能 .
setJspContext ---> pageContext .
setParent ---> 父标签的实现类
setJspBody ---> JspFragement
getParent
要实现五个方法,显得很繁琐,javax.servlet.jsp.tagext.SimpleTagSupport类实现了这个
基础接口,我们在写类时只需要继承这个类,然后覆盖doTag方法即可。
类如下:
package com.kettas.tag;
import javax.servlet.http.*;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloHandler extends SimpleTagSupport{
private String user;
public void setUser( String user ){
this.user = user;
}
public String getUser(){
return user;
}
@Override
public void doTag() throws JspException , IOException{
PageContext ctx = (PageContext)this.getJspContext();
ctx.getOut().println( "hello " + user );
ctx.getOut().flush();
}
}
(3) 写tld配置文件(位置为 : /WEB-INF/*.tld)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>2.0</jspversion>
<shortname>mytag</shortname>
<!-- 指定命名空间 引入标签时使用 -->
<uri>[email protected]</uri>
<tag>
<!-- 标签名 -->
<name>hello</name>
<!-- 标签对应的类 -->
<tag-class>com.kettas.tag.HelloHandler</tag-class>
<!-- 标签体之中是否含有内容 -->
<body-content>empty</body-content>
<!-- 标签属性 -->
<attribute>
<name>user</name>
<type>java.lang.String</type>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
(4) 在jsp文件中使用:
<%@page contentType="text/html"%>
<%-- 注意引入自定义标签的方式, prefix属性指定标签前缀, 前缀解决不同标签库标签重名 --%>
<%@taglib uri="[email protected]" prefix="liucy"%>
<html>
<body>
<h2>
<liucy:hello user="<%= request.getParameter( "name" )%>"/>
</h2>
</body>
</html>
自定义一个循环标签 :
类 : ===================================
package com.kettas.tag;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.io.*;
public class LoopHandler extends SimpleTagSupport{
private int begin;
private int end;
public void setBegin( int begin ){
this.begin = begin;
}
public int getBegin( ){
return begin;
}
public void setEnd(int end ){
this.end = end;
}
public int getEnd( ){
return end;
}
@Override
public void doTag()throws JspException ,IOException{
// JspFragment对象可以获取标签体内部的内容
JspFragment f = this.getJspBody();
PageContext ctx = (PageContext)this.getJspContext();
for( int i = begin ; i < end ; i++){
f.invoke( ctx.getOut() );
}
}
}
配置文件如下 :============================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>2.0</jspversion>
<shortname>mytag</shortname>
<uri>[email protected]</uri>
<tag>
<name>hello</name>
<tag-class>com.kettas.tag.HelloHandler</tag-class>
<body-content>empty</body-content>
<attribute>
<name>user</name>
<type>java.lang.String</type>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>loop</name>
<tag-class>com.kettas.tag.LoopHandler</tag-class>
<!-- 标签体内含有内容, 并且是非脚本的内容 -->
<body-content>scriptless</body-content>
<attribute>
<name>begin</name>
<type>int</type>
<required>true</required> <rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>end</name>
<type>int</type>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
使用如下 :=====================================
<%@taglib uri="[email protected]" prefix="liucy"%>
<liucy:loop begin="0" end="3">
<h2>Hello!</h2>
</liucy:loop>
如此便可连续在网页上输出三个"Hello !"