JSF / a4j Mashups - просмотр состояния ID истек - PullRequest
0 голосов
/ 18 августа 2011

У нас есть группа веб-модулей, которые являются одноранговыми приложениями друг для друга.Мы смешиваем их вместе, используя jQuery.Все эти разные модули используют JSF.Разные модули могут быть развернуты на разных серверах приложений Java EE.

Представьте себе страницу JSF для открытия учетной записи.Эта страница может использовать функцию поиска клиентов, чтобы найти клиента, для которого должна быть открыта учетная запись.Страница JSF с открытой формой учетной записи обслуживается из одного веб-модуля, а страница поиска клиента - из другого.

...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 для выполнения поиска и ему возвращаются новые идентификаторы состояния просмотра, идентификаторы состояния просмотра openForm.xhtml также обновляются.Когда openForm.xhtml затем используется для отправки формы на сервер, идентификаторы состояния представления не синхронизированы (так как они в последний раз обновлялись посредством вызовов a4j к другому веб-модулю, который имеет другое состояние представления на стороне сервера).

Есть ли способ изолировать идентификатор состояния представления, соответствующий описанному выше способу?где мы хотим иметь возможность изолировать состояние просмотра jsf от компонентов, из которых делают пюре, из разных веб-модулей?

1 Ответ

0 голосов
/ 30 августа 2011

Итак, вот что мы в итоге сделали ...

Все наши дискретные веб-модули имеют один и тот же домен, но каждый из них имеет уникальный контекстный корень WAW / переводы / 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");            
  });
};
...