JSF/a4j mashup -视图状态ID过期



我们有一组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模块的糅合组件隔离?

所以,这就是我们最后做的…

我们所有的离散web模块有相同的域,但每个都有一个唯一的上下文根www.bank.com/waw/accounts/somepage.xhtml,或www.bank.com/waw/transfers/somepage.xhtml。我们使用这些上下文根来确定哪些表单应该更新它们的视图状态。

像这样(这个解决方案并不适用于所有想要捣碎的PPL,但它适用于我们)…

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");            
  });
};

相关内容

  • 没有找到相关文章

最新更新