web-dev-qa-db-ja.com

JSF CommandButtonアクションが呼び出されない

JSF CommandButtonアクションが呼び出されないという問題があります。次のように、マネージドBeanのroleControllerがあります

@ManagedBean(name = "roleController")
@RequestScoped
public class RoleController {
        public Role getSelectedRole() {
    return selectedRole;
}

public void updateSelectedRole() {
    System.out.println(selectedRole.getRole());
}

.jsfファイルで、h:commandButtonのupdateSelectedRoleアクションを呼び出して編集しようとしていますが、機能していないようです。メソッド名を間違ったものに変更しようとしましたが、例外はスローされません-しかし、他のフォームで同じことをすると、例外がスローされます-そのため、アクションは呼び出されません。

<h:panelGroup rendered="${param.action == 'edit'}">
    <h:form>
        <ol>
            <li>
                <label for="ID">
                    <h:outputText value="#{msg.roleEditID}" />
                </label>
                <h:inputText readonly="true" 
                    value="#{roleController.selectedRole.id}" />
            </li>
            <li>
                <label for="Role">
                    <h:outputText value="#{msg.roleEditRole}" />
                </label>
                <h:inputText value="#{roleController.selectedRole.role}" />
            </li>
            <li>
                <h:commandButton value="#{msg.buttonUpdate}" 
                    action="#{roleController.updateSelectedRole()}"/>
            </li>
        </ol>
    </h:form>
</h:panelGroup>

ネストされたフォームが原因である可能性があることがわかりましたが、この例ではそうではありません。この問題の原因が私のナビゲーションルールである可能性はありますか?

<navigation-rule>
    <from-view-id>/admin/roles.xhtml</from-view-id>
    <navigation-case>
        <to-view-id>/admin/roles.xhtml</to-view-id>
        <from-outcome>true</from-outcome>
        <redirect>
            <view-param>
                <name>action</name>
                <value>edit</value>
            </view-param>
        </redirect>
    </navigation-case>
</navigation-rule>
18
Daniel Cisek

コマンドボタンコンポーネントはレンダリングされないため、アクションは呼び出されません。

フォーム送信の処理中に、親パネルグループコンポーネントのrendered="${param.action == 'edit'}"が再評価されます(改ざん/ハッキングされたリクエストに対する安全対策として)。ただし、明らかに、ポストバックでそのリクエストパラメータを保持していないため(少なくとも、コード内のその他の要素はそれ以外のことを証明しません)、falseと評価されます。したがって、親パネルグループコンポーネントは、そのすべての子を含めてレンダリングされません。

フォームの送信中に、コマンドボタンのrendered属性とそのすべての親コンポーネントがtrueに評価されることを確認する必要があります。この特定のケースでは、コマンドボタン自体に<f:param>を含めることで要求パラメーターを保持することで、それを実現できます。

<h:commandButton ...>
    <f:param name="action" value="#{param.action}" />
</h:commandButton>

こちらもご覧ください:


具体的な問題とは無関係、JSFでの${}の使用を禁止することが推奨されます。常に#{}に固執するだけです。

27
BalusC
<h:commandButton value="#{msg.buttonUpdate}" 
  action="#{roleController.updateSelectedRole()}"/>

に変更する

 <h:commandButton value="#{msg.buttonUpdate}" 
  action="#{roleController.updateSelectedRole}"/>

アクションの呼び出しに角かっこは必要ありません。

public void updateSelectedRole() {
System.out.println(selectedRole.getRole());
}

メソッドアクションメソッドは文字列を返す必要があります

public String updateSelectedRole() {

    System.out.println(selectedRole.getRole());
    return "true";
}
0
Udo Held

クライアントからの要求はHTTPフォーム内にカプセル化する必要があります

0
user3715225