导航时的部分页面更新(PrimeFaces ajax)

时间:2011-04-16 08:33:47

标签: ajax jsf facelets primefaces

我使用facelets模板完成了一个基本的JSF应用程序。我的模板如下:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets">

    <h:head>
        <!-- Links to CSS stylesheets... -->
        <title><ui:insert name="title" /> - FManager</title>
    </h:head>

    <h:body>
        <div id="wrapper">
            <div id="header"> <b>FManager</b> Application </div>

            <div id="content">
                <p:growl id="growl" />
                <ui:insert name="content">
                    Sample content.
                </ui:insert>
            </div>
        </div>

        <div id="footer">Made using JSF and Primefaces</div>
    </h:body>
</html>

然后我有主页(如下所示)导航到第二页。两个页面都使用上面的模板。

<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:p="http://primefaces.prime.com.tr/ui"
                template="./template.xhtml">

    <ui:define name="title">Main page</ui:define>

    <ui:define name="content">
        <h2>Welcome to the <b>FManager</b> application</h2>

        <h:form>
            <p>Click the button below to create the first entry!</p>
            <p:commandButton value="Create entry" action="create" />
        </h:form>
    </ui:define>

</ui:composition>

如果我在faces-config.xml中使用<redirect/>,则会导航,但会重新加载完整页面。我的问题是:

有没有办法从一个页面导航到另一个页面只更新模板的<ui:insert>部分?(同时保留页面的其余部分)

谢谢!

1 个答案:

答案 0 :(得分:4)

您可以按ajax重新加载内容,但网址将保持不变。如果您负担得起,请按以下步骤更新代码:

template.xhtml中,替换

<div id="content">

通过

<h:panelGroup id="content" layout="block">

somepage.xhtml中,替换

<p:commandButton value="Create entry" action="create" />

通过

<p:commandButton value="Create entry" action="create" update=":content" />

最后摆脱<redirect />(实际上,更喜欢get rid所有导航案例,因为它们会使faces-config.xml文件膨胀。顺便说一下,重定向也可以在action="create?faces-redirect=true"中的结果中指定。

这不会更新<title>。但是,您可以使用简单的JavaScript行来完成此操作。