0

互いにピア アプリケーションである Web モジュールのグループがあります。jQuery を使用してそれらをマッシュアップします。これらの異なるモジュールはすべて JSF を使用します。さまざまなモジュールをさまざまな Java EE アプリケーション サーバーにデプロイできます。

アカウントを開設するための JSF ページを想像してみてください。そのページでは、顧客検索機能を使用して、口座を開設する顧客を検索する場合があります。アカウント オープン フォームを含む JSF ページは 1 つの Web モジュールから提供され、クライアント検索ページは別の Web モジュールから提供されます。

...jsf page loaded from http://openaccount.com/openForm.xhtml

... code to load a search from from elsewhere...
<script type="text/javascript">
   jQuery(document).ready(function () {
      jQuery('#search_gadget').load('http://search.com/searchForm.xhtml');
                        });
</script>
<search_gadget/>
<br/> .. the rest of the open account form...

... searchForm と openForm はどちらも JSF/a4j ページです。

問題は、searchForm 'ガジェット' が検索を実行するために a4j 呼び出しを行い、それによって新しいビュー ステート ID が返されると、openForm.xhtml のビュー ステート ID も更新されることです。その後、openForm.xhtml を使用してフォームをサーバーに送信すると、ビュー ステート ID が同期しなくなります (サーバー側のビュー ステートが異なる別の Web モジュールへの a4j 呼び出しによって最後に更新されたため)。

上記の方法に適したビュー ステート ID を分離する方法はありますか? jsf ビュー ステートを、さまざまな Web モジュールからマッシュインされたコンポーネントに分離できるようにする必要があるのはどこですか?

4

1 に答える 1

0

それで、これが私たちがやったことです...

すべての個別の Web モジュールは同じドメインを持っていますが、それぞれに固有のコンテキスト ルート www.bank.com/ waw/accounts /somepage.xhtml または www.bank.com/ waw/transfers /somepage.xhtml があります。これらのコンテキスト ルートを使用して、ビュー ステートを更新する必要があるフォームを絞り込みます。

そのように(この解決策は、マッシュしたいすべての人にはうまくいきませんが、私たちにはうまくいきます)...

var wlf_a4jAjaxProcessResponse = A4J.AJAX.processResponse;

function wlf_ajaxIsolate(req){

wlf_saveViewState(req.form);
wlf_a4jAjaxProcessResponse(req);
wlf_restoreViewState();
}

A4J.AJAX.processResponse = wlf_ajaxIsolate;     


function wlf_saveViewState(form) {

  var action = form.baseURI;

  if (typeof action !== 'undefined') {

        var i1 = action.indexOf("/waw/");
        var i2 = action.indexOf("/", i1+5);
        var currentPwa = action.substring(i1+5, i2);

        jQuery("#javax\\.faces\\.ViewState").each(function() {

              var form = jQuery(this).closest("form");
              var formAction = jQuery(form).attr('action');
              var i3 = formAction.indexOf("/waw/");
              var i4 = formAction.indexOf("/", i3+5);
              var pwa = formAction.substring(i3+5, i4);

              if (pwa !== currentPwa) {
                jQuery(this).attr('id',"_javax.faces.ViewState_");
                jQuery(this).attr('name',"_javax.faces.ViewState_");    
              }
        });
  }
};


function wlf_restoreViewState() {

  jQuery("#_javax\\.faces\\.ViewState_").each(function() {

        jQuery(this).attr('id',"javax.faces.ViewState");
        jQuery(this).attr('name',"javax.faces.ViewState");            
  });
};
于 2011-08-30T19:59:28.643 に答える