1

ViewScope Bean は ajax 呼び出しを許可しますか?

例えば:

以下は xhtml ページです。

<h:body>
        <h:selectOneMenu value="#{test.selected}">
            <f:selectItem itemValue="2" itemLabel="2" />
            <f:selectItem itemValue="3" itemLabel="3" />
            <f:ajax listener="#{test.updateData()}" />
        </h:selectOneMenu>
</h:body>

ViewScoped Bean は次のとおりです。

@ViewScoped
@Named
public class test implements Serializable{
    private String selected;


    public void updateData(){
        System.out.println("Ajax call successful.");
    }

    public String getSelected() {
        return selected;
    }

    public void setTest(String test) {
        this.selected = selected;
    }
}

これを試したところ、うまくいきませんでした。

4

2 に答える 2

3

実際、これまでに投稿されたコードには 3 つの深刻な問題があります。

  1. <h:form>がありません。これが質問や実際のコードの不注意な準備であるかどうかはわかりません。解決策は明らかです。グループ化さUIInputUICommandたコンポーネントを独立した に配置し<h:form>ます。

  2. 現在の JSF バージョンでは、JSF のスコープ アノテーション@javax.faces.bean.ViewScopedは CDI の Bean 管理アノテーションで機能しません@Named

    基本的に3つの解決策があります:

    • @ConversationScoped代わりにCDI を使用してください。具体的な例については、JSF 2.0/2.1 で @ManagedBean / @ViewScope を CDI に置き換える方法も参照してください。cidただし、これには、すべての結果 URL に要求パラメーターを追加するという厄介な副作用があります。
    • MyFaces CODIを使用して、JSF@ViewScopedを CDI にブリッジします。windowIdただし、これには、すべての結果 URL にリクエスト パラメータが追加されるという厄介な副作用があります。
    • @javax.faces.view.ViewScopedJSF 2.2 がリリースされるのを待って、JSF ビューステートと関連付ける CDI 互換のアノテーションを利用できるようにします。


    ただし、これが具体的な問題の原因になることはほとんどありません。これは、Bean アクションを呼び出すだけでよいのですが、Bean は@RequestScoped.

  3. setter メソッドがありません。PropertyNotWritableExceptionただし、これは、フォームが正常に送信されたときに、サーバーログにかなり自明なメッセージをスローするはずです。

これまでに提供された情報に基づいて確実に確認できない 4 つ目の原因が考え<h:head>られ<f:ajax>ますjsf.js

于 2013-04-03T11:47:48.670 に答える
1

エラーの原因となる間違ったセッターがあります

public void setTest(String test) {
    this.selected = selected;
}

これは

public void setSelected(String test) {
    this.selected = test;
}

余談ですが、このセッターはh:selectOneMenu value="#{test.selected}"に対して呼び出され、コンボ ボックスで項目が選択されたときに起動されます。

于 2013-04-03T08:28:43.653 に答える