使用<ui:repeat>

时间:2015-12-24 08:46:54

标签: jsf jsf-2.2 primitive-types uirepeat

ui:repeat,属性value的文档说明它可以迭代

  

List,array,java.sql.ResultSet或单个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&lt;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 

1 个答案:

答案 0 :(得分:3)

它不起作用,因为根本ArrayDataModel无法将基元数组转换为Object[]。基元数组是Object的实例,而不是Object[]。除了循环并创建新数组之外,无法将基元数组转换为Object[]。这并不是像JSF这样的模型视图展示器框架的责任。开发人员自己负责首先提供正确的模型。

然而,我确实同意文件可以在此更加明确。你可以在JSF spec伙伴处留下问题来做到这一点。