19

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

4 に答える 4

30

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

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

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

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

以下も参照してください。


具体的な問題とは関係ありませんが、JSF での の使用を禁止することをお勧めし${}ます。そうしないと、不必要な混乱や疑問が生じるからです。#{}ずっと固執してください。

于 2012-11-11T00:13:18.797 に答える
0
<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";
}
于 2012-11-10T21:52:04.090 に答える