JSF 2:使用SelectItemGroup + POJO进行选择分组

ber*_*tie 7 jsf jsf-2

我尝试使用以下类似的方法处理分组选择:

<h:selectOneMenu value="#{selectionLabBean.oneSelectMenuGroup}"
    id="SelectOneMenuGroup" >
        <f:selectItems value="#{selectionLabBean.heroGroupList}" />
</h:selectOneMenu>
<p:message for="SelectOneMenuGroup" />
Run Code Online (Sandbox Code Playgroud)

heroGroupList是这样的:

SelectItem[] heroArr = new SelectItem[] {
    new SelectItem("Paladin"),
    ...
};
heroListWithGrouping.add(
    new SelectItemGroup("Human", 
        "A collection of human race Heroes", 
        false,
        heroArr
    )
);
.....
Run Code Online (Sandbox Code Playgroud)

而且我想知道我是否可以使用POJO而不是SelectItem对象进行这种分组?

如果我无法实现这一点,我想我必须以某种方式将我的域对象或我的查询结果转换为SelectItem数组以使其工作.

有任何想法吗 ?

Bal*_*usC 9

当你想要使用时,这确实是不可能的SelectItemGroup.你需要List<SelectItem>在bean(post)构造过程中从POJO的集合转换为双for循环.

@PostConstruct
public void init() {
    List<HeroRace> heroRaces = getItSomehowFromDatabase();
    this.heroGroupList = new ArrayList<SelectItem>();
    for (HeroRace heroRace : heroRaces) {
        SelectItemGroup group = new SelectItemGroup(heroRace.getName()); // Human, etc
        List<SelectItem> heroes = new ArrayList<SelectItem>();
        for (Hero hero : heroRace.getHeroes()) {
            heroes.add(new SelectItem(hero.getName()); // Paladin, etc
        }
        group.setSelectItems(heroes.toArray(new SelectItem[heroes.size()]));
        this.heroGroupList.add(group);
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用Hero项目值

heroes.add(new SelectItem(hero, hero.getName()); // Paladin, etc
Run Code Online (Sandbox Code Playgroud)

这样你就可以绑定#{selectionLabBean.oneSelectMenuGroup}到一个Hero类型而不是String.但是你需要提供一个Converter.Amorfis已经回答了这一部分.