如何使用JSF 2.0 Facelets在XHTML中包含另一个XHTML?

在XHTML页面中包含另一个XHTML页面的最正确的方法是什么? 我一直在尝试不同的方式,没有一个在工作。

<ui:include>

最基本的方式是<ui:include> 。 包含的内容必须放在<ui:composition>里面。

主页面/page.xhtml启动示例:

 <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> <h:head> <title>Include demo</title> </h:head> <h:body> <h1>Master page</h1> <p>Master page blah blah lorem ipsum</p> <ui:include src="/WEB-INF/include.xhtml" /> </h:body> </html> 

包含页面/WEB-INF/include.xhtml (是的,这是整个文件, <ui:composition>之外的任何标签是不必要的,因为它们被Facelets忽略):

 <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> <h2>Include page</h2> <p>Include page blah blah lorem ipsum</p> </ui:composition> 

这需要通过/page.xhtml打开。 请注意,您不需要在include文件中重复<html><h:head><h:body> ,否则将导致HTML无效 。

您可以在<ui:include src>使用dynamicELexpression式。 另请参见如何通过导航菜单ajax刷新dynamic包含内容? (JSF SPA) 。


<ui:define> / <ui:insert>

包含更高级的方式是模板 。 这基本上包括其他方面。 主模板页面应该使用<ui:insert>来声明插入已定义模板内容的位置。 使用主模板页面的模板客户端页面应该使用<ui:define>来定义要插入的模板内容。

主模板页面/WEB-INF/template.xhtml (作为devise提示:页眉,菜单和页脚甚至可以是<ui:include>文件):

 <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> <h:head> <title><ui:insert name="title">Default title</ui:insert></title> </h:head> <h:body> <div id="header">Header</div> <div id="menu">Menu</div> <div id="content"><ui:insert name="content">Default content</ui:insert></div> <div id="footer">Footer</div> </h:body> </html> 

模板客户端页面/page.xhtml (注意template属性;也在这里,这是整个文件):

 <ui:composition template="/WEB-INF/template.xhtml" xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> <ui:define name="title"> New page title here </ui:define> <ui:define name="content"> <h1>New content here</h1> <p>Blah blah</p> </ui:define> </ui:composition> 

这需要通过/page.xhtml打开。 如果没有<ui:define> ,则会显示<ui:insert>的默认内容(如果有的话)。


<ui:param>

您可以通过<ui:param>将parameter passing给<ui:include><ui:composition template> <ui:param>

 <ui:include ...> <ui:param name="foo" value="#{bean.foo}" /> </ui:include> 
 <ui:composition template="..."> <ui:param name="foo" value="#{bean.foo}" /> ... </ui:composition > 

在包含/模板文件中,它将以#{foo} 。 如果您需要将“许多”parameter passing给<ui:include> ,则最好考虑将包含文件注册为<my:tagname foo="#{bean.foo}">文件,以便您最终可以像这样使用<my:tagname foo="#{bean.foo}"> 。 另请参见何时使用<ui:include>,标记文件,复合组件和/或自定义组件?

你甚至可以通过<ui:param>传递整个bean,方法和参数。 另请参见JSF 2:如何将包含要调用的参数的操作传递给Facelets子视图(使用ui:include和ui:param)?


devise提示

只需input/猜测其URL即可公开访问的文件需要放在/WEB-INF文件夹中,就像上面例子中的包含文件和模板文件一样。 另请参阅我需要将哪些XHTML文件放在/ WEB-INF中,哪些不是?

<ui:composition><ui:define>之外不需要任何标记(HTML代码)。 你可以放任何,但Facelets会忽略它们。 把标记放在那里只对网页devise师有用。 另请参见是否有一种方法可以在不构build整个项目的情况下运行JSF页面?

HTML5 doctype是目前推荐的文档types,“尽pipe”它是一个XHTML文件。 您应该将XHTML看作一种允许您使用基于XML的工具生成HTML输出的语言。 另请参见是否可以使用JSF + Facelets与HTML 4/5? 和JavaServer Faces 2.2和HTML5的支持,为什么仍然使用XHTML 。

CSS / JS /图像文件可以被包含为dynamic可重定位/本地化/版本化的资源。 另请参见如何引用Facelets模板中的CSS / JS /图像资源?

您可以将Facelets文件放入可重用的JAR文件中。 另请参见具有共享代码的多个JSF项目的结构 。

有关高级Facelets模板的真实示例,请查看Java EE Kickoff App源代码和OmniFaces展示网站源代码的src/main/webapp文件夹。

包含页面:

 <!-- opening and closing tags of included page --> <ui:composition ...> </ui:composition> 

包括页面:

 <!--the inclusion line in the including page with the content--> <ui:include src="yourFile.xhtml"/> 
  • 你用ui:composition开始你的包含的xhtml文件ui:composition如上图所示。
  • 如上所示,您可以在包含xhtml文件中使用ui:include该文件。