You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ui:insert与ui:composition的JSF Facelets模板无法正常工作

正确使用JSF Facelets模板:ui:insert与ui:composition实践

我来给你梳理下正确使用JSF Facelets模板的方式,结合你给出的代码开头,补全完整示例并解释关键要点:

1. 完整的Facelets模板示例(template.xhtml)

模板里通过ui:insert定义可被替换的内容占位符,同时可以设置默认内容(当引用页面未填充时显示):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <!-- 标题占位符,默认显示"默认标题" -->
        <title><ui:insert name="title">默认标题</ui:insert></title>
        <h:outputStylesheet library="css" name="style.css"/>
    </h:head>
    <h:body>
        <!-- 固定头部 -->
        <div id="header">
            <h1>我的网站</h1>
        </div>
        <!-- 主内容占位符,有默认提示内容 -->
        <div id="main-content">
            <ui:insert name="content">
                <p>请在引用页面中填充主内容</p>
            </ui:insert>
        </div>
        <!-- 固定底部 -->
        <div id="footer">
            <p>© 2024 我的网站 保留所有权利</p>
        </div>
    </h:body>
</html>

2. 引用模板的页面示例(home.xhtml)

引用页面通过ui:composition指定模板路径,再用ui:define对应模板里的name属性来填充内容:

<ui:composition template="/WEB-INF/templates/template.xhtml"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:p="http://primefaces.org/ui">

    <!-- 填充标题占位符 -->
    <ui:define name="title">首页 - 我的网站</ui:define>

    <!-- 填充主内容占位符 -->
    <ui:define name="content">
        <h2>欢迎访问首页</h2>
        <p>这是通过Facelets模板渲染的动态内容区域</p>
        <!-- 可以直接使用PrimeFaces组件 -->
        <p:inputText placeholder="输入内容"/>
        <p:button value="提交" action="#{homeController.handleSubmit}"/>
    </ui:define>

</ui:composition>

关键注意事项

  • 模板路径正确性:建议把模板放在WEB-INF目录下(比如WEB-INF/templates/),这样可以避免直接访问模板文件,引用路径要写全:/WEB-INF/templates/template.xhtml(开头的斜杠对应web应用根目录)
  • 命名空间必须引入:确保模板和引用页面都正确引入了ui命名空间:xmlns:ui="http://java.sun.com/jsf/facelets",否则ui:insert、ui:composition这些标签无法识别
  • ui:composition的作用:引用页面里不需要写完整的<html>、<head>、<body>结构,ui:composition会自动把内部的ui:define内容合并到模板对应的占位符中
  • 默认内容的使用:如果引用页面没有为某个ui:insert定义内容,模板里的默认内容会自动显示,这在通用模板中很实用

内容的提问来源于stack exchange,提问作者Sergio Rodriguez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:46:02