2010-03-30 76 views
2

我有一个父页面parentManagedBean(附加到会话范围)。点击这个父页面上的一个按钮,弹出一个弹出框,其中有一个childManagedBean(附加到请求范围)。JSF以编程方式呈现响应

现在ChildManagedBean通过JSF托管的物业设施持有对parentManaged bean的引用。在这个弹出窗口中,用户选择填充大值对象的某个选项。我使用childManagedBean的托管属性将此大对象的值设置为parentManagedBean

问题是 - 父页面显示一个链接,点击一个弹出窗口,选择弹出窗口,弹出消失并将值设置为parentManaged bean。到目前为止这么好,但新设置的值需要出现在父页面上。这是我卡住的地方。如何以编程方式呈现母版页/呈现页面,当我在子托管bean?有没有办法可以处理父页面并刷新它?

注:我使用的是JSF 1.1

编辑 -

下面的“重新提交-ING形式”从JavaScript,我看到了旧的形式也越来越重新提交其覆盖所有的解决方案后,我改变的价值观。我发现现在是 - 如果我发出一个GET请求,意思就是在子窗口关闭后,如果我进入主窗口并且只需在地址上按回车键(发出GET请求我相信),更新的价值 - 更新的价值回来。 所以这里的重点是 - 如何使用JavaScript发出获取请求,或者是否有通过JSF做到这一点的更好方法?

回答

2

我有一些类似的情况,我用javascript触发了父页面的刷新。

儿童

当用户点击“保存”,在弹出的行动被提交到与POST,其中更新父bean的孩子,然后用一些JavaScript重新显示子页:

window.opener.doRefresh(); 
window.close(); 

这给人的错觉是,当用户点击“保存”时,弹出窗口直接关闭。你可以在你的案例中使用类似的技巧。

家长

function doRefresh() 
{ 
    if(document.forms[0].onsubmit) 
    { 
     document.forms[0].submit(); 
    } 
} 

function openChild() 
{ 
    window.open("path_to_child.jsf","_blank",""); 
    return false; 
} 

如果我记得很清楚,我无法使用location.reload刷新页面。因为reload可能会重新提交一个旧表单,或者因为它发出了JSF不太喜欢的GET请求。所以我提交了形式programmaticaly。这基本上达到了相同的效果。

这个解决方案不是优雅的杰作,但是,它对我很有用:)

+0

小心'document.forms [0]'。因为文档可以有多个表单,所以更喜欢'document.formname'。 – BalusC 2010-03-30 11:26:22

+0

非常感谢您的回复。 我按照您的解释尝试了解决方案。不幸的是,我看到document.forms ['name']。submit()实际上是提交旧表单,所以无论我从子页面更新哪些值并被覆盖。还有其他技术吗? – Shamik 2010-03-30 14:10:31

+0

然后用'window.location.reload'尝试一下,我认为它会发出一个GET请求。否则,您可以尝试使用第二种形式(内部无控制),仅用于刷新。当第二个表单被POST时,没有数据被发送,所以它不应该覆盖更新的数据。但这真的很黑,我甚至不知道它是否有效。 – ewernli 2010-03-30 16:15:24