我正在尝试在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>
答案 0 :(得分:2)
此,
<f:selectItems value="#{cc.attrs.selectItems}" var="i" itemValue="#{i.value}" itemLabel="#{i.label}" />
期望List<SomeObject>
为#{cc.attrs.selectItems}
,其中每个SomeObject
项目已被指定为循环变量#{i}
,而后者预计会getValue()
和{{ 1}}方法分别返回项值和标签。
getLabel()
和Integer
都没有这些getter方法。这也正是在String
的情况下异常试图告诉您的内容。它找不到String
方法。
getValue()
似乎期待#{cc.attrs.selectItems}
,其中List<SelectItem>
是标准的JSF SelectItem
对象which does have those getters。
所以你应该按如下方式声明和创建列表:
javax.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));
,这些getter方法返回所需的值。但是这种轮子的重新发明毕竟是功能上的笨拙,因此不推荐。
顺便说一下,SomeObject
复合组件中至少有2个问题显然是由其他人开发的:
<portal:selectRowElem>
缺少<cc:attribute name="selectItems">
属性,该属性应该清楚地向最终用户(您)说明它所期望的值。它应该告诉它期待shortDescription
。通过这种方式,您应该在代码自动完成期间或通过浏览标记文档时立即注意到它。
所有这些List<SelectItem>
,var
和itemLabel
属性都是多余的。当提供itemValue
时,它们都是默认值。这也表明原始的复合组件开发人员不知道他在做什么。