如何使用JSF的selectOneMenu?

时间:2012-11-14 12:19:50

标签: jsf jsf-1.2 selectonemenu

我在使用JSF的selectOneMenu时遇到了问题。

我一直在尝试类似下面的事情,但似乎没有人工作......

有人可以帮助我吗?

JSP:

<h:selectOneMenu value="#{myBean.listCats.desc}" id="desc">
    <f:selectItems value="#{myBean.selectAllCats}" />
</h:selectOneMenu>

为myBean:

(...)
    public Collection<SelectItem> selectAllCats() throws (some exceptions...){  
        this.listCats = this.controller().selectAllCats();
        Collection<SelectItem> toReturn = new ArrayList<SelectItem>();  

        for( int i = 0; i<this.listCats.size(); i++){  
          toReturn.add( new SelectItem( this.listCats.get(i).getCod(), this.listCats.get(i).getDesc()));  
        }
        return toReturn;
    }
(...)

更多信息:

List<Cats> listCats = new List<Cats>();
//-------------------------------------
class Cats{
    private int cod; // both with getters and setters
    private String desc;
}

提前致谢!


编辑:

我忘了说我一直收到以下错误:

  

'#{myBean.selectAllCats}'在类型上找不到属性'selectAllCats'   path.to.myBean

4 个答案:

答案 0 :(得分:3)

  

'#{myBean.selectAllCats}'在类型path.to.myBean上找不到属性'selectAllCats'

对于属性,您应该提供有效的getter方法。你没有任何一个,因为例外是试图告诉你。 selectAllCats属性的有效getter方法应该如下所示。

public Collection<SelectItem> getSelectAllCats() {
    return selectAllCats;
}

请注意,在getter中执行业务工作是不好的做法。你应该在bean的(post)构造函数中这样做。

另见:

答案 1 :(得分:1)

 List<Cats> listCats = new List<Cats>();

 myBean.listCats.desc

列表没有名为desc的属性。 CatslistCats,但{{1}}是一个列表。

顺便说一句:如果你的班级名字是单数,那就更好了,除非他们代表一个团体。

答案 2 :(得分:0)

方法

public Collection<SelectItem> selectAllCats() throws (some exceptions...)

返回Collection,JSF 1.2中的<h:selectOneMenu>不支持。

此方法应返回ListMapObject[],因此其标志应重写为:

public List<SelectItem> selectAllCats() throws (some exceptions...)

除此之外,你还会在这一行遇到另一个问题:

<h:selectOneMenu value="#{myBean.listCats.desc}" id="desc">

listCats是由List组成的Cats(应使用Cat重命名),此列表没有desc()方法。这条线也应该像这样修改(根据你的需要修改:

<h:selectOneMenu value="#{myBean.listCats.get(0).desc}" id="desc">

答案 3 :(得分:0)

我不知道标签信息页面,这就是为什么我没有在那里搜索我的答案。

您可以在此链接中找到它: https://stackoverflow.com/tags/selectonemenu/info

或者:

  

顺便问一下,你看过了标签信息页吗?   你自己提出问题的[selectonemenu]标签?将它悬停   用鼠标直到出现一个黑框,然后点击其中   信息链接。 - BalusC

我正在寻找的答案位于该信息页面的动态列表部分, 以下引用以供进一步参考:

  

动态列表

     

您可以用来显示动态列表   填充在支持bean中。您可以使用   javax.faces.model.SelectItem表示一对项值和   标签

     

查看:

<h:form>
     <h:selectOneMenu value="#{bean.selectedItem}">
         <f:selectItem itemValue="#{null}" itemLabel="-- select one --" />
         <f:selectItems value="#{bean.availableItems}" />
     </h:selectOneMenu>
     <h:commandButton value="Submit" action="#{bean.submit}" /> </h:form>
  

型号:

private String selectedItem; // +getter +setter private
 List<SelectItem> availableItems; // +getter (no setter necessary)

 @PostConstruct public void init() {
     availableItems = new ArrayList<SelectItem>();
     availableItems.add(new SelectItem("foo", "Foo label"));
     availableItems.add(new SelectItem("bar", "Bar label"));
     availableItems.add(new SelectItem("baz", "Baz label")); 
 }
  

availableItems也可以是SelectItem []。如果省略该项目   标签

     
    

因此可以将项值用作选项值和选项标签,     那么你也可以使用List或String []。

  
private String selectedItem; // +getter +setter private List<String>
 availableItems; // +getter (no setter necessary)

 @PostConstruct public void init() {
     availableItems = Arrays.asList("foo", "bar", "baz"); 
 }

谢谢!