1

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

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

有人能帮我吗?

JSP:

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

我的豆:

(...)
    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;
}

提前致谢!


编辑:

我忘了说我不断收到以下错误:

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

4

4 回答 4

3

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

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

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

请注意,在吸气剂中执行业务工作是不好的做法。您应该在 bean 的(后)构造函数中执行此操作。

也可以看看:

于 2012-11-14T13:01:24.653 回答
1
 List<Cats> listCats = new List<Cats>();

 myBean.listCats.desc

List 没有名为 的属性descCats有,但是listCats是一个列表。

顺便说一句:如果你的类名是单数的话会更好,除非它们代表一个组。

于 2012-11-14T12:23:49.357 回答
0

方法

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

返回 a Collection,JSF 1.2 不支持<h:selectOneMenu>

这个方法应该 return ListMap或者Object[]它的符号应该这样重写:

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

除此之外,您将在这一行遇到 JSP 的另一个问题:

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

listCatsListCats(应该用 重命名Cat)组成的,并且此列表没有desc()方法。这一行也应该这样修改(根据您的需要修改:

<h:selectOneMenu value="#{myBean.listCats.get(0).desc}" id="desc">
于 2012-11-14T12:35:04.817 回答
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"); 
 }

谢谢!

于 2012-11-14T13:04:17.383 回答