JSF设置下拉列表

时间:2013-10-04 12:53:33

标签: jsf

我正在尝试在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>

1 个答案:

答案 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个问题显然是由其他人开发的:

  1. <portal:selectRowElem>缺少<cc:attribute name="selectItems">属性,该属性应该清楚地向最终用户(您)说明它所期望的值。它应该告诉它期待shortDescription。通过这种方式,您应该在代码自动完成期间或通过浏览标记文档时立即注意到它。

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