5

JSF 2に問題があります。Mojarra 2.1.14とPrimefaces 3.1.4を使用しています

formAformBの 2 つのフォームを含むページがあります。2 つのフォームには、非表示の入力フィールドにそれぞれ ViewState が含まれています。

<h:form id="formA" binding="#{sessionBean.formA}">
    <h:commandButton value="formA" action="#{sessionBean.actionA}">
        <f:ajax/>
    </h:commandButton>
</h:form>

<h:form id="formB" binding="#{sessionBean.formB}">
    <h:commandButton value="formB" action="#{sessionBean.actionB}">
        <f:ajax/>
    </h:commandButton>
</h:form>

ユーザーがAjax アクションを使用してformAを送信します。Java アクション内で、 (バインドされている) formAformBを明示的に更新します。

public void actionA(){
    FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(formA.getClientId());
    FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(formB.getClientId());
    System.out.println("action A!!");
}

public void actionB(){
    System.out.println("action B!!");
}

Ajax 応答には、formAformB (要素) および ViewState の HTML コードがあります。

JSF はformAformBの HTML を更新し、呼び出し元のフォームformAの ViewState を設定します。 formBには ViewState が含まれていません。

ユーザーが Ajax アクションを使用してformBを送信します。ViewState が定義されていないため、RESTORE フェーズで postBack が false に設定され、renderResponse が true に設定され、INVOKE APPLICATION フェーズがスキップされます。アクションは呼び出されません。応答 VIEW_STATE が更新された後、ユーザーがformBを送信すると、アクションが呼び出されます。

それは JSF 2 のバグですか、それとも制限ですか? または私は何か間違っていますか?

GitHub で Maven プロジェクトを見つけることができます: https://github.com/nithril/jsf-multiple-form

よろしくお願いします。

4

2 に答える 2

4

あなたが直面している問題は、JSF JavaScript ライブラリの既知の問題に関連しています。回避策は、タグrenderedの属性で別のフォームのクライアント ID を明示的に設定することです。f:ajax

<h:form id="formA" binding="#{sessionBean.formA}">
  <h:commandButton value="formA" action="#{sessionBean.actionA}">
    <f:ajax render=":formB @form"/>
  </h:commandButton>
</h:form>

<h:form id="formB" binding="#{sessionBean.formB}">
  <h:commandButton value="formB" action="#{sessionBean.actionB}">
    <f:ajax render=":formA @form"/>
  </h:commandButton>
</h:form>

これについての詳細:

于 2013-02-01T23:04:39.383 に答える
2

MyFaces 2.0.x / 2.1.xを使用してフォームを正しく更新し、次のスクリプトを追加する場合は、別のトリックがあります。

window.myfaces = window.myfaces || {};
myfaces.config = myfaces.config || {};
//set the config part
myfaces.config.no_portlet_env = true; 

JSFAjaxおよび複数のフォームを参照してください。

このオプションは、複数のフォームを使用するWebアプリのすべての場所を修正する必要がなく、メインテンプレートに追加するだけでよいため、はるかに優れています。

于 2013-02-02T00:22:28.440 に答える