使用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
相关产品推荐
相关产品推荐

