logic:Iterator标签(以下简称“该标签”)是Struts里非常常用的一个标签,其作用在于循环显示给定容器对象中的值
如此常用的标签,其源代码当然需要拿出来研究一下,以下列举几条研究成果:
1、该标签内部使用Collection来表示给定的容器,所有的给定容器对象(如ArrayList,Map等)都会被其转化成为Collection
2、该标签自己维护循环索引
3、该标签常见的几个属性如下:
name、property、scope、id
4、结合以上标签,给出一段源代码来解释其工作的机理
这段源代码中,一开始就可以看到这样一句:
collection = TagUtils.getInstance().lookup(pageContext, name, property, scope);
这局代码在之前的几次Struts源码分析中已经分析到了,作用如下:
1、如果property的值为null,那么
在scope定义的范围内(即request、session、application、page)查找以name变量值命名的对象(返回值是一个Object,然后转化成Collection)
2、如果property的值不为null,那么
做完1步骤的事情后,她将调用org.apache.commons.beanutils.PropertyUtils类中的getProperty方法,得到目标对象,转化成Collection类型
所以,我们在编码时,可以自己构建一个ArrayList,然后放到session或request范围内,然后在logic:Iterator标签中可以这样定义:
name=对象在session或request中绑定的key值
property可以不写(因为没有再将这个ArrayList包装进一个对象)
scope也可以不写(不写将发生pageContext.findAttribute方法调用,在四种scope中依次寻找),或写session或request
之后的代码也很好理解,Struts得到Collection之后,动态判断其进一步的类型,然后调用相关方法获得Iterator
最后,Struts使用得到的Iterator对象,开始对Collection进行循环,将Collection中每个元素对象取出,以id变量值绑定到
pageContext上。看到这里,心急的人可能会问,怎么就这么结束了么?她不将元素对象取出,然后显示么?
=========================================================
public int doStartTag() throws JspException {
// Acquire the collection we are going to iterate over
Object collection = this.collection;
if (collection == null) {
collection = TagUtils.getInstance().lookup(pageContext, name, property, scope);
}
if (collection == null) {
JspException e = new JspException(messages.getMessage("iterate.collection"));
TagUtils.getInstance().saveException(pageContext, e);
throw e;
}
// Construct an iterator for this collection
if (collection.getClass().isArray()) {
try {
// If we're lucky, it is an array of objects
// that we can iterate over with no copying
iterator = Arrays.asList((Object[]) collection).iterator();
} catch (ClassCastException e) {
// Rats -- it is an array of primitives
int length = Array.getLength(collection);
ArrayList c = new ArrayList(length);
for (int i = 0; i < length; i++) {
c.add(Array.get(collection, i));
}
iterator = c.iterator();
}
} else if (collection instanceof Collection) {
iterator = ((Collection) collection).iterator();
} else if (collection instanceof Iterator) {
iterator = (Iterator) collection;
} else if (collection instanceof Map) {
iterator = ((Map) collection).entrySet().iterator();
} else if (collection instanceof Enumeration) {
iterator = IteratorUtils.asIterator((Enumeration) collection);
} else {
JspException e = new JspException(messages.getMessage("iterate.iterator"));
TagUtils.getInstance().saveException(pageContext, e);
throw e;
}
// Calculate the starting offset
if (offset == null) {
offsetValue = 0;
} else {
try {
offsetValue = Integer.parseInt(offset);
} catch (NumberFormatException e) {
Integer offsetObject = (Integer) TagUtils.getInstance().lookup(pageContext, offset, null);
if (offsetObject == null) {
offsetValue = 0;
} else {
offsetValue = offsetObject.intValue();
}
}
}
if (offsetValue < 0) {
offsetValue = 0;
}
// Calculate the rendering length
if (length == null) {
lengthValue = 0;
} else {
try {
lengthValue = Integer.parseInt(length);
} catch (NumberFormatException e) {
Integer lengthObject = (Integer) TagUtils.getInstance().lookup(pageContext, length, null);
if (lengthObject == null) {
lengthValue = 0;
} else {
lengthValue = lengthObject.intValue();
}
}
}
if (lengthValue < 0) {
lengthValue = 0;
}
lengthCount = 0;
// Skip the leading elements up to the starting offset
for (int i = 0; i < offsetValue; i++) {
if (iterator.hasNext()) {
iterator.next();
}
}
// Store the first value and evaluate, or skip the body if none
if (iterator.hasNext()) {
Object element = iterator.next();
if (element == null) {
pageContext.removeAttribute(id);
} else {
pageContext.setAttribute(id, element);
}
lengthCount++;
started = true;
if (indexId != null) {
pageContext.setAttribute(indexId, new Integer(getIndex()));
}
return (EVAL_BODY_TAG);
} else {
return (SKIP_BODY);
}
}
=========================================================
不急,其实该标签做到这一步已经可以了,因为在我们使用logic:Iterator标签的同时,一般还会使用bean:write标签,如下一段:
=========================================================
<logic:iterate id="myuserinfo" name="browseresult" scope="request">
<tr>
<td align="center">
<bean:write name="myuserinfo" property="username" filter="true"/>
</td>
<td align="center">
<bean:write name="myuserinfo" property="userdesc" filter="true"/>
</td>
</tr>
</logic:iterate>
=========================================================
所以,bean:write这个标签将会到pageContext里面,以id变量值为key值,查找这个元素对象,然后将其属性(property属性定义)取出、显示。
OK,至此,应该已经很清楚了。最后还要一提id这个属性,很多example中可能会对我们有误解,认为id属性的定义也对应一个实体类(实体bean),
其实不然,通过以上的源代码,可以看到,id这个属性只是一个key而已,Struts用这个值来将Collection中的每个元素对象绑定到pageContext
里面去,所以,对于id属性的值,完全可以自定义,只要遵守一条规则:
在logic:Iterator标签中定义的id属性值必须和下面bean:write标签中的name属性的值一致!
分享到:
相关推荐
Struts2标签库是Java开发Web应用程序时常用的一个强大工具,尤其在构建MVC(Model-View-Controller)架构的应用程序中发挥着重要作用。Struts2框架提供了丰富的自定义标签库,极大地简化了视图层的开发,使得开发者...
c++ 的array源码分析和reverse-iterator和-Array-const-iterator类
### Struts2中Iterator标签的深入解析与应用 在Struts2框架中,`<s:iterator>`标签是一个非常强大的工具,用于在JSP页面上循环遍历集合数据,如列表(List)、数组、Map等。它允许开发者以一种动态且灵活的方式展示...
Struts2的标签库丰富多样,包括显示数据的标签(如`s:property`)、表单元素标签(如`s:textfield`)、控制流标签(如`s:if`、`s:iterator`)等。这个文档会详细介绍这些标签的用法、属性及应用场景,帮助开发者更...
这个API是Struts2框架的一部分,它提供了一系列预定义的JSP标签,这些标签简化了视图层的开发,使得开发者可以更高效地创建交互式、响应式的网页。下面将详细介绍Struts2 Tags API 的核心概念、功能以及如何使用。 ...
Struts标签是Apache Struts框架中的重要组成部分,它提供了一种声明式编程的方式,使得开发者在JSP页面中能够更加方便、简洁地处理业务逻辑和数据展示。这些标签主要用于简化视图层的开发,减少Java代码的使用,提高...
`php-multi-level-array-iterator-master`这个项目很可能包含了完整的实现和示例,你可以下载并研究其代码,以获取更多关于如何在Laravel环境中创建和使用多级数组迭代器的详细信息。 总之,理解并掌握Laravel的...
在Struts2框架中,`<s:iterator>`标签被广泛用于遍历集合或数组等数据结构。本文将深入探讨如何使用Struts2中的`<s:iterator>`标签来遍历二维数组,并通过实例代码来具体说明其用法。 ### Struts2 Iterator标签 ##...
在Struts2框架中,`<s:iterator>`标签是一个非常强大的工具,用于遍历集合或数组中的元素,尤其在处理列表数据时极为有用。通过本文档提供的代码示例,我们将深入探讨`<s:iterator>`标签的使用方法及其与不同数据...
- Struts2提供了丰富的控制标签,如`append`、`if`、`iterator`等,用于实现复杂的页面逻辑。 - 这些标签的使用方法类似于HTML标签,但提供了更多的功能。 - **Struts2数据标签简介**: - Struts2的数据标签,如`...
根据提供的文件信息,本文将深入探讨Java中的`java.util.Iterator`接口及其在集合类中的应用。我们将从以下几个方面进行详细解析: ### 一、集合类的根接口:Collection `Collection`接口是Java集合框架的基础,它...
这篇简介将深入探讨Struts2中的标签使用。 一、Struts2标签库概述 Struts2的标签库是由一系列预定义的JSP标签组成的,这些标签用于处理表单、显示数据、控制流程等任务,减少了开发者编写大量Java脚本和HTML代码的...
本篇文章将深入探讨`iterator`标签在遍历这些数据类型时的具体用法。 首先,我们来看如何使用`iterator`标签遍历Map。在Java中,Map是一种键值对的数据结构,`iterator`标签可以通过`key`和`value`属性分别获取键和...
- **解释**:将`id`属性改为`var`,这是由于Struts2.5.16中对标签库的支持有所调整,以增强安全性。 #### 六、总结 通过以上步骤,我们可以有效地完成从旧版本Struts2框架到2.5.16版本的升级过程。需要注意的是,...
Struts2 Tags API 是一个非常重要的工具,它包含了用于构建基于Struts2框架的Web应用程序的JSP标签库。这个API文档(struts2-tags-API.chm)详细地阐述了这些标签的功能、用法和属性,帮助开发者更高效地利用Struts2...
可以使用Struts2的标签库,如`s:iterator`遍历数据,`s:url`和`s:param`创建分页链接。用户点击链接时,会触发新的Action请求,携带新的页码参数。 8. **分页参数传递**:通常,页码会通过URL参数传递,例如`?page=...
Struts 2 标签库(文档手册) Tags-API-CLSW-JSP <%@ taglib prefix="s" uri="/struts-tags" %> 就能使用struts2.0的标签库 下面就介绍每个标签的具体应用实例说明:按字母排列 A: 1. 2. <s:a href=""></s:a>-...
Iterate标签 (`<s:iterator>`) 用于迭代集合数据,通常配合其他标签如`<s:property>`来展示每个迭代元素的值。 6. **If/Else标签** `<s:if>` 和 `<s:else>` 标签提供了条件逻辑,允许在JSP页面上进行条件判断。 ...
本文将详细讲解SSH框架中涉及到的五个关键标签:`set`、`push`、`if/elseif/else`、`iterator`以及`sort`,并结合它们在实际应用中的用法进行深入探讨。 ### `set`标签 `set`标签在Struts2框架中用于在Value Stack...
3. **表单标签**:Struts2提供了一整套表单相关的标签,如`<s:form>`定义表单,`<s:submit>`提交表单,`<s:checkboxlist>`和`s:select`用于创建多选和下拉菜单,以及`<s:iterator>`遍历集合数据。 4. **验证标签**...