我有一个豆子:
public ProjectServiceImpl {
public List<Project> getAllProjects () { ... }
}
我想将所有这些项目列为<h:selectManyListbox>
中的项目。当用户选择一个或多个项目并按下提交按钮时,所选项目应转换为项目。
我对如何列出项目以及相应的转换器应该是什么样子感到困惑?
答案 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
进入图片时关注转换,无需指定converterId
或f: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
值并以这种方式查找项目。