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">

具体的な問題とは関係ありませんが、別のコンポーネントを設定するためにvalueChangeListenerwithimmediate="true"とを悪用する古い JSF 1.x ハックを使用しています。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 に答える