如何正确地在JSF中显示存储在数据库中的类别列表

时间:2011-11-20 15:33:18

标签: java jsf java-ee

我正在申请我要注册的问题。每个问题都与一个或多个类别有关系,因此我需要在注册问题表单中选择一种方法来选择它所属的类别。

我正在考虑使用JSF中的一个selectMany ...组件来完成任务。我可以检索数据库中所有类别的列表(仅9个),然后将该列表绑定到f:selectItems组件。然后每个selectItem的itemValue必须是类别的id。我还需要第二个列表,其中包含所有选定的类别ID,最后再使用每个id对数据库进行某种查询,并将其添加到列表....再次在问题上设置。

我不需要解释如何检索列表等但如果这种方法有任何好处我可能需要一些帮助?备选方案被广泛接受:=)

1 个答案:

答案 0 :(得分:2)

使List<Category>实体成为Question

@Entity
public class Question {

    @OneToMany
    private List<Category> categories;

    // ...
}

<h:selectManyMenu value="#{question.categories}" converter="#{categoryConverter}">
    <f:selectItems value="#{data.categories}" />
</h:selectManyMenu>

您只需要为Category类提供转换器。

@ManagedBean
@RequestScoped
public class CategoryConverter implements Converter {

    @EJB
    private CategoryService categoryService;

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if (!(value instanceof Category) || ((Category) value).getId() == null) {
            return null;
        }

        return String.valueOf(((Category) value).getId());
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (value == null || !value.matches("\\d+")) {
            return null;
        }

        return categoryService.find(Long.valueOf(value));
    }

}

(注意:直到JSF 2.2无法在@EJB中注入@FacesConverter,这就是为什么它是@ManagedBean,请参见Communication in JSF 2.0 - Converting and validating GET request parameters

您无需在托管bean或其他内容中复制所选项目。