为什么JSF2/Facelet的ui:repeat不接受java。util。迭代器的值?可以在迭代器后面隐藏如此多的实现和内存节约,因为长度不需要知道,所以拥有它是非常有用的。但是相反,我需要将迭代器转换为列表,并抛弃所有优点,以便ui:repeat。
可能有阶段、时间或可序列化的原因,但我对可用文档的浏览并没有给出这些原因。我们还没有使这一不可能成为可能的科学吗?
你可以做出
/**
* Make a DataModel out of an Iterator that may be used with JSF's ui:repeat tag
*
* This DataModel does not support the use of offset or step attributes in the
* ui:repeat tag, and the size attribute in ui:repeat, when used with this DataModel,
* will report an inaccurate value.
*
* Copyright (c) 2014 Woldrich, Inc.
* Licensed under MIT (https://clubcompy.com/wcm/license/mit.txt)
*
* @author Dave Woldrich
*/
public class IteratorDataModel<T> extends DataModel<T> {
private static final Logger logger = LogManager.getLogger(IteratorDataModel.class);
private Iterator<?> iterator;
private int rowIndex;
private T item;
public IteratorDataModel(Iterator<?> iterator) {
setWrappedData(iterator);
}
@Override
public int getRowCount() {
return Integer.MAX_VALUE;
}
@Override
public T getRowData() {
return this.item;
}
@Override
public int getRowIndex() {
if(this.rowIndex == -1 && this.iterator.hasNext()) {
this.setRowIndex(0);
}
if(logger.isTraceEnabled()) {
logger.trace("getRowIndex returns " + this.rowIndex);
}
return this.rowIndex;
}
@Override
public Object getWrappedData() {
return this.iterator;
}
@Override
public boolean isRowAvailable() {
boolean hasNext = this.item != null || this.iterator.hasNext();
if(logger.isTraceEnabled()) {
logger.trace("isRowAvailable " + hasNext);
}
return hasNext;
}
@SuppressWarnings("unchecked")
@Override
public void setRowIndex(int newIndex) {
if(logger.isTraceEnabled()) {
logger.trace("setRowIndex (" + newIndex + ")");
}
if(newIndex == this.rowIndex+1) {
this.rowIndex = newIndex;
this.item = (T) (this.iterator.hasNext() ? this.iterator.next() : null);
}
else if(newIndex > -1 || newIndex != this.rowIndex) {
if(logger.isTraceEnabled()) {
logger.trace("setRowIndex not incrementing by 1 as expected, ignored");
}
}
}
@Override
public void setWrappedData(Object data) {
this.iterator = (Iterator<?>) data;
this.rowIndex = -1;
this.item = null;
}
}
例如,在facelets代码中,您可以使用:
<ul>
<ui:repeat value="#{chatRoom.allComments}" var="aComment" varStatus="status">
<li><h:outputText value="#{aComment.text}" /></li>
</ui:repeat>
</ul>
聊天室在哪里。getAllComments()将返回一个IteratorDataModel
private DataModel getDataModel() {
if (this.model == null) {
Object val = this.getValue();
if (val == null) {
this.model = EMPTY_MODEL;
} else if (val instanceof DataModel) {
//noinspection unchecked
this.model = (DataModel<Object>) val;
} else if (val instanceof List) {
//noinspection unchecked
this.model = new ListDataModel<Object>((List<Object>) val);
} else if (Object[].class.isAssignableFrom(val.getClass())) {
this.model = new ArrayDataModel<Object>((Object[]) val);
} else if (val instanceof ResultSet) {
this.model = new ResultSetDataModel((ResultSet) val);
} else {
this.model = new ScalarDataModel<Object>(val);
}
}
return this.model;
}
问题内容: 为什么接口不扩展? 该方法可以简单地返回。 是故意的还是对Java设计师的监督? 能够将循环与这样的迭代器一起使用将很方便: 其中返回迭代器。 问题答案: 因为迭代器通常指向集合中的单个实例。Iterable意味着可以从一个对象获得迭代器以遍历其元素-无需迭代单个实例(迭代器代表的是该实例)。
我接手了一个Sring MVC项目,需要改变它的行为,所以在我的servlet中我发送了一个get请求来自动登录,我的servlet代码如下所示: 当我用Firefox运行它时,它让我登录,但在IE中不起作用。 我还手动粘贴了URL: http://Example.com/SupportCenter/login.html?userName=UID 进入两个broswers,他们都让我登录。那么,为
问题内容: 在Java 5及更高版本中,您具有foreach循环,该循环可以神奇地实现任何实现的对象: 但是,仍然没有实现,这意味着要迭代一个,您必须执行以下操作: 有谁知道为什么仍然不执行? 编辑: 为澄清起见,我不是在谈论枚举的语言概念,而是在Java API中称为“ 枚举 ” 的Java特定类。 问题答案: 枚举没有被修改为支持Iterable,因为它是一个接口,而不是一个具体的类(例如Ve
我在更新链式lodash操作时遇到了这个问题,我不明白为什么会有不同的效果 我把范围缩小到用链子把一根forEach拴在一个lodash包装纸上 https://jsbin.com/wahokezeja/edit?js,控制台 这将抛出一个错误: “TypeError:\(…)。forEach(…)。groupBy不是一个函数 但是,当使用贴图链接时,效果很好 https://jsbin.com/
https://godbolt.org/z/P97MaK 我玩的概念和预期d::is_equality_comparable工作矢量,但它没有。 编译错误在 内部失败,而不是在受概念保护的函数边界处失败。 这是错误还是预期行为?
问题内容: 假设我有这个模型: 现在,如果我想高效地查看相册中的一部分照片。我这样做是这样的: 这只会执行两个查询,这正是我所期望的(一个查询得到相册,然后一个查询,例如“ SELECT * IN photos WHERE photoalbum_id IN()”。 一切都很棒。 但是,如果我这样做: 然后用!进行大量查询!我是在做错什么,还是django不够聪明,以至于它已经获取了所有照片并可以在