【问题标题】:How to present a list of categories stored in database in JSF correctly如何正确显示存储在 JSF 中的数据库中的类别列表
【发布时间】:2011-11-20 15:33:18
【问题描述】:

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

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

我不需要解释如何检索列表等,但如果这种方法好用,我需要一些帮助吗?替代品很受欢迎:=)

【问题讨论】:

  • 你能否提供更多关于你最终想要实现的目标的信息? =)
  • @Mr.J4mes 是的,我现在更新了 :=)
  • 我相信您的方法是目前的标准方法。除非你想实现类似于 Stackoverflow 的标签的分类系统,否则我认为没有问题。
  • 如果你想让它看起来很好看,试试 Primeface 的 Picklist

标签: java jsf jakarta-ee


【解决方案1】:

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 才能在 @FacesConverter 中注入 @EJB,这就是为什么它是 @ManagedBean,另请参阅 Communication in JSF 2.0 - Converting and validating GET request parameters

您不需要在托管 bean 或其他东西中复制所选项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多