0

我正在尝试在 JSF 中创建一个下拉框。它需要填充给定有效范围内的数字。例如,如果给定范围在5 到 20之间,那么下拉值应该是;

  "5, 10 15, 20" 

我有一些问题,在我的控制器中,我创建了类似的东西并使用 for 循环设置值;

List<Integer> validAmounts  OR
List<String>  validAmounts

然后

  <myapp:selectRowElem id="autoreloadamount"
            type="dropdown" selectItems="#{settingsController.validAmounts}"/>

我收到错误消息,例如

itemValue="#{i.value}": String does not have a property 'value'

有任何想法吗?

还有一种更好的“JSF”方式来设置有效金额,但不在我的控制器中创建一个 for 循环来设置 validAmounts 列表吗?

myapp:selectRowElem ” 很长,但它有这个下拉菜单;

 <h:selectOneMenu id="input" value="#{cc.attrs.item}" validatorMessage="#{msg[validatorMsgKey]}">
                            <f:validateRequired disabled="#{cc.attrs.forceRequired ne 'true'}"/>
                            <f:selectItems value="#{cc.attrs.selectItems}" var="i" itemValue="#{i.value}" itemLabel="#{i.label}" />
                        </h:selectOneMenu>
4

1 回答 1

2

这个,

<f:selectItems value="#{cc.attrs.selectItems}" var="i" itemValue="#{i.value}" itemLabel="#{i.label}" />

期望一个List<SomeObject>as#{cc.attrs.selectItems}其中每个SomeObject项目都被分配为循环变量#{i},而循环变量又期望具有getValue()getLabel()方法分别返回项目值和标签。

那些 getter 方法也Integer没有。String这也正是异常试图告诉您的String. 它在上面找不到getValue()方法。

似乎#{cc.attrs.selectItems}期望 aList<SelectItem>其中具有这些getterSelectItem的标准 JSFjavax.faces.model.SelectItem对象。

因此,您应该按如下方式声明和创建列表:

List<SelectItem> validAmounts; 

// ...

validAmounts = new ArrayList<SelectItem>();
validAmounts.add(new SelectItem(5));
validAmounts.add(new SelectItem(10));
validAmounts.add(new SelectItem(15));
validAmounts.add(new SelectItem(20));

一个技术上有效的替代方法是创建一个自定义类,就像SomeObject那些返回所需值的 getter 方法一样。但是这种轮子的重新发明毕竟在功能上很笨拙,因此不推荐。


顺便说一句,这表明复合组件中至少有两个问题,<portal:selectRowElem>显然是由其他人开发的:

  1. <cc:attribute name="selectItems">缺少shortDescription应该清楚地解释最终用户(您)期望的值的属性。它应该告诉它期待一个List<SelectItem>. 通过这种方式,您应该在代码自动完成期间或只需浏览标签文档即可立即注意到它。

  2. 所有这些var,itemLabelitemValue属性都是多余的。当提供 a 时,它们已经是所有默认值List<SelectItem>。这也表明最初的复合组件开发人员不知道他在做什么。

于 2013-10-04T13:17:41.397 回答