gpt4 book ai didi

jsf-2 - p :Column composite element wont export in p:DataExporter

转载 作者:行者123 更新时间:2023-12-01 10:07:21 27 4
gpt4 key购买 nike

我在尝试导出包含某些列的 DataTable 时遇到问题,DataTable 和 Column 组件都是复合元素,如下所示:

自定义数据表 XHTML (v:dataTable):

<cc:interface>
<cc:attribute name="value" required="true" />
<cc:attribute name="selectionMode" default="multiple" />
<cc:attribute name="selectionBean" />
<cc:attribute name="selectionProperty" />
<cc:facet name="header" />
</cc:interface>

<cc:implementation>

<p:dataTable id="teste" var="tableItem" value="#{cc.attrs.value}"
selection="#{cc.attrs.selectionBean[cc.attrs.selectionProperty]}"
rowKey="#{tableItem.id}" rowsPerPageTemplate="15, 30, 45"
paginator="true" rows="15"
emptyMessage="#{messages['dataTable.emptyMessage']}">

<cc:insertChildren />

<f:facet name="footer">
<p:commandButton value="#{messages['dataTable.exportExcel']}"
ajax="false">
<p:dataExporter type="xls" target="teste" fileName="export" />
</p:commandButton>`enter code here`
</f:facet>

</p:dataTable>

</cc:implementation>

自定义列 XHTML (v:dataColumn):

<cc:interface
componentType="com.example.VDataColumn">
<cc:attribute name="value" />
</cc:interface>

<cc:implementation>
<c:choose>

<c:when test="#{cc.childCount gt 0}">
<cc:insertChildren />
</c:when>
<c:otherwise>
<h:outputText value="#{cc.attrs.value}" />
</c:otherwise>

</c:choose>
</cc:implementation>

Column 组件是 org.primefaces.component.column.Column 类的扩展:

package com.example.component;

import javax.faces.component.FacesComponent;
import javax.faces.component.NamingContainer;
import javax.faces.component.UINamingContainer;

import org.primefaces.component.column.Column;

@FacesComponent("com.example.VDataColumn")
public class VDataColumn extends Column implements NamingContainer {

@Override
public String getFamily() {
return UINamingContainer.COMPONENT_FAMILY;
}

}

DataTable 和 Column 的使用如下:

<v:dataTable
value="#{testController.resultList}"
selectionBean="#{testController}"
selectionProperty="selectedList" selectionMode="multiple">

<p:column value="#{tableItem.id}" headerText="ID" />
<v:dataColumn value="#{tableItem.code}" headerText="Code" />
<v:dataColumn value="#{tableItem.nome}" headerText="Name" />
<v:dataColumn value="#{tableItem.desc}" headerText="Desc" />
</v:dataTable>

当我尝试使用组件内部的 dataExporter 导出 dataTable 时,我在 XLS 文件中只得到一列,而且它只是 p:column。

调试 primefaces DataExporter 类,我注意到 DataTable 对象在 getChildren() 方法中包含 4 个对象,一个 Column 和 3 个 VDataColumn,只有 Column 对象包含子对象本身。

有人遇到同样的问题吗?我正在使用 Primefaces 4.0

最佳答案

我在使用自定义组件时遇到了同样的问题。我们通过扩展导出器并对组件使用自定义验证来解决。

if (component instanceof UINamingContainer) {
UINamingContainer uiNamingContainer = (UINamingContainer) component;
UIComponent panel = uiNamingContainer.getFacet(UIComponent.COMPOSITE_FACET_NAME);
Collection<UIComponent> children = panel.getChildren();
for (UIComponent uiComponent : children) {
if (uiComponent instanceof javax.faces.component.html.HtmlOutputText) {
try {
uiNamingContainer.encodeBegin(context);
return super.exportValue(context, uiComponent);
} catch (IOException e) {
LOGGER.error(e);
} finally {
try {
uiNamingContainer.encodeEnd(context);
} catch (IOException e) {
LOGGER.error(e);
}
}
}
}
}

关于jsf-2 - p :Column composite element wont export in p:DataExporter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20292709/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com