如何使用jQuery AJAX将一个JSF 2页面注入另一个页面

时间:2011-09-26 22:04:24

标签: ajax jquery jsf-2

我正在使用jQuery的.load函数将一个JSF页面加载到另一个页面。

在加载的JSF页面使用某些AJAX功能之前,这非常有效。发生这种情况时,父JSF页面的AJAX停止工作。实际上,在将两个页面组合在一起之后,其下一个名为AJAX的页面就是继续工作的页面。另一页停止工作。如果我首先使用父页面,则孩子会中断。如果我先使用孩子,父母就会休息。

我做错了吗?我猜测JSF不是为这种行为而设计的,那很好但是我该如何去做我想要的呢?

基本上,我们有一个报告页面。当用户单击指向报告的链接时,我们希望报告动态加载到现有页面中。这样,用户就不会体验页面刷新。这是一个很漂亮的行为,但由于页面破坏,显然不太理想。

我想我可以使用包含outputpanel中每个报表的页面来执行此操作,然后根据支持bean中的值确定哪个报表呈现,但我可以看到很多我希望能够将一个页面“注入”另一个页面(例如,用于动态对话框),并且必须将所有内容保存在一个巨大的模板中。

还有其他人遇到过这类问题吗?你是怎么解决的?

1 个答案:

答案 0 :(得分:3)

请勿使用jQuery.load()。它根本不考虑JSF视图状态,因此所有表单都将无法工作。而是使用<f:ajax>rendered属性。这是一个基本的例子:

<h:form id="list">
    <h:dataTable value="#{bean.reports}" var="report">
        <h:column>#{report.name}</h:column>
        <h:column>
            <h:commandLink value="Edit" action="#{bean.edit(report)}">
                <f:ajax render=":edit" />
            </h:commandLink>
        </h:column>
    </h:dataTable>
</h:form>

<h:form id="edit">
    <h:panelGrid columns="3" rendered="#{not empty bean.report}">
        <h:outputLabel for="name" value="Name" />
        <h:inputText id="name" value="#{bean.report.name}" required="true" />
        <h:message for="name" />

        ...

        <h:panelGroup />
        <h:commandButton value="save" action="#{bean.save}" />
        <h:messages globalOnly="true" layout="table" />
    </h:panelGrid>
</h:form>

如有必要,您可以将内容拆分为<ui:include>