如何使用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该文件。