如何包含多个 xhtml 页面,这些页面将相同的模板扩展为摘要 xhtml 页面,

Posted

技术标签:

【中文标题】如何包含多个 xhtml 页面,这些页面将相同的模板扩展为摘要 xhtml 页面,【英文标题】:how to include multiple xhtml pages, which are extending same template into a summary xhtml page, 【发布时间】:2012-12-12 20:23:47 【问题描述】:

我们如何将多个 xhtml 页面包含到一个摘要页面中。 这里所有的 xhtml 页面都包含相同的模板。

commonTemplate.xhtml

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:ui="http://java.sun.com/jsf/facelets">
<head>
<title> SNS </title>
<meta http-equiv="expires" content="0"/>
<meta http-equiv="pragma" content="no-cache"/>
<meta http-equiv="cache-control" content="no-cache"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="sns.css" type="text/css" />
</head>
<h:body>

    <div id="header">
        <ui:insert name="commonHeader">
            <ui:include src="header.xhtml" />
        </ui:insert>
    </div>
    <div id="content">
        <ui:insert name="commonBodyContent">
            Common Body Content.
        </ui:insert>
    </div>
    <div id="footer">
        <ui:insert name="commonFooter">
            <ui:include src="footer.xhtml" />
        </ui:insert>
    </div>
</h:body>
</html>

updatePersonalDetails.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                template="commonTemplate.xhtml">

    <ui:define name="commonBodyContent">
        .........;
        ..........;
    </ui:define>

</ui:composition>

updatedAddress.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                template="commonTemplate.xhtml">

    <ui:define name="commonBodyContent">
        .........;
        ..........;
    </ui:define>

</ui:composition>   

selectPreferences.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                template="commonTemplate.xhtml">

    <ui:define name="commonBodyContent">
        .........;
        ..........;
    </ui:define>

</ui:composition>

summary.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:ui="http://java.sun.com/jsf/facelets">

    <ui:include src="updatePersonalDetails.xhtml" />
    <ui:include src="updatedAddress.xhtml" />
    <ui:include src="selectPreferences.xhtml" />

</ui:composition>   

无论我在所有 xhtml 页面中拥有什么数据,都应该在摘要页面中显示完全相同的数据。但包括这会导致多个&lt;html&gt; 文档在页面上呈现。

我们如何解决这个问题?

【问题讨论】:

【参考方案1】:

将正文内容移动到另一个模板中,您也可以将 &lt;ui:include&gt; 包含在模板客户端中。

例如updatePersonalDetails.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                template="commonTemplate.xhtml">

    <ui:define name="commonBodyContent">
        <ui:include src="updatePersonalDetails-content.xhtml" />
    </ui:define>

</ui:composition>

(对其他也重复)

这样您就可以在summary.xhtml 中执行此操作:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                template="commonTemplate.xhtml">

    <ui:define name="commonBodyContent">
        <ui:include src="updatePersonalDetails-content.xhtml" />
        <ui:include src="updatedAddress-content.xhtml" />
        <ui:include src="selectPreferences-content.xhtml" />
    </ui:define>

</ui:composition>   

与具体问题无关,请考虑将模板和包含放在/WEB-INF 文件夹中,以防止直接访问它们。另见Which XHTML files do I need to put in /WEB-INF and which not?

【讨论】:

如果updatedAddress.xhtmlselectPreferences.xhtml 等除了commonBodyContent 之外还有更多ui:define:s 会怎样?例如,一个secTitle 字段。有没有办法在updatedAddress-content.xhtml 等中定义它并在updatedAddress.xhtmlsummary.xhtml 中使用它? 我认为这与here 提出的问题相同。

以上是关于如何包含多个 xhtml 页面,这些页面将相同的模板扩展为摘要 xhtml 页面,的主要内容,如果未能解决你的问题,请参考以下文章

我可以在一个xhtml页面中使用多个xhtml页面以及如何访问(引用它们)托管bean类中的那些页面吗? [重复]

试着添加背景图片?

如何创建包含多个URL的WordPress页面?

div css 横向tab 同一菜单中如何跳转页面?

如何将Rails的静态页面打包成ruby gem?

将多个html页面里引进相同的一个头部页面,应该怎么做