如何在selectManyListbox中将集合元素显示为项目?

时间:2010-01-11 18:04:25

标签: java jsf converter

我有一个豆子:

public ProjectServiceImpl {    
   public List<Project> getAllProjects () { ... }
}

我想将所有这些项目列为<h:selectManyListbox>中的项目。当用户选择一个或多个项目并按下提交按钮时,所选项目应转换为项目。

我对如何列出项目以及相应的转换器应该是什么样子感到困惑?

2 个答案:

答案 0 :(得分:2)

您需要实现Converter#getAsString(),以便在唯一字符串表示中表示所需的Java对象,该字符串表示可用作HTTP请求参数。使用数据库技术ID(主键)非常在这里很有用。

public String getAsString(FacesContext context, UIComponent component, Object value) {
    // Convert the Project object to its unique String representation.
    return String.valueOf(((Project) value).getId());
}

然后,您需要实现Converter#getAsObject(),以便HTTP请求参数(根据定义String)可以转换回所需的Java对象(在您的情况下为Project

public Object getAsObject(FacesContext context, UIComponent component, String value) {
    // Convert the unique String representation of Project to the actual Project object.
    return projectDAO.find(Long.valueOf(value));
}

最后,只需将此转换器与相关对象类型相关联,JSF将在Project进入图片时关注转换,无需指定converterIdf:converter

<converter>
    <converter-for-class>com.example.Project</converter-for-class>
    <converter-class>com.example.ProjectConverter</converter-class>
</converter>

这样您就可以创建SelectItem Project作为值。

您可以从此博客文章中获取一些背景信息和更多创意:http://balusc.blogspot.com/2007/09/objects-in-hselectonemenu.html

答案 1 :(得分:1)

要列出<h:selectManyListbox>中您需要使用<f:selectItems>的项目,并将该值指向SelectItem个对象的列表。

我通常采用的方法是遍历项目并将每个项目转换为SelectItem。同时,我还使用HashMap值作为关键字将项目存储在SelectItem中。然后,当您需要获取项目对象列表时,可以遍历所选值并从地图中获取对象。

如果您不想创建HashMap,可以使用列表中Project的位置作为SelectItem值并以这种方式查找项目。