最近闲来无事便想写一个专门配合JSTL 的c:forEach标签的分页组件,具体思路就是:使用此组件的用户从数据库中取出一组数据后交给我写的一个类,然后由此类在内部对其进行代理,通过c:forEach将其输出.但是,写了一段后发现c:forEach并不像我想想的方式工作,在给其一个实现了iterable接口的对象遍历的时候(这里由于此对象要实现反复遍历,即页面反复刷新的情况)当像下面的代码把index重置为0的时候即出现死循环,而不使其为0又无法实现反复遍历.
public Iterator iterator() {
// TODO Auto-generated method stub
return this;
}
public boolean hasNext() {
// TODO Auto-generated method stub
if (index < list.size()-1)
return true;
else{
//index = -1;
return false;
}
}
public Object next() {
// TODO Auto-generated method stub
index++;
Object obj = answer.get(index);
return obj;
}
问题的原因就在于,c:forEach再每次调用hasNext方法后会紧接着再调用一次......相当无语!!!!!所以这里使用两个位置变量就可以解决了!!!!
public boolean hasNext() {
// TODO Auto-generated method stub
System.out.println("hasNext");
if (index < list.size()) {
if (index2 < list.size())
return true;
else {
index2 = 0;
return false;
}
} else {
index = 0;
return false;
}
}