Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29951171
  • 博文数量: 708
  • 博客积分: 12163
  • 博客等级: 上将
  • 技术积分: 8240
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-04 20:59
文章分类

全部博文(708)

分类: Java

2008-12-15 10:59:39

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

带标签体的标签需要继承 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

empty

itemtrue
true

在 JSP 中嵌套使用两个标签的代码如下:
〈%
//创建 List 对象
List a = new ArrayList();a.add
( "hello");a.add("world");a .add("java" );
//将 List 放入 page 范围的属性 a
pageContext.setAttribute("a", a);
%〉
阅读(1831) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~