实际工程中往往需要多个标签来配合完成一定的功能,嵌套的标签存在父子关系,其中,父为外层标签,子为内层标签。本实例将用两个简单的标签来演示,父标签则作出逻辑判断,如果isOutput属性为true,则输出实例108中的标签helloTag;如果为false,则不输出。
(1)第一步:开发标签实现类。
内层的标签helloTag在实例108中已有,此处不再列出。
haveChildTag.java
package hello;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class haveChildTag extends BodyTagSupport {
private boolean isOutput;//是否输出子标签内容
//----标签开始时调用此方法-------
public int doStartTag(){
if(isOutput)
return EVAL_BODY_INCLUDE;
else return SKIP_BODY;
}
//----标签结束时调用此方法-------
public int doEndTag(){
try{
if(bodyContent!=null)
bodyContent.writeOut(bodyContent.getEnclosingWriter());
}catch(Exception e){
System.out.println(e);
}
return EVAL_PAGE;
}
public boolean getIsOutput() {
return isOutput;
}
public void setIsOutput(boolean isOutput) {
this.isOutput = isOutput;
}
}
(2)第二步:编写标签描述tld文件。
本例在myTag.tld文件中增加内容。在<taglib>与</taglib>之间增加的如下内容:
<!-- haveChildTag-->
<tag>
<!-- 标签名称-->
<name>haveChildTag</name>
<!-- 标签对应的处理类-->
<tag-class>hello.haveChildTag</tag-class>
<!-- 标签体内容,有标签体则设为jsp-->
<body-content>jsp</body-content>
<!-- 标签的属性声明-->
<attribute>
<name>isOutput</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
(3)第三步:在Web应用的web.xml文件中声明标签库引用。
同样,本例与本章前面的实例使用同一个tld文件,此处不必再修改。
(4)第四步:在JSP页面中声明并调用标签。
useHaveChildTag.jsp
<%@ taglib uri="/myTag" prefix="myTag" %>
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="java.util.Date" %>
<html>
<head>
<title>开发嵌套的标签</title>
</head>
<body>
输出子标签时的结果:<br>
<myTag:haveChildTag isOutput="true">
<myTag:helloTag/>
</myTag:haveChildTag><br>
不输出子标签时的结果:<br>
<myTag:haveChildTag isOutput="false">
<myTag:helloTag/>
</myTag:haveChildTag><br>
</body>
</html>