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


218

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

Answers:


423

<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文件夹。


1
嗨Balus,关于:最基本的方法是<ui:include>。包含的内容必须放在<ui:composition>内。我认为所包含的内容可以简单地位于<p> </ p>中,它将起作用。
Koray Tugay,

1
@KorayTugay:是的,这是正确的。ui:composition仅在a)使用模板(请参见上文)或b)将所有内容包装在<html> <body>中才是必需的,以便您可以使用浏览器或HTML编辑器加载文件。
sleske 2014年

嗨,你能帮我解决这个难题吗?我过去三天一直在头。stackoverflow.com/questions/24738079/...
基肖尔·普拉卡什

1
@Odysseus:如果它实际上是一个组合,则不会。
BalusC 2015年

1
Afaik如果仅<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实体时会出错。
ChristophS

24

包含的页面:

<!-- 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文件中包含该文件。

有时仅使用文件名来识别路径还不够。对于那些尝试了上面文件包含的内容的用户,它没有任何作用。您可以尝试在文件名或/ WEB-INF目录之前添加斜杠符号。所以看起来像 <ui:include src="/yourFile.xhtml"/>还是<ui:include src="/WEB-INF/yourFile.xhtml"/>
Lefan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.