构成一个自己定义的标签需要3个步骤:
首先、一个标签的处理类
这个处理类需要继承SimpleTagSupport这个类,重写doTag方法
例子:
public class SimplePrimeTag extends SimpleTagSupport {
protected int length = 50;
public void doTag() throws JspException, IOException {
JspWriter out = getJspContext().getOut();
BigInteger prime =
Primes.nextPrime(Primes.random(length));
out.print(prime);
}
}
其次、一个标签库描述文件
这是一个以TLD结尾的文件
例子:
<?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.0</tlib-version>
<short-name>csajsp-taglib</short-name>
13
<tag>
<description>Outputs 50-digit primes</description>
<name>simplePrime</name>
<tag-class>coreservlets.tags.SimplePrimeTag</tag-class>
<body-content>empty</body-content>
</tag>
...
</taglib>
最后、在jsp页面中使用
例子:
<BODY>
<H1>Some 50-Digit Primes</H1>
<%@ taglib uri="/WEB-INF/tlds/csajsp-taglib.tld"
prefix="csajsp" %>
<UL>
<LI><csajsp:simplePrime/>
<LI><csajsp:simplePrime/>
<LI><csajsp:simplePrime/>
<LI><csajsp:simplePrime/>
</UL>
</BODY>
</HTML>
下面写一个带有自己属性的标签
首先、标签处理类
注意这个类继承了上面写的那个处理类SimplePrimeTag
package coreservlets.tags;
public class PrimeTag extends SimplePrimeTag {
public void setLength(String length) {
try {
this.length = Integer.parseInt(length);
} catch(NumberFormatException nfe) {
this.length = 50;
}
}
}
其次、TLD表述文件
<taglib ...>
...
<tag>
<description>Outputs an N-digit prime</description>
<name>prime</name>
<tag-class>coreservlets.tags.PrimeTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>length</name>
<required>false</required>
</attribute>
</tag>
...
</taglib>
最后、在jsp页面中使用
...
<BODY>
<H1>Some N-Digit Primes</H1>
<%@ taglib uri="/WEB-INF/tlds/csajsp-taglib.tld"
prefix="csajsp" %>
<UL>
<LI>20-digit: <csajsp:prime length="20"/>
<LI>40-digit: <csajsp:prime length="40"/>
<LI>80-digit: <csajsp:prime length="80"/>
<LI>Default (50-digit): <csajsp:prime/>
</UL>
</BODY>
</HTML>
一个带有标签体的jsp标签
处理类中需要有
public void doTag() throws ... {
JspWriter out = getJspContext().getOut();
out.print("...");
getJspBody().invoke(null);//这句话是打印标签体里面的内容
out.print("...");
}
TLD文件:
body-content里的不再是empty,注意比如标签体里是一个el表达式:如果不做修改原封不动的打印就用scriptless,如果想打印表达式的值需要用到tagdependent
<tag>
<name>…</name>
<tag-class>…</tag-class>
<body-content>scriptless</body-content>
</tag>