2011-08-18 2 views
0

우리는 서로 피어 응용 프로그램 인 웹 모듈 그룹을 가지고 있습니다. 우리는 jQuery를 사용하여 그것들을 매쉬합니다. 이러한 서로 다른 모듈은 모두 JSF를 사용합니다. 다른 모듈은 다른 Java EE 응용 프로그램 서버에 배포 될 수 있습니다.JSF/a4j 매쉬업 - 뷰 상태 ID 만료

계정을 여는 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 'gadget'이 a4j 호출로 검색을 수행하고 새로운 뷰 상태 ID가 반환 될 때 openForm.xhtml의 뷰 상태 ID도 업데이트됩니다. openForm.xhtml을 사용하여 서버에 양식을 게시하면 뷰 상태 아이디가 동기화되지 않습니다 (서로 다른 서버 측보기 상태를 가진 다른 웹 모듈에 대한 a4j 호출에 의해 마지막으로 업데이트 된 이후).

위에서 설명한 방식으로 적절한보기 상태 ID를 분리 할 수있는 방법이 있습니까? 우리는 다른 웹 모듈에서 jsf 뷰 상태를 mashed-in 구성 요소로 분리 할 수 ​​있기를 원합니까?

답변

0

그래서, 여기에 우리가

우리의 모든 개별 웹 모듈

가 같은 도메인을 가지고 ...하고 결국 무엇이지만, 각각 와우가//somepage 계정 고유의 컨텍스트 루트 www.bank.com/있다 .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");    
    }); 
};