Answers:
<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
。请注意,您不需要重复该操作<html>
,<h:head>
并且<h:body>
可以在包含文件中重复该操作,否则将导致无效的HTML。
您可以在中使用动态EL表达式<ui:include src>
。另请参阅如何通过导航菜单Ajax刷新动态包含内容?(JSF SPA)。
<ui:define>
/<ui:insert>
包含的更高级方法是模板。这基本上包括相反的方式。主模板页面<ui:insert>
应用于声明插入定义的模板内容的位置。使用主模板页面的模板客户端页面<ui:define>
应用于定义要插入的模板内容。
主模板页面/WEB-INF/template.xhtml
(作为设计提示:页眉,菜单和页脚甚至可以是<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: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}
。如果需要将“许多”参数传递给<ui:include>
,则最好考虑将包含文件注册为标记文件,以便最终可以像这样使用它<my:tagname foo="#{bean.foo}">
。另请参见何时使用<ui:include>,标记文件,复合组件和/或自定义组件?
您甚至可以通过传递完整的bean,方法和参数<ui:param>
。另请参见JSF 2:如何将包含要调用的参数的操作传递给Facelets子视图(使用ui:include和ui:param)?
不应仅通过输入/猜测其URL即可公开访问的/WEB-INF
文件需要放置在文件夹中,例如上例中的include文件和template文件。另请参阅我需要将哪些XHTML文件放入/ WEB-INF中,以及哪些不需要?
<ui:composition>
和之外不需要任何标记(HTML代码)<ui:define>
。您可以输入任何内容,但是Facelets 将忽略它们。将标记放入其中仅对Web设计人员有用。另请参见是否可以在不构建整个项目的情况下运行JSF页面?
如今,尽管是XHTML文件,HTML5 doctype是推荐的doctype。您应该将XHTML视为一种语言,它允许您使用基于XML的工具来产生HTML输出。另请参见是否可以将JSF + Facelets与HTML 4/5一起使用?以及JavaServer Faces 2.2和HTML5支持,为什么仍在使用XHTML。
CSS / JS /图像文件可以作为动态可重定位/本地化/版本化的资源包括在内。另请参阅如何在Facelets模板中引用CSS / JS /图像资源?
您可以将Facelets文件放入可重用的JAR文件中。另请参见具有共享代码的多个JSF项目的结构。
有关高级Facelets模板的真实示例,请查看Java EE Kickoff App源代码和OmniFaces展示站点源代码的src/main/webapp
文件夹。
<ui:composition ...>
在facelet内声明<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
,则还必须像在声明doctype一样,否则entity referenced but not declared
在使用HTML实体时会出错。
包含的页面:
<!-- 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:include
如上所示,您可以在包含的xhtml文件中包含该文件。<ui:include src="/yourFile.xhtml"/>
还是<ui:include src="/WEB-INF/yourFile.xhtml"/>