2011-08-18 44 views
0

我們有一組彼此同級應用程序的Web模塊。我們使用jQuery將它們混合在一起。這些不同的模塊都使用JSF。不同的模塊可以部署在不同的Java EE應用服務器上。JSF/a4j Mashups - 查看狀態ID已過期

想象一下打開帳戶的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用於將表單發佈到服務器時,視圖狀態標識不同步(因爲它們最後通過a4j調用更新到具有不同服務器側視圖狀態的不同Web模塊進行更新)。

有沒有辦法隔離視圖狀態ID適合上述方式?我們希望能夠將jsf視圖狀態隔離爲來自不同Web模塊的內置組件?

回答

0

所以,這裏就是我們最終做...

我們所有的離散Web模塊具有相同的域名,但每個人都有一個唯一的上下文根www.bank.com/ WAW /佔/SomePage的.xhtml或www.bank.com/ waw /轉帳 /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");    
    }); 
};