如何为 Primefaces/JSF 创建减少重复代码?

How to create reduce duplicated code for Primefaces/JSF?

我正在做一个 JSF 项目,有很多重复的代码,如下所示:

正如您所见,这两个单元格编辑器几乎相同,只是值不同。但是我还是找不到避免重复的方法。

<p:column headerText="DF" >
    <p:cellEditor>
        <f:facet name="output">
            <h:outputText value="#{payLeg.df}">
                <f:convertNumber pattern="###,##0.00" />
            </h:outputText>
        </f:facet>
        <f:facet name="input">
            <p:inputNumber value="#{payLeg.df}" />
        </f:facet>
    </p:cellEditor>
</p:column>
<p:column headerText="Forward Forward Rate" >
    <p:cellEditor>
        <f:facet name="output">
            <h:outputText value="#{payLeg.fwdfwd}">
                <f:convertNumber pattern="###,##0.00" />
            </h:outputText>
        </f:facet>
        <f:facet name="input">
            <p:inputNumber value="#{payLeg.fwdfwd}" />
        </f:facet>
    </p:cellEditor>
</p:column>

我尝试创建一个像这样的列组合

    <html lang="en"
      xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui"
      xmlns:composite="http://java.sun.com/jsf/composite">
<h:body>
    <composite:interface>
        <composite:attribute name="headerText"/>
        <composite:attribute name="value"/>
    </composite:interface>
    <composite:implementation>
        <p:column headerText="#{cc.attrs.headerText}">
            <p:cellEditor>
                <f:facet name="output">
                    <h:outputText value="#{cc.attrs.value}">
                        <f:convertNumber pattern="###,##0.00" />
                    </h:outputText>
                </f:facet>
                <f:facet name="input">
                    <p:inputNumber value="#{cc.attrs.value}" />
                </f:facet>
            </p:cellEditor>
        </p:column>
    </composite:implementation>
</h:body>
</html>

并像

一样使用它
<components:editableNumberColumn headerText="Year Fraction" value="#{payLeg.yearFrac}" />
            </p:dataTable>

但我猜是因为我将它创建为一个组件。所以 dataTable 不会将其识别为列。所以专栏没有出现。

那么有什么类似的方法可以实现吗?

如果你想使用复合组件,你应该排除 p:column。在下一个实现中它应该可以工作:

<composite:implementation>
    <p:cellEditor>
        <f:facet name="output">
            <h:outputText value="#{cc.attrs.value}">
                <f:convertNumber pattern="###,##0.00" />
            </h:outputText>
        </f:facet>
        <f:facet name="input">
            <p:inputNumber value="#{cc.attrs.value}" />
        </f:facet>
    </p:cellEditor>
</composite:implementation>

这个组件的用法如下:

<p:column>
    <components:editableNumberColumn headerText="Year Fraction" value="#{payLeg.yearFrac}" />
</p:column>

第二种方法是创建名称为 MyNumberColumn.xhtml 的模板(例如),如下所示:

<ui:composition 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"
                xmlns:f="http://java.sun.com/jsf/core">

    <p:column headerText="#{headerText}">
        <p:cellEditor>
            <f:facet name="output">
                <h:outputText value="#{value}">
                    <f:convertNumber pattern="###,##0.00" />
                </h:outputText>
            </f:facet>
            <f:facet name="input">
                <p:inputNumber value="#{value}" />
            </f:facet>
        </p:cellEditor>
    </p:column>

</ui:composition>

并将其包含到数据表中:

<p:dataTable value="#{values..}" var="v" ...>
    <ui:include src="MyNumberColumn.xhtml">
        <ui:param name="headerText" value="Header for first column"/>
        <ui:param name="value" value="#{men.name}"/>
    </ui:include>

    <ui:include src="MyNumberColumn.xhtml">
        <ui:param name="headerText" value="Header for second column"/>
        <ui:param name="value" value="#{men.name}"/>
    </ui:include>
</p:dataTable>