快速业务通道

Struts源码研究 - logic-Iterator标签篇 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

Struts源码研究 - logic-Iterator标签篇

时间:2011-08-18

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包装进一个对象)

Struts源码研究 - logic-Iterator标签篇(2)

时间:2011-08-18

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 overObject 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 collectionif (collection.getClass().isArray()) {try {// If we''re lucky, it is an array of objects// that we can iterate over with no copyingiterator = Arrays.asList((Object[]) collection).iterator();} catch (ClassCastException e) {// Rats -- it is an array of primitivesint 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 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号