我正在尝试在PrimeFaces(5.3)上实现一个惰性数据表,但它从不渲染表。问题是惰性模型类上的load()方法永远不会被调用。该表是从String的arrayList构建的,其中每个String [](长度为5)是表中的一行。
查看(相关代码)
<h:form id="formHome">
<p:commandButton process="@this" partialSubmit="true" update="@form"
value="obtener tabla"
actionListener="#{mbParametros.init}"
oncomplete="location.reload();">
</p:commandButton>
<p:dataTable id="parametros"
selection="#{mbParametros.lazy.seleccionados}"
rowKey="#{registro[0]}" value="#{mbParameros.lazy}" var="registro"
paginator="true" lazy="true" rows="15" selectionMode="single "
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
rowsPerPageTemplate="15,30,45" resizableColumns="false"
widgetVar="tabla">
<p:ajax event="page" oncomplete="location.reload();" />
<f:facet name="header">
<h:outputText value="Parametros, Fechas y Etiquetas" />
</f:facet>
<!-- COLUMNA DE CHECKBOXES -->
<p:column selectionMode="multiple" />
<!-- COLUMNA DEL ENTORNO GEOGRAFICO -->
<p:column id="col0" headerText="#{mbParametros.lazy.header}">
<h:outputText value="#{registro[0]}" />
</p:column>
<!-- COLUMNA DEL TIPO DE PARAMETRO -->
<p:column id="col1" headerText="Tipo">
<h:outputText value="#{registro[1]}" />
</p:column>
<!-- COLUMNA DEL NOMBRE DEL PARAMETRO -->
<p:column id="col2" headerText="Parametro">
<h:outputText value="#{registro[2]}" />
</p:column>
<!-- COLUMNA DEL VALOR DEL PARAMETRO -->
<p:column id="col3" headerText="Valor">
<h:outputText value="#{registro[3]}" />
</p:column>
<!-- COLUMNA DE LA DESCRIPCION DEL PARAMETRO -->
<p:column id="col4" headerText="Descripcion">
<h:outputText value="#{registro[4]}" />
</p:column>
</p:dataTable>
</h:form>
控制器(弹簧控制器,弹簧配置有弹簧3.2.16)
@Scope("session")
@Controller("mbParametros")
public class MBParametros implements Serializable {
private static final Logger LOG = LoggerFactory.getLogger(MBParametros.class);
private static final long serialVersionUID = 1L;
@Autowired
private ResourceBundleMessageSource recursos;
private LazyDataModel<String[]> lazy;
public void init() {
LOG.info("ENTRA AL INIT");
this.setLazy(new ModeloLazy(recursos) {
private static final long serialVersionUID = 1L;
});
}
public LazyDataModel<String[]> getLazy() {
return lazy;
}
public void setLazy(LazyDataModel<String[]> lazy) {
this.lazy = lazy;
}
懒惰模型类(仅限相关代码)
public class ModeloLazy extends LazyDataModel<String[]> {
// ArrayList of Strings that represent all table rows
private List<String[]> tabla;
public List<String[]> getTabla() {
return tabla;
}
public void setTabla(List<String[]> tabla) {
this.tabla = tabla;
}
// all other fields, getters, setters, init, etc.....
// constructor
public ModeloLazy(ResourceBundleMessageSource recursos) {
this.recursos = recursos;
this.init();
}
// load never gets called by the framework, so its an error somewhere else
@Override
public List<String[]> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
this.setRowCount(15);
return this.getTabla();
}
// init() calls this method for building the table
// after execution, tabla is not null nor empty.
private void construir(DTOResponse result, DTORequest request) {
List<DTORegistro> registros = bsd.join(result, request); //OK
for (DTORegistro dtoRegistro : registros) {
String tipo;
switch(dtoRegistro.getParametro().getTipo()) {
case 'p':
tipo = "Parametro";
break;
case 'e':
tipo = "Etiqueta";
break;
default:
tipo = "Fecha";
}
String[] reg = {dtoRegistro.getDto().getNombre() + tipo
+ dtoRegistro.getParametro().getValor() + dtoRegistro.getParametro().getDescripcion()};
this.getTabla().add(reg);
}
}
}
答案 0 :(得分:0)
在我的实现类的构造函数中调用LazyDataModel.setRowCount(int rowCount)
之前,我的LazyDataModel实现也不会显示行。
我的<p:dataTable>
加载超过16K行,因此我使用了一个在选择页面时调用load()
的分页符。 load()
根据参数first
和pageSize
获取指定的行,然后调用setRowCount(int rowCount)
,然后在DataTable中显示正确的数据页。