提问人:Ikthiander 提问时间:1/25/2011 最后编辑:BalusCIkthiander 更新时间:12/28/2016 访问量:290437
如何使用JSF 2.0 Facelets在XHTML中包含另一个XHTML?
How to include another XHTML in XHTML using JSF 2.0 Facelets?
答:
包含的页面:
<!-- 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"/>
- 如上所示,您可以启动包含的 xhtml 文件。
ui:composition
- 如上所示,将该文件包含在包含的 xhtml 文件中。
ui:include
评论
<ui:include src="/yourFile.xhtml"/>
<ui:include src="/WEB-INF/yourFile.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>
包含页面(是的,这是完整的文件,外部的任何标签都是不必要的,因为它们无论如何都会被 Facelets 忽略):/WEB-INF/include.xhtml
<ui:composition>
<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>
这需要通过 打开。请注意,您不需要在包含文件中重复 ,否则会导致 HTML 无效。/page.xhtml
<html>
<h:head>
<h:body>
您可以在 中使用动态 EL 表达式。参见 如何通过导航菜单ajax刷新动态包含内容?(JSF SPA)。<ui:include src>
<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:param> 或通过 ui:param
传递参数。<ui:include>
<ui:composition template>
<ui:include ...>
<ui:param name="foo" value="#{bean.foo}" />
</ui:include>
<ui:composition template="...">
<ui:param name="foo" value="#{bean.foo}" />
...
</ui:composition >
在 include/template 文件中,它将以 .如果您需要将“许多”参数传递给 ,那么您最好考虑将包含文件注册为标签文件,以便您最终可以像这样使用它。另请参阅何时使用 <ui:include>、标记文件、复合组件和/或自定义组件?#{foo}
<ui:include>
<my:tagname foo="#{bean.foo}">
您甚至可以通过 传递整个 bean、方法和参数。另请参阅 JSF 2:如何将包含要调用的参数的操作传递给 Facelets 子视图(使用 ui:include 和 ui:param)?<ui:param>
设计提示
那些不应该通过输入/猜测其 URL 来公开访问的文件需要放在文件夹中,就像上面示例中的包含文件和模板文件一样。另请参阅哪些 XHTML 文件需要放入 /WEB-INF 中,哪些不需要?/WEB-INF
和 之间不需要有任何标记(HTML 代码)。您可以放置任何内容,但它们将被 Facelets 忽略。在那里放置标记只对网页设计师有用。另请参阅 有没有办法在不构建整个项目的情况下运行 JSF 页面?<ui:composition>
<ui:define>
HTML5 文档类型是当今推荐的文档类型,“尽管它”是一个 XHTML 文件。您应该将 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 ...>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
entity referenced but not declared
评论