我们有一组互为对等应用程序的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模块,具有不同的服务器端视图状态)。 p>
有没有办法隔离适合上述方式的视图状态ID?我们希望能够将jsf视图状态与来自不同Web模块的mashed-in组件隔离开来吗?
答案 0 :(得分:0)
所以,这就是我们最终做的......
我们所有的离散网络模块都有相同的域名,但每个模块都有一个独特的上下文根www.bank.com/waw/accounts/somepage.xhtml或www.bank.com/ 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");
});
};