开发带Body的标签库

关于带有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]

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,进行调试任何看输出。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值