概述 |
<nobr>第 1 页(共4 页)</nobr> |
有时,可能希望根据一些特定于应用程序的显示逻辑有条件地调用方法的正文。可以通过从 doStartTag()
返回一个值做到这一点:SKIP_BODY
跳过标签的正文,而 EVAL_BODY
对它进行判断。
迭代标签需要实现 IterationTag
接口。容器调用 doAfterBody()
方法以确定是否要重新判断正文。这个方法返回 EVAL_BODY_AGAIN
时表明容器应当继续对正文进行判断。doAfterBody()
方法返回 SKIP_BODY
时表明迭代操作已经结束。TagSupport 类和 BodyTagSupport
类都实现了 IterationTag
接口。
回到 map 主题,在下面几小节我们将创建一个自定义标签处理程序,它迭代一组 map 并打印出它们的值。
控制流程序示例 |
<nobr>第 2 页(共4 页)</nobr> |
在开始实现自定义标签处理程序之前,让我们看看示例标签是如何使用的。首先,用上面的例子中的 map
标签定义两个 map:
<%@taglib uri="map" prefix="map"%> <map:map id="employee1"> { firstName=Jennifer, lastName=Wirth, age=33 } </map:map> <map:map id="employee2"> { firstName=Kiley, lastName=McKeon, age=27 } </map:map>
然后,创建一个名为 list
的集合,加入上面定义的两个 map (employee1
和 employee2
)。
<jsp:usebean id="list" class="java.util.ArrayList"></jsp:usebean> <% list.add(employee1); list.add(employee2); %>
下面展示了如何用自定义标签迭代这个集合:
<map:printmaps name="list"> </map:printmaps>First Name | ${firstName} |
Last Name | ${lastName} |
Age | ${age} |
map:printMaps
标签迭代 list
集合。 在每一次迭代时,它使用其正文,通过搜索以 ${key}
开始的子字符,在 map 中搜索当前迭代的键。它从字符串 ${}
中解析出键,并用从 map 得到的这个键的值(即 map.get(key)
)替换它。
实现 doStartTag() 方法 |
<nobr>第 3 页(共4 页)</nobr> |
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() 方法 | <nobr>第 4 页(共4 页)</nobr> |
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
查找以 ${
开始的字符串。 它还创建一个名为 buffer
的 StringBuffer
。 当它迭代 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
,那么它就会写到浏览器中。
结束语 |
<nobr>第 1 页(共3 页)</nobr> |
学 完本教程,您对自定义标签有了更深入的理解。如果您学完了本教程,即便是刚接触自定义标签,也应当可以开始在正在开发的项目中使用这种强大的工具了。您将 再也无法忍受在 JSP 页散布的那些难以维护和和不可重用的普通 Java scriptlet 了。即使不准备创建自已的自定义标签,本教程也会帮助您理解在由其他开发人员编写的代码中遇到的自定义标签。
参考资料 |
<nobr>第 2 页(共3 页)</nobr> |
分享到:
相关推荐
本实例将深入探讨如何实现一个简单的JSP自定义标签。 首先,自定义标签的实现主要依赖于两个核心概念:Tag接口和TagSupport类。`Tag`接口定义了自定义标签必须实现的方法,如`doStartTag()`和`doEndTag()`,它们...
本篇学习笔记将深入探讨JSP自定义标签的相关概念、创建方法以及实际应用。 一、概述 1.1 使用简单标签机制 JSP自定义标签提供了类似HTML标签的语法结构,通过自定义标签,开发者可以封装复杂的Java代码,使得页面...
jsp自定义标签jsp自定义标签jsp自定义标签jsp自定义标签
本教程将深入探讨JSP自定义标签的使用,同时结合实例介绍分页和下拉框绑定值的封装。 一、JSP自定义标签基础 1. **定义标签库(Tag Library)**:自定义标签首先需要定义一个TLD(Tag Library Descriptor)文件,它...
使用jsp自定义标签的功能实现权限的控制。(如果用户没有某个模块的删除权限,就不现实这个删除按钮) 在整个项目中所有的页面都可以引入自定义的标签去做到权限的控制。 自定义标签文件 删除 可以控制页面中的每...
在JSP自定义标签的例子中,我们可以看到这个压缩包文件可能包含了一个完整的示例项目,可以在Apache Tomcat这样的Servlet容器下直接运行。Apache Tomcat是一款开源的Servlet容器,广泛用于部署和运行Java Web应用...
本文将详细讲解如何利用JSP自定义标签库实现数据列表的显示,以及涉及到的相关技术。 首先,`UserListTag.java` 是自定义标签的核心类,它继承了`javax.servlet.jsp.tagext.TagSupport` 或 `javax.servlet.jsp....
在使用JSP自定义标签时,开发者可能会遇到一些报错问题,这通常涉及到项目结构、类路径设置或自定义标签的编译与打包方式。在本文中,我们将深入探讨这些问题,以及如何解决“JspException”这个特定异常。 首先,...
首先,我们要理解JSP自定义标签的概念。自定义标签是JSP的一种扩展机制,它允许开发者创建自己的标签库,以更加清晰和可维护的方式编写页面。自定义标签的实现通常涉及三个主要部分:标签库描述符(TLD)、标签处理...
本教程将深入探讨JSP自定义标签的实例与详细讲解。 一、JSP自定义标签概述 JSP自定义标签是类似于HTML标签的自定义组件,但它们提供了更强大的功能,可以封装Java代码,提供复杂的业务逻辑。自定义标签通过TLD(Tag...
本篇将深入探讨“JSP自定义标签之日期显示”,以及如何通过自定义标签来优雅地处理日期格式化和展示。 首先,我们要理解JSP自定义标签的基本概念。自定义标签是JSP的一种扩展,它不是Java内置的标签,而是由开发者...
本教程将深入探讨如何利用JSP自定义标签来编写一个灵活、可扩展的分页系统,该系统不依赖于特定的数据库,具有很高的通用性。 首先,理解JSP自定义标签的工作原理至关重要。自定义标签由三部分组成:标签库描述符...
在Java Server Pages (JSP) 2.0版本中,自定义标签和自定义标签函数极大地扩展了JSP开发的灵活性和可重用性。这些特性允许开发者创建可复用的组件,使代码更加清晰,易于维护。本文将深入探讨JSP 2.0中的自定义标签...
【jsp自定义标签库注意事项】 在Java服务器页面(JSP)开发中,自定义标签库是一种强大的工具,它能够帮助开发者创建可重用的代码片段,提高代码的可读性和可维护性。以下是对JSP自定义标签库的详细解释和使用注意...
一、JSP自定义标签基础 JSP自定义标签是JSP技术的一部分,它允许开发者创建自己的标签,以扩展HTML或XML文档。这些自定义标签可以封装复杂的Java代码,使JSP页面更加清晰,易于理解和维护。自定义标签由两部分组成:...
本资源“jsp自定义标签大全.rar”提供了一套全面的JSP自定义标签的实例和指南,旨在帮助开发者深入理解和应用这一特性。 **JSP自定义标签的基本概念** JSP自定义标签不同于标准动作标签(如<jsp:include>或<jsp:...
综上所述,“权威实用jsp自定义标签demo,checkbox,radio>”教程旨在帮助开发者掌握如何创建和使用与选择器相关的自定义标签,从而提升JSP开发的效率和质量。通过学习这个教程,你可以了解到自定义标签的核心概念、...
java jsp自定义标签非常好用大家下载学习java jsp自定义标签非常好用大家下载学习java jsp自定义标签非常好用大家下载学习java jsp自定义标签非常好用大家下载学习java jsp自定义标签非常好用大家下载学习java jsp...
首先,我们需要理解JSP自定义标签的基本结构。自定义标签通常由两部分组成:标签库描述符(TLD)和标签处理类。TLD文件定义了标签的名称、属性、行为等元数据,而标签处理类则实现了这些行为,处理由JSP页面传递过来的...
总结起来,"JSP自定义Table标签demo"是一个教育性的示例,它演示了如何利用JSP自定义标签的灵活性和强大功能,来创建复杂且可复用的组件,如动态表格。通过学习和理解这个demo,开发者可以提升自己的JSP开发能力,...