在实际的开发中,往往需要多个标签嵌套以完成一个任务,这样的标签就存在父子关系。我们可以开发出和流程控制相关的标签,例如:
在上面的标签中,<mt:switch>为父标签,<mt:case>为子标签,一个父标签可以嵌套多个子标签和HTML,Scriptlets。
具体代码如下:
Value为IfTag的属性。当Value为true时,那么就计算IfTagBody;如果Value的值为false;那么忽略IfTagBody中的Tag。
在这个例子中,IfTag标签中嵌套了一个子标签,这个子标签用于输出一些信息到客户端,下面在看IfTag中嵌套的子标签,例如:
OutTag就是一个简单的不带Body的标签,它主要向客户端输出一些信息。下面需要更新标签描述文件,加入以下内容。
接下来编写一个使用嵌套标签的JSP。例如
<mt:switch value="test">
<mt:case value="test1">
my value is test1
</mt:case>
<mt:case value="test">
my valie is test
</mt:case>
</mt:switch>
在上面的标签中,<mt:switch>为父标签,<mt:case>为子标签,一个父标签可以嵌套多个子标签和HTML,Scriptlets。
具体代码如下:
package com.test.ch14
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.util.Hashtable;
import java.io.Writer;
import java.io.IOException;
public class IfTag extends BodyTagSupport
{
private boolean value;
public void setValue(boolean value){
this.value = value;
}
/**
*doStartTag方法,如果value为true,那么就计算TagBody的值,否则不计算
*/
public int doStartTag() throws JspTagException{
if(value)
{
System.out.println("value is true");
return EVAL_BODY_INCLUDE;
}else{
System.out.println("value is false");
return SKIP_BODY;
}
}
//覆盖doEndTag方法
public int doEndTag() throws JspTagException
{
try{
if(bodyContent != null){
bodyContent.writeOut(bodyContent.getEnclosingWriter());
}
}catch(java.io.IOException e){
throw new JspTagException("IO Error:" +e.getMessage());
}
return EVAL_PAGE;
}
}
Value为IfTag的属性。当Value为true时,那么就计算IfTagBody;如果Value的值为false;那么忽略IfTagBody中的Tag。
在这个例子中,IfTag标签中嵌套了一个子标签,这个子标签用于输出一些信息到客户端,下面在看IfTag中嵌套的子标签,例如:
package com.test.ch14;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.util.Hashtable;
import java.io.Writer;
import java.io.IOException;
public class OutTag extends TagSupport
{
private Object value;
//覆盖doStartTag方法
public void setValue(Object value){
this.value = value;
}
public int doStartTag() throws JspTagException{
return EVAL_BODY_INCLUDE;
}
//覆盖doEndTag方法
public int doEndTag() throws JspTagException
{
try{
System.out.println(value);
pageContext.getOut().write(value.toString());
}catch(IOException ex){
throw new JspTagException("Fatal error: hello tag conld not write to JSP out");
}
return EVAL_PAGE;
}
}
OutTag就是一个简单的不带Body的标签,它主要向客户端输出一些信息。下面需要更新标签描述文件,加入以下内容。
<tag>
<name>if</name>
<tag-class>com.test.ch14</tag-class>
<body-content>jsp</body-content>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>out</name>
<tag-class>com.test.ch14.OutTag</tag-class>
<body-content>jsp</body-content>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
接下来编写一个使用嵌套标签的JSP。例如
<%@ taglib uri="/demotag" prefix="mt"%>
<html>
<head>
<title>vcorwork tag</title>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
</head>
<body>
<HR>
协作标签<br>
<%
boolean test = true;
String outValue = "HelloWorld"
%>
<mt:if value="<%=test%>">
<mt:out value="<%= outValue%>">
这是mt:out....>打印出的内容。
</mt:out>
</mt:if>
<HR>
<mt:if value="fale">
<mt:out value="<%=outValue%>">
这些内容不会显示在客户端。
</mt:out>
</mt:if>
</body>
</html>