我使用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>
部分?(同时保留页面的其余部分)
谢谢!
答案 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行来完成此操作。