JSF . SelectOneMenu and SelectItems

5

我正在尝试让用户在JSF中从下拉列表中选择一个集合项。

这是我正在使用的代码:

<f:view>
 <h:form id="insert">
    <h:selectOneMenu value="#{MyBean.user}">
        <f:selectItems value="#{MyBean.userList}" var="currentUser" itemValue="#{currentUser.username}" itemLabel="#{currentUser.username}"/>
     </h:selectOneMenu>
     <h:commandButton value="Insert" action="#{AuctionBean.insertItem}"/><br>
 </h:form>
</f:view>

这是MyBean的代码:

@ManagedBean
public class MyBean{
    private String user;
    private Collection<User> userList;

    @PostConstruct
    public void init() {
                this.userList = UserRepository.getInstance().findAllUsers();
    }
    ...
    public String insertItem() {
         System.out.println("The selected user is " + this.user);
         ...
         return ("successfulInsertion");
    }
...
}

如果需要,以下是用户的getter和setter:

public String getUser() {
        return this.user;
    }

    public void setUser(String user) {
        this.user = user;
    }

我的问题是在打印“所选用户为”时,并没有写出user.toString(),而是写出了userList.toString()!就好像selectOneMenu没有正确设置一样,但我已经做了很多搜索。

有人可以帮忙吗?谢谢,AN

2个回答

4
<f:selectItems>不支持Collection,需要使用ListMapObject[]

另请参阅:


更新:原来您正在使用JSP而非Facelets。新的JSF 2.x标签和属性在JSP中不可用,包括<f:selectItems var>。只有旧的JSF 1.x标签和属性在JSP中可用。自JSF 2.0以来,JSP已被弃用并由Facelets取代。您应该使用Facelets。

另请参阅:


那我应该将我的userList设置为一个List(例如LinkedList),这样才能以这种方式工作吗?谢谢! - andreaxi
使用 ArrayList,因为它在按索引检索时更快。 - BalusC
我将userList的类型更改为ArrayList<User>,并以以下方式填充它:this.userList = new ArrayList<User>(UserRepository.getInstance().findAllUsers()); - andreaxi
根据其他答案的评论,您似乎仍在使用旧版JSP,同时使用JSF 2.0。这是不正确的。 - BalusC
问题已经解决了,我使用JSF 2.0实现了它并且运行良好。谢谢,AN。 - andreaxi
显示剩余2条评论

1
<f:ajax/>添加到您的<h:selectOneMenu value="#{MyBean.user}">中,就像这样。
<h:selectOneMenu value="#{MyBean.user}">
    <f:ajax/>
    <f:selectItems value="#{MyBean.userList}" var="currentUser" itemValue="#{currentUser.username}" itemLabel="#{currentUser.username}"/>
</h:selectOneMenu>

每次从下拉菜单中选择一个值时,这将向服务器提交您的选择...

或者

在按钮中添加<f:ajax execute="@form"/>,这样它将在调用insertItem之前提交您的下拉菜单选择。

<h:commandButton value="Insert" action="#{AuctionBean.insertItem}">
    <f:ajax execute="@form"/>
</h:commandButton> 

在您的 xhtml 文件中,在 xmlns:h="http://java.sun.com/jsf/html" 旁边添加 xmlns:f="http://java.sun.com/jsf/core" - Daniel
我已经完成了:<%@ taglib prefix="f" uri="" rel = "nofollow noreferrer">http://java.sun.com/jsf/core"%> <%@ taglib prefix="h" uri="" rel = "nofollow noreferrer">http://java.sun.com/jsf/html"%> - andreaxi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接