0

我们有一组 Web 模块,它们是相互对等的应用程序。我们使用 jQuery 将它们混合在一起。这些不同的模块都使用 JSF。不同的模块可以部署在不同的 Java EE 应用服务器上。

想象一个用于开户的 JSF 页面。该页面可能会使用客户搜索功能来查找要为其开设帐户的客户。带有帐户打开表单的 JSF 页面由一个 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 'gadget' 确实调用 a4j 来执行搜索并返回新的视图状态 ID 时,openForm.xhtml 的视图状态 ID 也会更新。然后当使用 openForm.xhtml 将表单发布到服务器时,视图状态 ID 不同步(因为它们最后由 a4j 调用更新到不同的 Web 模块,该模块具有不同的服务器端视图状态)。

有没有办法隔离适合上述方式的视图状态 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 回答