如何在同一Facelets文件内复用代码块?(JSF 2.1+PrimeFaces 10)
在同一Facelets文件中定义复用代码块的实现方案
可以实现,无需创建单独文件,利用JSF 2.1原生的Facelets标签即可完成。以下是两种常用方式:
方式一:使用<ui:composition> + <ui:include>
这种方式通过定义带参数的可复用片段,再引用当前文件并传递参数:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"> <!-- 定义可复用代码块:通过ui:param接收后缀文本 --> <ui:composition id="repeatableSection"> Make your choice #{empty suffix ? '' : ' ' += suffix} </ui:composition> <!-- 第一次引用:无后缀 --> <ui:include src="#{view.viewId}" id="section1"> <ui:param name="suffix" value="" /> </ui:include> <!-- 第二次引用:添加"of cars"后缀 --> <ui:include src="#{view.viewId}" id="section2"> <ui:param name="suffix" value="of cars" /> </ui:include> <!-- 第三次引用:添加"of houses"后缀 --> <ui:include src="#{view.viewId}" id="section3"> <ui:param name="suffix" value="of houses" /> </ui:include> </html>
方式二:使用<ui:composition> + <ui:decorate>
这种方式通过<ui:insert>预留占位,再用<ui:define>填充内容:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"> <!-- 定义可复用代码块:预留additionalText占位符 --> <ui:composition id="repeatableSection"> Make your choice <ui:insert name="additionalText" /> </ui:composition> <!-- 第一次使用:空占位符 --> <ui:decorate template="#{view.viewId}" id="use1"> <ui:define name="additionalText"></ui:define> </ui:decorate> <!-- 第二次使用:填充" of cars" --> <ui:decorate template="#{view.viewId}" id="use2"> <ui:define name="additionalText"> of cars</ui:define> </ui:decorate> <!-- 第三次使用:填充" of houses" --> <ui:decorate template="#{view.viewId}" id="use3"> <ui:define name="additionalText"> of houses</ui:define> </ui:decorate> </html>
说明
<ui:composition>用于封装可复用的代码片段,指定id后可以被精准引用。#{view.viewId}表示当前页面的路径,确保引用的是当前文件内的片段。- 两种方式都支持动态传递内容,满足你示例中复用基础文本并添加不同后缀的需求。
内容的提问来源于stack exchange,提问作者Holden
相关产品推荐
相关产品推荐

