我已经使用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>
部分?(保持页面其余部分不变)
谢谢!
您可以通过ajax重新加载内容,但URL将保持不变。如果您能负担得起,可以按如下方式更新代码:
在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 />
(实际上,我更喜欢去掉所有的导航用例,因为它们会使faces-config.xml
文件变得臃肿)。通过这种方式,重定向也可以在结果中指定,如action="create?faces-redirect=true"
。
这只是不更新<title>
。但是,您可以通过简单的JavaScript行来实现。