2012-05-27 35 views
23

它发生在我以前ui:decorate在功能上与ui:include相同,只是您还可以将ui:paramui:define传递到包含的文件。UI之间真正的概念区别是什么:装饰和UI:包括?

我疯了吗?

编辑:虽然其实你可以通过ui:paramui:include文件太多,原来我已经在做了。也许你也可以通过ui:define,我会在这里检查和编辑。

+0

我不确定是否了解您的具体问题。所以我会说,是的,你疯了:) – BalusC

+0

@BalusC我可能确实很疯狂,但我没有提出一个具体的问题,只是一个普遍的原则。我一直在试图弄清楚这两个结构之间存在什么实际差异,我找不到任何结构。可能ui:include不支持ui:define,我在测试时遇到了其他问题。 – EJP

+0

啊,你只是要求概念上的区别? – BalusC

回答

41

<ui:include><ui:decorate>之间的主要区别在于,<ui:decorate>旨在允许用户定义的模板组件的插入,而<ui:include>旨在包括现有的和已预定义的模板。

这确实意味着<ui:decorate>支持<ui:define>用于在其主体中定义用户定义的模板组件,并且可以将其插入到模板中的<ui:insert>位置。

这里的一个-somewhat clumsy-例子来说明,其中它可用于:

/WEB-INF/templates/field.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" 
> 
    <h:outputLabel for="#{id}" value="#{label}" /> 
    <ui:insert name="input" /> 
    <h:message id="#{id}_message" for="#{id}" /> 
</ui:composition> 

/page.xhtml

<h:panelGrid columns="3"> 
    <ui:decorate template="/WEB-INF/templates/field.xhtml"> 
     <ui:param name="label" value="Foo" /> 
     <ui:param name="id" value="foo" /> 
     <ui:define name="input"> 
      <h:inputText id="foo" value="#{bean.foo}" required="true" /> 
     </ui:define> 
    </ui:decorate> 
    <ui:decorate template="/WEB-INF/templates/field.xhtml"> 
     <ui:param name="label" value="Bar" /> 
     <ui:param name="id" value="bar" /> 
     <ui:define name="input"> 
      <h:selectBooleanCheckbox id="bar" value="#{bean.bar}" required="true" /> 
     </ui:define> 
    </ui:decorate> 
    ... 
</h:panelGrid> 

注意,它很好地呈现这些组件中的每个单元面板网格。再次,这个特殊的例子很笨拙,我只是用tag file来代替。仅当它是较大的部分时,例如一个完整的表单,例如它的页眉或页脚应该是可定制的,那么<ui:decorate>本来是合适的。

<ui:decorate>的另一个主要优势是它允许您将模板使用复合组件。另请参阅Is it possible to use template with composite component in JSF 2?

+3

我不明白'用户定义模板组件'和'现有和预定义模板'之间的区别。 – EJP

+0

在给定的'/ page.xhtml'示例中,''是最终用户可以定义可变模板组件的地方。 – BalusC

+0

我明白那部分,我只是不明白你正在绘制的区别。 – EJP

相关问题