使用 <ui:repeat> 迭代基元数组
Iteration over array of primitives using <ui:repeat>
ui:repeat 的文档,属性 value
声明它可以遍历
List, array, java.sql.ResultSet, or an individual java Object
不过好像int[]
理解为Object
而不是数组。 在 JSF 2.2 中是否有任何方法可以遍历基元数组? 或者至少为什么它不可能?
我的代码:
@Named
@RequestScoped
public class UiRepeatBean {
public int[] getArray() {
return IntStream.range(0, 4)
.toArray();
}
public List<Integer> getList() {
return IntStream.of(getArray())
.mapToObj(i -> i)
.collect(Collectors.toList());
}
public Integer[] getArrayOfIntegers() {
return IntStream.of(getArray())
.mapToObj(i -> i)
.toArray(Integer[]::new);
}
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<head>
<title>Start Page</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<h:body>
<p>
int[]
<ui:repeat value="#{uiRepeatBean.array}" var="i">
#{i}
</ui:repeat>
</p>
<p>
List<Integer>
<ui:repeat value="#{uiRepeatBean.list}" var="i">
#{i}
</ui:repeat>
</p>
<p>
Integer[]
<ui:repeat value="#{uiRepeatBean.arrayOfIntegers}" var="i">
#{i}
</ui:repeat>
</p>
</h:body>
</html>
渲染结果:
int[] [I@70fcfc34
List<Integer> 0 1 2 3
Integer[] 0 1 2 3
它不起作用,因为基元数组无法按照底层 ArrayDataModel
的要求转换为 Object[]
。基元数组是 Object
而不是 Object[]
的实例。除了遍历它并创建一个新数组之外,没有办法将基元数组转换为 Object[]
。这实际上不是像 JSF 这样的模型视图展示器框架的责任。开发者本身负责首先提供正确的模型。
不过,我同意文档可以对此进行更详细的说明。你可以通过在 JSF spec 人那里留下问题来做到这一点。
ui:repeat 的文档,属性 value
声明它可以遍历
List, array, java.sql.ResultSet, or an individual java Object
不过好像int[]
理解为Object
而不是数组。 在 JSF 2.2 中是否有任何方法可以遍历基元数组? 或者至少为什么它不可能?
我的代码:
@Named
@RequestScoped
public class UiRepeatBean {
public int[] getArray() {
return IntStream.range(0, 4)
.toArray();
}
public List<Integer> getList() {
return IntStream.of(getArray())
.mapToObj(i -> i)
.collect(Collectors.toList());
}
public Integer[] getArrayOfIntegers() {
return IntStream.of(getArray())
.mapToObj(i -> i)
.toArray(Integer[]::new);
}
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<head>
<title>Start Page</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<h:body>
<p>
int[]
<ui:repeat value="#{uiRepeatBean.array}" var="i">
#{i}
</ui:repeat>
</p>
<p>
List<Integer>
<ui:repeat value="#{uiRepeatBean.list}" var="i">
#{i}
</ui:repeat>
</p>
<p>
Integer[]
<ui:repeat value="#{uiRepeatBean.arrayOfIntegers}" var="i">
#{i}
</ui:repeat>
</p>
</h:body>
</html>
渲染结果:
int[] [I@70fcfc34
List<Integer> 0 1 2 3
Integer[] 0 1 2 3
它不起作用,因为基元数组无法按照底层 ArrayDataModel
的要求转换为 Object[]
。基元数组是 Object
而不是 Object[]
的实例。除了遍历它并创建一个新数组之外,没有办法将基元数组转换为 Object[]
。这实际上不是像 JSF 这样的模型视图展示器框架的责任。开发者本身负责首先提供正确的模型。
不过,我同意文档可以对此进行更详细的说明。你可以通过在 JSF spec 人那里留下问题来做到这一点。