(转)掌握jsp自定义标签:(六)

原创 2004年07月30日 23:33:00
概述 第 1 页(共4 页)


有时,可能希望根据一些特定于应用程序的显示逻辑有条件地调用方法的正文。可以通过从 doStartTag() 返回一个值做到这一点:SKIP_BODY 跳过标签的正文,而 EVAL_BODY 对它进行判断。

迭代标签需要实现 IterationTag 接口。容器调用 doAfterBody() 方法以确定是否要重新判断正文。这个方法返回 EVAL_BODY_AGAIN 时表明容器应当继续对正文进行判断。doAfterBody() 方法返回 SKIP_BODY 时表明迭代操作已经结束。TagSupport 类和 BodyTagSupport 类都实现了 IterationTag 接口。

回到 map 主题,在下面几小节我们将创建一个自定义标签处理程序,它迭代一组 map 并打印出它们的值。

控制流程序示例 第 2 页(共4 页)


在开始实现自定义标签处理程序之前,让我们看看示例标签是如何使用的。首先,用上面的例子中的 map 标签定义两个 map:

 <%@taglib uri="map" prefix="map"%>   <?xml:namespace prefix = map /> { firstName=Jennifer, lastName=Wirth, age=33 }  { firstName=Kiley, lastName=McKeon, age=27 }  

然后,创建一个名为 list 的集合,加入上面定义的两个 map (employee1employee2)。

 <?xml:namespace prefix = jsp /> <% list.add(employee1); list.add(employee2); %>  

下面展示了如何用自定义标签迭代这个集合:

 
First Name${firstName} Last Name ${lastName} Age${age}

map:printMaps 标签迭代 list 集合。 在每一次迭代时,它使用其正文,通过搜索以 ${key} 开始的子字符,在 map 中搜索当前迭代的键。它从字符串 ${} 中解析出键,并用从 map 得到的这个键的值(即 map.get(key))替换它。

实现 doStartTag() 方法 第 3 页(共4 页)


doStartTag() 方法从范围中抓取集合,然后从集合中抓取迭代器。 如果迭代器中没有任何项(iter.hasNext()),那么 doStartTag() 方法就返回 SKIP_BODY,从而实现了逻辑 if。在这种情况下,这个 if 等同于“如果集合为空,则跳过正文判断”。 然后迭代器从集合中抓取第一个 map。

 public class MapPrintMapsTag extends BodyTagSupport { private String name; private Iterator iter; private Map map; private String scope; public int doStartTag() throws JspException { Collection collection = null; /* Grab the collection out of scope using the scope attribute. */ if (scope == null){ collection = (Collection) pageContext.findAttribute(name); }else if("page".equalsIgnoreCase(scope)){ collection = (Collection) pageContext.getAttribute(name); }else if("request".equalsIgnoreCase(scope)){ collection = (Collection) pageContext.getRequest().getAttribute(name); }else if("session".equalsIgnoreCase(scope)){ collection = (Collection) pageContext.getSession().getAttribute(name); }else if("application".equalsIgnoreCase(scope)){ collection = (Collection) pageContext.getServletContext().getAttribute(name); } /* Get the iterator from the collection. */ iter = collection.iterator(); /* If the collection is empty skip the body evaluation. */ if (iter.hasNext()==false) return SKIP_BODY; /* Grab the first map out of the collection. */ map = (Map)iter.next(); return EVAL_BODY_BUFFERED; } 
实现 doAfterBody() 方法第 4 页(共4 页)

doAfterBody() 通过在没有可迭代的项时返回 SKIP_BODY 实现了迭代。如果还有项,那么它就返回 EVAL_BODY_AGAIN。只要 doAfterBody() 返回 EVAL_BODY_AGAIN,容器就会继续对正文进行判断,如下所示:

 public int doAfterBody() throws JspException { /** Process body */ ... /** Write the processed buffer to the previous out */ ... if (iter.hasNext() == false) { return SKIP_BODY; } else { map = (Map) iter.next(); return EVAL_BODY_AGAIN; } }  

doAfterBody() 方法用 getBodyContent() 抓取正文,然后用正文内容的 getString() 方法得到字符串形式的内容。 下一步它清除正文内容缓冲区,用 StringTokenizer 查找以 ${ 开始的字符串。 它还创建一个名为 bufferStringBuffer。 当它迭代 tokenizer 中的字符串时,将它们附加到缓冲区中。

如果 tokenizer 中的字符串以 ${, doAfterBody() 开始,那么它就从字符串中提取键,并用这个键在 map 中查找值。它调用值对象的 toString() 方法将 map 中的值转换为字符串,并将结果附加到缓冲区中。下面的清单展示了这个过程是如何进行的。

 /** Process body */ /* Get and clear the body */ BodyContent body = this.getBodyContent(); String content = body.getString(); body.clearBody(); /* Process the body with a String tokenizer */ StringTokenizer token = new StringTokenizer(content); /* Create an output buffer of the processed body */ StringBuffer buffer = new StringBuffer(content.length() * 2); /* Iterate over the strings from the tokenizer and put them into the output buffer. */ while (token.hasMoreTokens()) { String tok = token.nextToken(); /* See if the String contains the special substring "${" */ if (tok.startsWith("${")) { /* Parse the key out of the string */ String key = tok.substring(2, tok.length() - 1); /* Use the key to look up the object in the map */ Object value = (String) map.get(key); String svalue = tok; /* If the value is not null, get the value's string representation */ if (value != null) { svalue = value.toString(); } /* Add the string representation of the value to the output buffer */ buffer.append(svalue + " "); } else { buffer.append(tok + " "); } }  

doAfterBody() 方法在构建了输出缓冲区后,就将它输出到前面的 out 中,如下所示:

 try { this.getPreviousOut().print(buffer.toString()); } catch (IOException e) { throw new JspException(e); }  

这样,每一次迭代都处理正文并将它输出到前面的 out 中。如果前面的 out 是根 JspWriter,那么它就会写到浏览器中。

实现jsp自定义标签

如何在jsp页面中写自定义标签 这里我要实现一个自定义标签的小例子,我把用户名存在cookie中,在登录界面我要从cookie中取出用户名 一.创建和使用一个tag library的基本步骤: 1...
  • sheng_xinjun
  • sheng_xinjun
  • 2016年11月15日 17:42
  • 584

三个标签案例:帮你深入学习JSP自定义标签

三个标签案例:帮你深入学习JSP自定义标签
  • wangyang1354
  • wangyang1354
  • 2013年10月01日 22:54
  • 1998

JSP:自定义标签的详细说明

l自定义标签主要用于移除Jsp页面中的java代码。 还能加入一些控制逻辑       •控制jsp页面某一部分内容是否执行。       •控制整个jsp页面是否执行。       •控制jsp页...
  • xxssyyyyssxx
  • xxssyyyyssxx
  • 2015年11月25日 08:32
  • 1602

JSP的自定义标签(五)之Tag File

Tag File 是自定义标签的简化用法,使用TagFile可以无须定义标签库和标签文件,但仍然可以在JSP页面中使用自定义标签。 1.1建立Tag文件 学习Tag File需要子解Tag File扔...
  • owen_william
  • owen_william
  • 2016年02月18日 23:08
  • 1316

JSP自定义标签由浅到深详细讲解(全)

一、基本概念 1.标签(Tag):   标签是一种XML元素,通过标签可以使JSP网页变得简洁并且易于维护,还可以方便地实现同一个JSP文件支持多种语言版本。由于标签是XML元素,所以它的...
  • sinat_29581293
  • sinat_29581293
  • 2016年07月18日 10:40
  • 4106

jsp自定义标签实现分页

jsp自定义标签分页
  • dfdsggdgg
  • dfdsggdgg
  • 2016年05月24日 18:22
  • 2714

Jsp 自定义tag标签

Jsp自定义tag标签自定义tag标签的好处程序员可以自定一些特定功能的标记, 用来封装代码, 达到分工, 重用性等多种好处.如何存放tag标签通常在web工程WEB-INF文件夹下创建tags文件夹...
  • yusimiao
  • yusimiao
  • 2015年07月10日 22:15
  • 3724

jsp自定义标签及简单实例

1.引言 本文将介绍JSP标签的一些基本概念以及如何开发及使用自定义标签。带领大家迈上Java Web开发的又一新台阶. 2.什么是自定义标签 2.1.用户自定义的Java语言元素,实质是运...
  • longwei000
  • longwei000
  • 2016年03月24日 11:40
  • 867

JSP自定义标签开发(七)—— xx.tld标签开发之权限管理标签开发

以前将 xx.tld 类的自定义标签开发看得很神秘,
  • xueshandugu
  • xueshandugu
  • 2014年08月22日 09:22
  • 1860

JSP自定义简单标签入门之带有属性

上面写的那个简单标签来控制页面中标签内容的重复次数是固定的,这就是权限“写死了”,这是非常不好的行为,因为其灵活性太差。所以下面就介绍一种使用属性来控制标签内容输出次数的方法。准备工作 创建实现了Si...
  • Marksinoberg
  • Marksinoberg
  • 2016年01月29日 15:57
  • 7888
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(转)掌握jsp自定义标签:(六)
举报原因:
原因补充:

(最多只允许输入30个字)