带标签体的标签

带标签体的标签,就是允许在标签内嵌套标签,通常可用于完成一些逻辑运算例如判断和循环等。

带标签体的标签需要继承 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<String> 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 JspTagException1/从 page范围中获取List 对象itemLiat=(List<String?pageContext.getAttribute(bean);//获取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 JspTagExceptiontry{//输出标签体内容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() throwsJspTagExceptiontry{//从 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: 对标签体循环处理。

将上面两个标签配置在标签库中,标签库的配置片段如下:

<!--配置法代器标签…〉<tag><!--配置标签名-><narne>iterator</narne><!--配置标签的实现类→〉<tag-class>rnytag.MylteratorTag</tag-class><!…配置标签的标签体内容--><body-content>JSP</body-content><!--配置 bean属性><attribute><narne>bean</narne><required>true</required><rtexprvalue>true</rtexprvalue></attribute><!--配置item属性一〉<attribute><narne>itern</narne><required>true</required><rtexprvalue>true</rtexprvalue></attribute></tag><!--配置输出标签-→<tag><!…配置标签名一〉<name>write</name><1--配置标签的实现类一〉<tag-class>mytag.WritorTag</tag-class><!-- 配置标签的标签体内容:只能是空标签--><body-content>empty</body-content><!--配置标签属性item--><attribute><name>item</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute></tag>

在 JSP 中嵌套使用两个标签的代码如下:
〈%//创建 List 对象List<String> a = new ArrayList<String>();a.add( "hello");a.add("world");a .add("java" );//将 List 放入 page 范围的属性 apageContext.setAttribute("a", a);%〉<!--元素放在表格中-><table border="l" bgcolor="dddd99"><!-- 使用迭代器标签,对List对象 a 进行迭代-><mytag:iteratorbea口::::lla"item:::: "item"><tr><td><!--输出 item属性的值二〉<mytag:write item="item"l><ltd></tr></mytag:iterator></table>


页面的执行效果如图2.30 所示。
  [img]http://new.51cto.com/files/uploadimg/20080825/115640952.jpg
[/img]图 2.30 迭代器标签
注意:本示例的迭代器仅对 page 范围的 List 进行迭代,用法有所局限。读者可以将其扩展,增加一个属性,指定迭代搜索的范围,并可将迭代的目标不局限于List,而是Collection,甚至包括数组。大部分的框架如 Struts、 WebWork都包含了自己的迭代器标签。

你可能感兴趣的:(bean,jsp,框架,struts,Webwork)