如何为 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>
我正在做一个 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>