上一篇我们讨论了自定义标签,也通过实现Tag接口完成了一个简单的空标签实例。本篇我们首先再通过一个实例实现一个带属性标签。该实例实现一个<max>标签,用于计算两个数的最大值。在此就不再赘述项目建立的过程,如果有问题请参考前面内容。直接贴上代码,主要代码如下:
编写MaxTag.java
package com.shan.tag;
import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class MaxTag extends TagSupport {
private int numberA;
private int numberB;
public void setNumberA(int numberA) {
this.numberA = numberA;
}
public void setNumberB(int numberB) {
this.numberB = numberB;
}
public int doEndTag() throws JspException {
//利用pageContext对象的getOut()方法得到JspWriter对象
JspWriter out = pageContext.getOut();
try {
out.println(numberA > numberB ? numberA : numberB);
} catch(IOException e) {
System.out.println(e.toString());
}
return EVAL_PAGE;
}
public void release() {
}
}
运行语句编译
javac -classpath D:\apache-tomcat-7.0.33\lib\jsp-api.jar;classes -d classes src\com\shan\tag\MaxTag.java
在TLD中配置<max>标签
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>mytag</short-name>
<display-name>MyTag</display-name>
<description>My Tag library.</description>
<tag>
<name>max</name>
<tag-class>com.shan.tag.MaxTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>numberA</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>numberB</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
配置web.xml文件
<?xml version='1.0' encoding='utf-8'?>
<web-app 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-app_3_0.xsd"
version="3.0"
metadata-complete="true">
<jsp-config>
<taglib>
<taglib-uri>/mytag</taglib-uri>
<taglib-location>/WEB-INF/MyTaglib.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
编写测试页面
<%@ page contentType="text/html;charset=gb2312" %>
<%@ taglib uri="/mytag" prefix="mytag"%>
<%
int numberA = Integer.parseInt(request.getParameter("numberA"));
int numberB = Integer.parseInt(request.getParameter("numberB"));
out.println(numberA);
out.println(numberB);
%>
最大值为:<mytag:max numberA="<%=numberA %>" numberB="<%=numberB %>" />
在浏览器网址栏输入http://localhost:8080/MaxTag/test.jsp?numberA=24&numberB=96,运行结果如下:
我们实现SimpleTag接口的标签称之为简单标签,实现其他接口或类的称之为传统标签。传统标签开发中,需要根据标签的功能来选择所要实现的接口或要继承的类,还要考虑方法的返回值。为了简化标签的开发,我们使用简单标签来实现想要的功能。
SimpleTag接口
实现SimpleTag接口的标签处理器的生命周期如下:
1)容器创建标签处理器实例后,调用setJspContext()方法设置JspContext。如果该标签没被嵌套,则不会调用setParent()方法,如果被嵌套,调用setParent()方法设置它的父标签。在此和传统标签处理不同,传统标签无论标签是否嵌套,都会调用setParent()方法。
2)调用标签处理器的setXXX()方法,设置标签属性,如果没有属性,则跳过。
3)如果存在标签体,调用setJspBody(),设置标签体,如果没有标签体,则跳过。
4)容器调用doTag()方法,在这个方法中,完成标签处理器的主要逻辑。
注意,简单标签的标签处理器并不会被缓存而重复使用,每当遇到一个标签时,容器就会创建一个标签处理器实例,这和传统标签处理器不一样。
为了简化标签的开发,javax.servlet.jsp.tagext包中还提供了SimpleTag接口的实现类SimpleTagSupport。开发时,只需继承该类,然后重写doTag()方法即可。
在此我们就不再举实例了。如果有兴趣可以参照之前传统标签的开发编写程序实现简单标签的开发。