关于带有Body标签的开发。另外,标签中可以从JSP中传入参数,下面给个案例瞅瞅!
带有Body的Tag必须实现javax.servlet.jsp.tagext.BodyTag接口,BodyTag接口中定义了一些处理标签体的方法。下面给出BodyTag的处理过程:
1. 当容器创建一个新的标签实例后,通过setPageContext设置标签的页面的上下文。
2. 使用setParent方法设置这个标签的上一级标签。如果没有上一级嵌套,设置为null。
3. 设置标签的属性,这个属性在标签库描述文件中定义。如果没有定义属性,就不调用此类方法
4. 调用doStartTag方法,这个方法可以返回EVAL_BODY_INCLUDE和SKIP_BODY。当返回EVAL_BODY_INCLUDE时,就计算标签的Body;如果返回SKIP_BODY,就不再计算标签的Body
5. 调用setBodyContent设置当前的BodyContext。
6. 调用doInitBody.如果在计算BodyContent时,需要进行一些初始化,就在这个方法中进行
7. 每次计算完BodyTag后调用doAfterBody。如果返回EVAL_BODY_TAG,表示继续计算一次BodyTag,直到返回SKIP_BODY才继续执行步骤8
8. 调用doEndTag方法,这个方法可以返回EVAL_PAGE或者SKIP_PAGE。当返回EVAL_PAGE时,容器将在标签结束时继续计算JSP页面的其他部分;如果返回SKIP_PAGE容器将在标签结束时停止计算JSP页面的其他部分。
9. 调用release()方法释放标签程序占用的任何资源。
[b]代码显示[/b]
[b]BodyTagExamplt的标签描述如下[/b]
[b]注意:[/b]1. Body-Content必须是jsp
2. counts为此标签的属性,它和BodyTagExample中定义的属性"int counts"必须一样。并且BodyTagExample中必须有setCounts(int counts)方法,否则这个属性就不能设置。
3.<required>表示这个属性是必需的。
[b]测试页面代码[/b]
OK,进行调试任何看输出。
带有Body的Tag必须实现javax.servlet.jsp.tagext.BodyTag接口,BodyTag接口中定义了一些处理标签体的方法。下面给出BodyTag的处理过程:
1. 当容器创建一个新的标签实例后,通过setPageContext设置标签的页面的上下文。
2. 使用setParent方法设置这个标签的上一级标签。如果没有上一级嵌套,设置为null。
3. 设置标签的属性,这个属性在标签库描述文件中定义。如果没有定义属性,就不调用此类方法
4. 调用doStartTag方法,这个方法可以返回EVAL_BODY_INCLUDE和SKIP_BODY。当返回EVAL_BODY_INCLUDE时,就计算标签的Body;如果返回SKIP_BODY,就不再计算标签的Body
5. 调用setBodyContent设置当前的BodyContext。
6. 调用doInitBody.如果在计算BodyContent时,需要进行一些初始化,就在这个方法中进行
7. 每次计算完BodyTag后调用doAfterBody。如果返回EVAL_BODY_TAG,表示继续计算一次BodyTag,直到返回SKIP_BODY才继续执行步骤8
8. 调用doEndTag方法,这个方法可以返回EVAL_PAGE或者SKIP_PAGE。当返回EVAL_PAGE时,容器将在标签结束时继续计算JSP页面的其他部分;如果返回SKIP_PAGE容器将在标签结束时停止计算JSP页面的其他部分。
9. 调用release()方法释放标签程序占用的任何资源。
[b]代码显示[/b]
package com.test.ch14;
...//imports
public class BodyTagExample extends BodyTagSupport
{
int counts;// counts 为迭代的次数
public BodyTagExample(){
super();
}
/** 设置count属性,这个方法由容器自动调用*/
public void setCount(int c){
this.counts = c;
}
/** 覆盖doStartTag方法*/
public int doStartTag()throws JspTagException{
System.out.println("doStartTag");
if(counts > 0){
return EVAL_BODY_TAG;
}else{
retrun SKIP_BODY;
}
}
/** 覆盖doAfterBody方法*/
public int doAfterBody() throws JspTagException{
System.out.println("doAfterBody"+counts);
if(counts > 0){
counts --;
return EVAL_BODY_TAG;
}else{
return SKIP_BODY;
}
}
/** 覆盖doEndTag方法*/
public int doEndTag()throws JspTagException{
System.out.println("doEndTag");
try{
if(bodyContent != null){
bodyContent.writeOut(bodyContent.getEnclosingWriter());
}
}catch(java.io.IOException e){
throw new JspTagException("IOError:" +e.getMessage());
}
return EVAL_PAGE;
}
public void doInitBody() throws JspTagException{
System.out.println("doInitBody");
}
public void setBodyContent(BodyContent bodyContent){
System.out.println("setBodyContent");
this.bodyContent = bodyContent;
}
}
[b]BodyTagExamplt的标签描述如下[/b]
<tag>
<name>loop</name>
<tag-class>com.test.ch14.BodyTagExample</tag-class>
<body-content>jsp</body-content>
<attribute>
<name>counts</name>
<required>true</required>
<rtexprvalue>true</rtexprvale>
</attribute>
</tag>
[b]注意:[/b]1. Body-Content必须是jsp
2. counts为此标签的属性,它和BodyTagExample中定义的属性"int counts"必须一样。并且BodyTagExample中必须有setCounts(int counts)方法,否则这个属性就不能设置。
3.<required>表示这个属性是必需的。
[b]测试页面代码[/b]
<%@ taglib uri="demotag" prefix="bodytag"%>
<html>
<head>
<title>Test body Tag</title>
<meta http-equiv="Content-Type" context="text/html;charset=gb2312">
</head>
<body>
<HR>
<bodytag: loop counts="5">
现在的时间是:<%= new java.util.Date()%><BR>
</bodytag: loop>
</HR>
</body>
</html>
OK,进行调试任何看输出。