f:带参数的selectOneMenu

时间:2018-04-01 23:00:08

标签: jsf

我有一组(用户)组和一个表格,我显示这些组(和用户)。每个组表头都包含f:selectOneMenu,允许设置组范围的值。为了这个例子,让它是一个int值列表(0,5,10,15,20)。在短版本之下

的POJO:

public class User {
    private int    id;
    private String name;
    // .. getter, setter, equals, hashCode
}  

public class Group {
    private int    id;
    private String name;
    // .. getter, setter, equals, hashCode
}

豆:

@ManagedBean(name = "oneSelectController")
@ViewScoped
public class OneSelectController implements Serializable {

    private List<User>                users;
    private List<Group>               groups;
    private List<Integer>             values;
    private Map<Group, List<User>>    usersToGroup;
    private Map<Group, List<Integer>> valuesToGroup;

    public OneSelectController() {

        log.info("New " + this.getClass().getSimpleName() + " ...");

        users = new ArrayList<>(4);
        users.add(new User(1, "User 1"));
        users.add(new User(2, "User 2"));
        users.add(new User(3, "User 3"));
        users.add(new User(4, "User 4"));

        groups = new ArrayList<>(5);
        groups.add(new Group(1, "Group 1"));
        groups.add(new Group(2, "Group 2"));
        groups.add(new Group(3, "Group 3"));
        groups.add(new Group(4, "Group 4"));
        groups.add(new Group(5, "Group 5"));

        values = Arrays.asList(0, 5, 10, 15, 20);

        usersToGroup = new HashMap<>();
        valuesToGroup = new HashMap<>();

        for (Group g : groups) {
            usersToGroup.put(g, users);
            valuesToGroup.put(g, values);
        }
    }

    public List<Group> getGroups() {
        return groups;
    }

    public List<User> getUsers() {
        return users;
    }

    public Integer getValueByGroup(Group group) {
        // return value for given group
    }

    public List<Integer> getValuesByGroup(Group group) {
        // return list of possible values
    }
}

XHTML:

<p:dataTable id="userTable"
             var="user"
             value="#{oneSelectController.users}">
    <p:column>
        <f:facet name="header">
            <div>User</div>
        </f:facet>
        <div>
            <h:outputText value="#{user.name}"/>
        </div>
    </p:column>
    <p:columns id="groups" value="#{oneSelectController.groups}" var="group">
        <f:facet name="header">
            <div>#{group.name}</div>
            <div>
                <h:selectOneMenu value="#{oneSelectController.getValueByGroup(group)}">
                    <f:selectItems value="#{oneSelectController.getValuesByGroup(group)}" />
                </h:selectOneMenu>
            </div>
        </f:facet>
    </p:columns>
</p:dataTable>

如何为h:selectOneMenu设置工作设置器?无论我做什么,我都会遇到例外情况。 setter(不知何故)必须能够获取所选的值,但也包含选择所在组的信息。

1 个答案:

答案 0 :(得分:7)

getValueByGroup不被JSF视为getter,因为您将其与参数一起使用。我认为您最好使用地图,正确实施hashCode()类的equals()Group方法:

在你的bean中:

private Map<Group, Integer> selectedValueByGroup = new HashMap<>();
//Getter

在视图中:

<h:selectOneMenu value="#{oneSelectController.selectedValueByGroup[group]}">
    <f:selectItems value="#{oneSelectController.getValuesByGroup(group)}" />
</h:selectOneMenu>

此外,与具体问题无关,正如@Kukeltje指出的那样,您可以使用Map结构来管理按组显示的值:

在你的bean中:

private Map<Group, List<Integer>> valuesByGroup = new HashMap<>();
//Getter

在视图中:

<h:selectOneMenu value="#{oneSelectController.selectedValueByGroup[group]}">
    <f:selectItems value="#{oneSelectController.valuesByGroup[group]}" />
</h:selectOneMenu>

如果排序对您很重要,您可以考虑使用LinkedHashMap代替HashMap

另见:

相关问题