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

How to include another XHTML in XHTML using JSF 2.0 Facelets?

提问人:Ikthiander 提问时间:1/25/2011 最后编辑:BalusCIkthiander 更新时间:12/28/2016 访问量:290437

问:

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

JSF XHTML 包括 JSF-2 Facelet

评论


答:

25赞 Benchik 1/25/2011 #1

包含的页面:

<!-- 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

评论

0赞 Oleksa O. 12/4/2019
有时,仅使用文件名时标识路径是不够的。对于那些尝试了上面的文件包含但没有奏效的人。您可以尝试在文件名或 /WEB-INF 目录之前添加斜杠符号。所以它看起来像或<ui:include src="/yourFile.xhtml"/><ui:include src="/WEB-INF/yourFile.xhtml"/>
451赞 BalusC 1/25/2011 #2

<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.xhtmltemplate

<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

评论

1赞 Koray Tugay 5/28/2013
嗨,Balus,关于:最基本的方式是<ui:include>。包含的内容必须放在 <ui:composition> 中。我认为包含的内容可以简单地以 <p> </p 格式>它会起作用。
1赞 sleske 1/24/2014
@KorayTugay:是的,没错。ui:composition 只需要 a) 使用模板(见上文),或 b) 将所有内容包装在 <html><body> 中,以便您可以使用浏览器或 HTML 编辑器加载文件。
0赞 Kishor Prakash 7/15/2014
嗨,你能帮我解开这个谜语吗?在过去的 3 天里,我一直在敲头。stackoverflow.com/questions/24738079/......
1赞 BalusC 4/27/2015
@Odysseus:如果它实际上是一个构图,那就不行了。
1赞 ChristophS 7/30/2015
如果只在 facelet 内部声明 Afaik,您也必须声明 doctype,否则在使用 HTML 实体时会出现错误。<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