0

从下拉框中选择一个值并在下拉框中调用 valueChangeListener 后,我想预先检查多个复选框。以下是代码:

在 JSF 页面中:

<h:selectOneMenu id="roleName" styleClass="text" value="#{role.roleID}" valueChangeListener="#{role.processValueChange}" immediate="true" onchange="submit()">
    <f:selectItem itemLabel="--Select--" itemValue="--Select--"></f:selectItem>
    <f:selectItems noSelectionValue="--Select--" value="#{role.rolesVoList}" var="x" itemLabel="#{x.roleName}" itemValue="#{x.roleID}" />
</h:selectOneMenu>

<p>
    <h:outputText value="Notifications" styleClass="label" />
</p>
<p>
    <h:selectManyCheckbox id="notificationPrivileges" value="#{role.notificationPrivileges}" layout="pageDirection">
        <f:selectItems value="#{role.notificationPrivilegeMap}" />
    </h:selectManyCheckbox>
</p>

在托管 Bean 中:

private List<RolesVo> rolesVoList;
    private boolean checkBoxSet = false;
    private List<Integer> notificationPrivileges;
    private Map<String, Integer> notificationPrivilegeMap;
    private RolePrivilegeVo rolePrivilege;

    public void processValueChange(ValueChangeEvent event) {
        messageHandler = new MessageHandler();
        int newValue = (Integer) event.getNewValue();
        setRoleID(newValue);
        try {
            rolePrivilege = roleService.getRolePrivileges(newValue);
            setNotificationPrivileges(rolePrivilege.getPrivilegeIDs());
            setCheckBoxSet(true);

        } catch (Exception e) {
            messageHandler.addGlobalErrorMessage(OATSConstants.errorFetchPrivilege);
        }

    }

getPrivilegeIDs() 返回整数列表。正在提交表单并且正在成功处理 valueChangeListener 方法,但之后未选中复选框。请指出我做错了什么。非常感谢任何帮助。

4

1 回答 1

0

它失败了,因为您没有为<h:selectManyCheckbox>. List您正在使用和之类的通用集合Map。EL 不支持泛型,String默认情况下将所有内容解释为。这将在测试中失败,equals()以检查是否必须检查该项目。

在使用Integer时,您需要指定javax.faces.Integer转换器:

<h:selectManyCheckbox ... converter="javax.faces.Integer">

与具体问题无关,您正在使用旧的 JSF 1.x hack 来滥用valueChangeListenerwithimmediate="true"onchange="submit()来填充另一个组件。这非常笨拙,并且每当您在同一表单中的任何地方使用验证时都可能会失败。而是使用新的 JSF 2.0 提供的<f:ajax>标记。然后它将如下所示:

<h:selectOneMenu id="roleName" styleClass="text" value="#{role.roleID}">
    <f:selectItem itemLabel="--Select--" itemValue="--Select--"></f:selectItem>
    <f:selectItems noSelectionValue="--Select--" value="#{role.rolesVoList}" var="x" itemLabel="#{x.roleName}" itemValue="#{x.roleID}" />
    <f:ajax listener="#{role.processValueChange}" render="rolePrivileges" />
</h:selectOneMenu>

<p>
    <h:outputText value="Role Management" styleClass="label" />
</p>
<p>
    <h:selectManyCheckbox id="rolePrivileges" value="#{role.rolePrivileges}" layout="pageDirection" converter="javax.faces.Integer">
        <f:selectItems value="#{role.rolePrivilegeMap}" />
    </h:selectManyCheckbox>
</p>

public void processValueChange(AjaxBehaviorEvent event) {
    // ...
}
于 2012-05-02T19:29:14.150 回答