【发布时间】:2010-01-11 18:04:25
【问题描述】:
我有一颗豆子:
public ProjectServiceImpl {
public List<Project> getAllProjects () { ... }
}
我想将所有这些项目列为<h:selectManyListbox> 中的项目。当用户选择一个或多个项目并按下提交按钮时,应将所选项目转换为项目。
我对如何列出项目以及对应的转换器应该是什么样子感到有些困惑?
【问题讨论】:
我有一颗豆子:
public ProjectServiceImpl {
public List<Project> getAllProjects () { ... }
}
我想将所有这些项目列为<h:selectManyListbox> 中的项目。当用户选择一个或多个项目并按下提交按钮时,应将所选项目转换为项目。
我对如何列出项目以及对应的转换器应该是什么样子感到有些困惑?
【问题讨论】:
您需要实现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>
这样你就可以用Project作为值创建SelectItem。
您可以从这篇博客文章中获得一些背景信息和更多想法:http://balusc.blogspot.com/2007/09/objects-in-hselectonemenu.html
【讨论】:
要列出<h:selectManyListbox> 中的项目,您需要使用<f:selectItems> 并将值指向SelectItem 对象列表。
我通常采用的方法是遍历项目并将每个项目转换为SelectItem。同时,我还将项目存储在HashMap 中,使用SelectItem 值作为键。然后当你需要获取项目对象的列表时,你可以循环选择值并从地图中抓取对象。
如果您不想创建HashMap,您可以使用Project 在列表中的位置作为SelectItem 的值并以此方式查找项目。
【讨论】:
Project这样的非标准对象作为选择项,而不是如何创建选择项。