JSF以编程方式呈现响应

时间:2010-03-30 01:22:16

标签: java jsf

我有一个父页面,其中包含parentManagedBean(附加到会话范围)。单击此父页面上的按钮,会出现一个弹出窗口,其中包含childManagedBean(附加到请求范围)。

现在ChildManagedBean通过JSF的托管属性工具保存对parentManaged bean的引用。在此弹出窗口中,用户选择一些填充大值对象的选项。我使用childManagedBean的托管属性将此大对象的值设置为parentManagedBean的值。

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

注意:我正在使用JSF 1.1

编辑 -

在遵循javascript中“重新提交表单”的解决方案之后,我看到旧表单正在重新提交,它会覆盖我所有已更改的值。

EDIT-- 我现在发现的是 - 如果我发出GET请求,意思是,在子窗口关闭后,如果我转到主窗口再次按下输入地址(发出我认为的GET请求),则更新的值 - 更新的价值回来了。 所以这里的重点是 - 如何使用javascript发出get请求,或者有没有更好的方法通过JSF执行此操作?

1 个答案:

答案 0 :(得分: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表单。这基本上实现了相同的目的。

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