带标签体的标签,就是允许在标签内嵌套标签,通常可用于完成一些逻辑运算例如判断和循环等。
带标签体的标签需要继承 BodyTagSupport,该类包含一个 bodyContent 属性,该属性代表标签体。
BodyTagSupport还包含两个方法。
doAfterBodyO: 每次处理完标签体后调用该方法。
void doInitBodyO: 开始调用标签体时调用该方法。
如果有必要,可以重写这两个方法。
下面以一个迭代器标签为示例,介绍如何开发一个带标签体的标签,该标签体包含两个属性: bean 和 item, bean 属性代表 page 范围内的一个List; 而 item代表List 中的每个元素。标签的源代码如下:
public classMyiteratorTagextends BodyTagSupport //标签需要送代的集合对象名 private String bean; //集合对象的元素 private String item; //集合的当前索引 private int i = 0; privateint size; prl飞rate Li st itemList; Ilbea口属性的 setter方法 public void setBean (String s) bean = s; Ilbean属性的 getter方法 public StringgetBea口() return bean; Ilitem属性的 setter方法 pUblic void setltem (String s) itern=s; Ilitem属性的 getter方法 publicStringgetItem () { return item; //开始处理标签时,调用该方法。 public int doStartTag() throws JspTagException 1/从 page范围中获取List 对象 itemLiat=(List//获取List 的长度 size = itemList.size(); //将集合当前索引的值放在page范围的itern变量中 pageContext.setAttribute(item,itemList.get(i); //返回值为EVAL_BODY_BUFFERED.表明需要计算标签体 return EVAL_BODY_BUFFERED; //每次标签体处理完后调用该方法 public int doAfterBody() throws JspException //移动 List 对象的索引位置 i++; 1/如果索引己经超过了集合的长度 if (i >= size) 1/将索引回零 i =0; 1/不再计算标签体,直接调用doEndTag方法 return SKIP_BODY; //将集合的当前元素值放入page 范围的 item属性中 pageContext.setAttribute(item , itemList.get(i?); //循环计算标签体 return EVAL_BODY_AGAIN; 1/标签体结束时调用该方法 public int doEndTag() throws JspTagException try { //输出标签体内容 bodyContent.writeOut(pageContext.getOut(?); } catch (IOException ex) { throw new JspTagException( "错误"); return EVAL_PAGE;
下面是一个嵌套在该标签内的带属性的标签,该标签的功能非常简单,仅仅从page范围中获取属性,然后在页面上输出该属性值。其代码如下:
public class WritorTag extends TagSupport ( Ilitem属性,该标签从page 中查找 item的属性,并输出属性值 private String item; Ilitem的 setter方法 public void setltern (String s) { item=s; Ilitern的 getter方法 public Stringgetitern() return itern; //开始处理标签时的调用该方法 public int doStartTag() throwsJspTagException try { //从 page 范围内搜索 item 的属性, pageContext.getOut() .write((String)pageContext.getAttribute(item)); catch (IOException ex) throw new JspTagException("错误//) ; //返回 EVAL_PAGE. 继续计算页面输出。 return EVAL_PAGE;
在处理标签类的各个方法中,不同的返回值对应不同的含义,常用的返回值有如下几个。
SKIP_BODY: 不处理标签体,直接调用 doEndTagO方法。
SKIP_PAGE: 忽略标签后面的 JSP 页面。
EVAL_PAGE: 处理标签结束,直接处理页面内容。
EVAL_BODY_BUFFERED: 处理标签体。
EVAL_BODY_INCLUDE: 处理标签体,但忽略 setBodyContentO和 doInitBodyO方法。
EVAL_BODY_AGAIN: 对标签体循环处理。
将上面两个标签配置在标签库中,标签库的配置片段如下:
在 JSP 中嵌套使用两个标签的代码如下:
〈% //创建 List 对象 List a = new ArrayList();a.add ( "hello");a.add("world");a .add("java" ); //将 List 放入 page 范围的属性 a pageContext.setAttribute("a", a); %〉
阅读(1873) | 评论(0) | 转发(0) |